Как показать, что Ajax запрашивает в URL?

То, что я хочу, должно иметь ссылки, которые изменяют часть страницы и динамический URL для нее, где я могу указать переменные такие как #calendar=10_2010tabview=tab2

Check this for an exact example: ЩЕЛКНИТЕ ЗДЕСЬ ДЛЯ ТОЧНОЙ ДЕМОНСТРАЦИИ

Таким образом, вот формат ссылки, в чем я нуждаюсь:

#calendar=10_2010&tabview=tab2

У меня должны быть переменные в ссылках как calendar и tabview таким образом, я могу изменить несколько вещей на единственной странице без realoading.


Или другой формат такой как на http://www.wbhomes.com.au, это точно, что я хочу, однако первый формат хорош также, но это намного более красиво.

  • http://wbhomes.com.au/#/propertiesforsale/houseandland/quinnsbeach-waterland1

Требования

  • Потребности, к которым получат доступ отовсюду от примера почта, или если я просто пишу в панели URL.

  • Ссылка должна быть в истории, поэтому если, Если я продвигаю спину или передаю кнопку, к странице нужно получить доступ.

  • Обновление страницы должно работать также.


Некоторые обращения за помощью:

Примеры:

Некоторые учебные руководства:


Пожалуйста, помогите мне! Я никогда не находил решения сделать это, но я не хочу использовать jQuery или любой API или любую библиотеку, я хочу иметь работу Javascript/AJAX и PHP сценарий.

31
задан 20 revs, 3 users 100% 18 September 2010 в 10:00
поделиться

7 ответов

Для демонстрации, указанной в вашем вопросе, реализовать эту функциональность на самом деле очень просто - поскольку она вообще не использует AJAX (когда вы начинаете добавлять С AJAX все становится сложнее - объясню позже). Для достижения этой функциональности вам необходимо: обновите свои ссылки, чтобы использовать хеши, а затем привяжите их к событию hashchange. К сожалению, событие hashchange несовместимо с кроссбраузерностью, хотя, к счастью, доступно много "плагинов истории / удаленного доступа" - за прошедшие годы мы предпочли jQuery History , он с открытым исходным кодом, стал отличным поддержка и активно развивается :-).

Хотя, когда дело доходит до добавления функциональности AJAX к таким сайтам, как Facebook, WBHomes и Balupton.com , тогда вы начнете сталкиваться с целым рядом серьезных трудностей. проблемы! (Я знаю, что был ведущим архитектором двух последних сайтов!).Вот некоторые из этих проблем:

  • Как изящно и легко обновить определенные внутренние ссылки для использования функций истории и AJAX и определить, когда хэш изменился? при этом остальные ссылки работают как раньше.
  • Как перенаправить с «www.yoursite.com/myapp/a/b/c» на «www.yoursite.com/myapp/#/a/b/c»? и при этом сохранить удобство для пользователя, чтобы 3 необходимых перенаправления были максимально плавными.
  • Как отправить значения формы и данные с помощью AJAX и обновить хэш? и наоборот, если они не поддерживают Javascript.
  • Как определить, в какой именно области страницы требуется запрос AJAX? Таким образом, подстраницы отображаются с правильной страницей.
  • Как изменить заголовок страницы при изменении состояния AJAX? и другой нестраничный контент.
  • Как выполнять красивые вступительные / конечные эффекты при загрузке и изменении состояния AJAX? таким образом, чтобы пользователь не оставался в темноте.
  • Как обновить информацию для входа на боковой панели, когда мы авторизуемся через AJAX? Очевидно, что мы не хотим, чтобы эта кнопка входа в систему в левом верхнем углу больше была там.
  • Как по-прежнему поддерживать веб-сайт для пользователей, у которых не включен JS? Таким образом, он постепенно ухудшается и по-прежнему индексируется поисковыми системами.

Единственным известным мне надежным проектом с открытым исходным кодом, который пытается решить все упомянутые чрезвычайно сложные проблемы, оказался jQuery Ajaxy .По сути, это расширение для упомянутого ранее проекта jQuery History, обеспечивающее красивый элегантный высокоуровневый интерфейс для добавления функциональности AJAX в микс для решения этих сложных проблем «за кулисами», поэтому нам не нужно о них беспокоиться. Это также выбранное решение, используемое на нескольких последних коммерческих сайтах, упомянутых ранее.

