Как показать запросы 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 бар.
ссылка должна быть в истории, поэтому, если я нажму кнопку Назад или вперед, страница должна быть доступна.
обновление страницы тоже должно работать.
некоторые ресурсы:
примеры:
www.facebook.com - боковой панели на странице вашего профиля
www.wbhomes.com.au/ - 100% близко к тому, что я хочу!--11-->
некоторые Учебники:
пожалуйста, помогите мне! Я никогда не находил решения для этого, но я не хочу использовать jquery или любой API или любую библиотеку, я хочу иметь рабочий Javascript/AJAX
и PHP
сценарий.
7 ответов
для демонстрации, связанной с вашим вопросом, достижение этой функциональности на самом деле очень просто - поскольку она вообще не использует AJAX (когда вы начинаете добавлять AJAX в микс, это становится сложнее - объяснено позже). Для достижения этой функциональности вы бы; обновите свои ссылки, чтобы использовать хэши, а затем привязать к событию hashchange. К сожалению, событие hashchange не совместимо с кросс-браузером, хотя, к счастью, доступно много "истории/удаленных плагинов" - наш предпочтительный годы оказались история jQuery, это с открытым исходным кодом, получил большую поддержку и активно развивается :-).
хотя, когда дело доходит до добавления функций 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, упомянутого ранее, обеспечивая приятный элегантный интерфейс высокого уровня, чтобы добавить функциональность AJAX в микс, чтобы позаботиться об этих сложных проблемах за кулисами, поэтому нам не нужно беспокоиться о них. Это также выбранное решение, используемое в последних нескольких коммерческих сайтах, упомянутых ранее.
удачи, и если у вас есть какие-либо дополнительные вопросы, просто напишите комментарий к этому ответу, и я доберусь до него как можно скорее :-)
Update: теперь есть API истории HTML5 (pushState, popState), который осуждает HTML4 hashchange
функциональность. история.js теперь является sucessor для истории jQuery и обеспечивает кросс-браузерную совместимость для API истории HTML5 и дополнительно hashchange
резервные HTML4 браузерах. jQuery Ajaxy будет обновлен для истории.js
Я думаю, что вы можете сделать это очень легко с помощью onHashChange событие, присутствующее в HTML5 или использующее библиотеку JavaScript, которая эмулирует это "хэш" поведение в браузерах, которые не имеют полной поддержки HTML 5. Одной из таких библиотек может быть MooTools onhashchange, но есть и много других тоже.
чем если у вас есть браузер с поддержкой HTML 5 или такая библиотека, которая эмулирует поведение, просто используйте:
window.sethash("#newsection");чтобы перейти на что-то новое из javascript, и / или обратный вызов этого события onHashChange для его перехвата, в зависимости от ваших сценариев использования.
CorMVC JQuery В Рамках делается таким образом, это opensource вы можете копаться в источнике и получить логику из него.
и на самом деле это довольно прямо вперед. Создатель рассказывает это красиво на этом видео ниже.
http://www.bennadel.com/resources/jing/2009-12-21_0933.swf
PS извините, не могу опубликовать вторую ссылку bc я новый пользователь.
Szevasz.. :)
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;
}
это то, что ускользает от большинства новых разработчиков AJAXian. Это, однако, довольно простой вопрос для решения.
первое, что вам понадобится, это ядро jQuery, которое свободно на jquery.com
далее вам понадобится плагин jQuery hash change even от Ben Alman, который вы можете найти здесь:http://benalman.com/projects/jquery-hashchange-plugin/ вам это не понадобится для более новых версий браузеров, поддерживающих событие html5 hashchange, но вы старые версии браузеров. вам не нужно ничего делать, кроме как включить этот скрипт на свою страницу, он обрабатывает все остальное.
теперь для ваших ссылок вам нужно будет построить их в строке запроса таким образом:
<a href="user.php?q=/topic/article" class="dynlnk">Link Text/Image</a>
теперь у вас есть ссылки, которые идут на страницы и могут быть обработаны на php в случае отключения javascript. все, что вам нужно сделать, это использовать super global $_GET и проанализировать строку запроса для обработки содержимого страницы.
теперь в вашем javascript на странице вы нужно будет сделать ваши ссылки триггером hashchange. Вы можете сделать это, заменив ?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 для запуска hashchange в если страница была загружена хэшем для начала, вы просто вызываете функцию триггера windows при загрузке страницы
$(window).trigger( 'hashchange' );
надеюсь, это достаточно ясно, если нет, не стесняйтесь обращаться ко мне, чтобы задать больше вопросов.
использование хэш-ссылок позволяет использовать ссылки bookmarkable/sharable для запуска кода JavaScript вместо перезагрузки страницы. Бен Almans на 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.элемент страницы.цвет=красный
В следующий объект JavaScript:
объект { company=undefined, page= "items", color="red"}
тогда это только вопрос запуска функций show() или hide() jQuery на выбранных вами элементах.
Это может быть преобразовано в не-jQuery JavaScript, но тогда вы потеряете функциональность, которую предоставляет Бен Альман, что имеет решающее значение для портативного решения.
то, что вы хотите, это способ поддержки история на AJAX
Что можно сделать, используя многие уже существующие библиотеки. Я бы рекомендовал прочитать YUI 3 Страница по истории.