То, что я хочу, должно иметь ссылки, которые изменяют часть страницы и динамический 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% близко к тому, что я хочу
Некоторые учебные руководства:
Пожалуйста, помогите мне! Я никогда не находил решения сделать это, но я не хочу использовать jQuery или любой API или любую библиотеку, я хочу иметь работу Javascript/AJAX
и PHP
сценарий.
Для демонстрации, указанной в вашем вопросе, реализовать эту функциональность на самом деле очень просто - поскольку она вообще не использует AJAX (когда вы начинаете добавлять С AJAX все становится сложнее - объясню позже). Для достижения этой функциональности вам необходимо: обновите свои ссылки, чтобы использовать хеши, а затем привяжите их к событию hashchange. К сожалению, событие hashchange несовместимо с кроссбраузерностью, хотя, к счастью, доступно много "плагинов истории / удаленного доступа" - за прошедшие годы мы предпочли jQuery History , он с открытым исходным кодом, стал отличным поддержка и активно развивается :-).
Хотя, когда дело доходит до добавления функциональности AJAX к таким сайтам, как Facebook, WBHomes и Balupton.com , тогда вы начнете сталкиваться с целым рядом серьезных трудностей. проблемы! (Я знаю, что был ведущим архитектором двух последних сайтов!).Вот некоторые из этих проблем:
Единственным известным мне надежным проектом с открытым исходным кодом, который пытается решить все упомянутые чрезвычайно сложные проблемы, оказался jQuery Ajaxy .По сути, это расширение для упомянутого ранее проекта jQuery History, обеспечивающее красивый элегантный высокоуровневый интерфейс для добавления функциональности AJAX в микс для решения этих сложных проблем «за кулисами», поэтому нам не нужно о них беспокоиться. Это также выбранное решение, используемое на нескольких последних коммерческих сайтах, упомянутых ранее.
Удачи, и если у вас есть дополнительные вопросы, просто оставьте комментарий к этому ответу, и я отвечу на него как можно скорее: -)
Обновление: теперь есть API истории HTML5 (pushState, popState), который не поддерживает функциональность HTML4 hashchange
. History.js теперь является преемником jQuery History и обеспечивает кроссбраузерную совместимость для HTML5 History API и необязательный вариант hashchange
для браузеров HTML4. jQuery Ajaxy будет обновлен до History.js
Севаз ..:)
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;
}
CorMVC Jquery Framework выполняется таким образом, это открытый исходный код, вы можете копаться в исходном коде и извлекать из него логику.
И на самом деле это довольно просто. Создатель прекрасно рассказывает об этом на видео ниже.
http://www.bennadel.com/resources/jing/2009-12-21_0933.swf
PS извините, не могу разместить вторую ссылку, т.к. я новый пользователь.
Я думаю, вы можете сделать это очень легко, используя событие onHashChange , присутствующее в HTML5, или используя библиотеку JavaScript, которая имитирует это «хеш-поведение» в браузерах, не имеющих полной поддержки HTML 5. Одной из таких библиотек может быть MooTools onhashchange , но есть и многие другие.
Если у вас есть браузер, поддерживающий HTML 5, или такая библиотека, которая имитирует поведение, просто используйте:
window.sethash("#newsection");, чтобы изменить что-то новое из javascript, и / или обратный вызов этого события onHashChange для его перехвата, в зависимости от вашего сценарии использования.
Это то, что ускользает от большинства новых разработчиков 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' );
Надеюсь, это достаточно ясно, если нет, не стесняйтесь обращаться ко мне, чтобы задать больше вопросов.
Использование хэш-ссылок позволяет закладкам / ссылкам для совместного использования запускать код 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, но тогда вы потеряете функциональность, предоставляемую Беном Алманом, что имеет решающее значение для переносимого решения.
Что вы хотите, так это способ поддержки истории в AJAX
, который может быть сделан с помощью многих уже существующих библиотек. Я бы рекомендовал прочитать страницу YUI 3 об истории.