Удачи, и если у вас есть дополнительные вопросы, просто оставьте комментарий к этому ответу, и я отвечу на него как можно скорее: -)

Обновление: теперь есть API истории HTML5 (pushState, popState), который не поддерживает функциональность HTML4 hashchange . History.js теперь является преемником jQuery History и обеспечивает кроссбраузерную совместимость для HTML5 History API и необязательный вариант hashchange для браузеров HTML4. jQuery Ajaxy будет обновлен до History.js

25
ответ дан 27 November 2019 в 22:46
поделиться

Севаз ..:)

HTML

<a href="/bye.php?user=abc&page=messages" 
   onclick="return goToWithAjax(this);">bye</a> 

Javascript

function goToWithAjax(hash) {
  hash = hash.href ? hash.getAttribute("href", 2) : hash;
  ajax( hash, function( response ) {
    document.getElementById("content").innerHTML = response;
  });
  hash = ("#!/" + hash).replace("//","/");
  window.location.hash = hash;
  return false;
}

//////////////////////////////////////////////////////////////////////////////

function getXmlHttpObject() {
    var xmlHttp;
    try {
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

function ajax(url, onSuccess, onError) {
    var xmlHttp = getXmlHttpObject();
    xmlHttp.onreadystatechange = function () {
        if (this.readyState == 4) {
            // onError
            if (this.status != 200) {
                if (typeof onError == 'function') {
                    onError(this.responseText);
                }
            }
            // onSuccess
            else if (typeof onSuccess == 'function') {
                onSuccess(this.responseText);
            }
        }
    };
    xmlHttp.open("GET", url, true);
    xmlHttp.send(null);
    return xmlHttp;
}​
1
ответ дан 27 November 2019 в 22:46
поделиться

CorMVC Jquery Framework выполняется таким образом, это открытый исходный код, вы можете копаться в исходном коде и извлекать из него логику.

И на самом деле это довольно просто. Создатель прекрасно рассказывает об этом на видео ниже.

http://www.bennadel.com/resources/jing/2009-12-21_0933.swf

PS извините, не могу разместить вторую ссылку, т.к. я новый пользователь.

1
ответ дан 27 November 2019 в 22:46
поделиться

Я думаю, вы можете сделать это очень легко, используя событие onHashChange , присутствующее в HTML5, или используя библиотеку JavaScript, которая имитирует это «хеш-поведение» в браузерах, не имеющих полной поддержки HTML 5. Одной из таких библиотек может быть MooTools onhashchange , но есть и многие другие.

Если у вас есть браузер, поддерживающий HTML 5, или такая библиотека, которая имитирует поведение, просто используйте:

window.sethash("#newsection");
, чтобы изменить что-то новое из javascript, и / или обратный вызов этого события onHashChange для его перехвата, в зависимости от вашего сценарии использования.
1
ответ дан 27 November 2019 в 22:46
поделиться

Это то, что ускользает от большинства новых разработчиков AJAXian. Но решить эту проблему довольно просто.

Первое, что вам понадобится, это ядро ​​jQuery, которое можно бесплатно получить на jquery.com

, затем вам понадобится плагин для изменения хэша jQuery, даже от Бена Альмана, который вы можете найти здесь: http: // benalman .com / projects / jquery-hashchange-plugin / Вам это не понадобится для новых версий браузеров, которые поддерживают событие hashchange html5, но вам это понадобится для более старых версий браузеров. Вам не нужно ничего делать, кроме как включить этот скрипт на свою страницу, все остальное он сделает за вас.

теперь для ваших ссылок вам нужно будет построить их в виде строки запроса, например так:

<a href="user.php?q=/topic/article" class="dynlnk">Link Text/Image</a>

теперь у вас есть ссылки, которые ведут на страницы и могут обрабатываться на php в случае, если javascript отключен. все, что вам нужно сделать, это использовать суперглобальный $ _GET и проанализировать строку запроса для обработки содержимого страницы.

Теперь в вашем javascript на странице вам нужно будет заставить ваши ссылки запускать хеш-обмен. Вы можете сделать это, заменив? Q = на такой #.

$(".dynlnk").each(function(){
    $(this).attr("href", $(this).attr("href").replace("?q=", "#"));
});

теперь ваши ссылки будут запускать hashchange, единственное, что осталось сделать, это привязать hashchange к функции, которая что-то делает. Это можно сделать очень просто с помощью jQuery, например:

$(window).bind( 'hashchange', function(e){

    //this splits the part after the hash so you can handle the parts individually.
    //to handle them as one just use location.hash
    pageparts = location.hash.split("/");

});

Теперь просто добавьте любой код, который вы делаете для обработки вашего ajax и содержимого.

теперь вам просто нужен последний бит javascript для запуска хеш-изменения в случае, если страница была загружена с хешем для начала, поэтому вы просто вызываете функцию триггера Windows при загрузке страницы

$(window).trigger( 'hashchange' );

Надеюсь, это достаточно ясно, если нет, не стесняйтесь обращаться ко мне, чтобы задать больше вопросов.

0
ответ дан 27 November 2019 в 22:46
поделиться

Использование хэш-ссылок позволяет закладкам / ссылкам для совместного использования запускать код JavaScript вместо перезагрузки страницы. Бен Алманс. Событие jQuery hashchange позволяет связать обработчик событий с событием hashchange, этот плагин работает со старыми браузерами, которые обычно не поддерживают это. Обработчик событий, связанный с hashchange, может читать хеш-часть URL-адреса и вызывать любую функцию.

// register event handler
function bindHashchange() {

    $(window).bind('hashchange', function(event) {
        event.preventDefault();
        var label = location.hash.substring(1);
        handleLabel(label);
    });

    // trigger event so handler will be run when page is opened first time
    // otherwise handler will only run when clicking on hash links
    $(window).trigger('hashchange');
}

// read and handle hash part of url
function handleLabel(label) {

    if ( label.length > 0 ) {
        // using label from url
        switchPage(label);
    } else {
        // use the default label, if no hash link was present
        switchPage('start');
    }
}

// in this case, load hidden <div>'s into a <div id="content">
function switchPage(label) {
    if ( label == 'start ) {
        $('div#content').html($('div#start'));
    } else if ( label == 'some_other_page' ) {
        // do something else
    }
}

Этот другой обработчик событий может обрабатывать 2 аргумента, разделенных точкой ('.') В одном и том же URL-адресе.

function processHash() {

    var str = location.hash.substring(1);
    var pos = $.inArray('.', str);

    var label = '';
    var arg = '';

    if ( pos > -1 ) {
        label = str.substring(0, pos);
    } else {
        label = str.substring(0);
    }

    if ( pos > 1 ) {
        arg = str.substring(pos+1);
    }

    if ( label.length == 0 ) {
        // the default page to open of label is empty
        loadContent('start');
    } else {
        // load page, and pass an argument
        loadContent(label, arg);
    }
}

Если используются регулярные выражения, можно анализировать любую комбинацию символов.

var registry = {};

// split on character '.'
var args = label.split(/\./g);

for ( i in args ) {
    var arg = args[i];

    // split on character '='
    var temp = arg.split('=');
    var name = temp[0];
    var value = temp[1];

    // store argument in registry
    registry[name] = value;
}
// registry is loaded, ready to run application that depends on arguments

Это преобразует URL:

mysite / # company.page = items.color = red

в следующий объект JavaScript:

Object {company = undefined, page = "items", color = "red"}

Тогда дело только в запуске функций jQuery show () или hide () для выбранных вами элементов.

Его можно преобразовать в JavaScript, отличный от jQuery, но тогда вы потеряете функциональность, предоставляемую Беном Алманом, что имеет решающее значение для переносимого решения.

0
ответ дан 27 November 2019 в 22:46
поделиться

Что вы хотите, так это способ поддержки истории в AJAX, который может быть сделан с помощью многих уже существующих библиотек. Я бы рекомендовал прочитать страницу YUI 3 об истории.

0
ответ дан 27 November 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: