Прежде чем я наткнусь на ссылки на руководства, я исследовал это в течение достаточно долгого времени и постоянно заходил в тупик. Даже не уверен, как правильно его отлаживать. Поэтому, если цитируются какие-либо ссылки, пожалуйста, убедитесь, что они хорошо прокомментированы и содержат инструкции. Это связано с тем, что я являюсь разработчиком PHP/mySQL, и эталонная модель объектов JavaScript меня немного сбивает с толку (но я определенно стараюсь учиться! :)).
Я пытаюсь обновить свои знания о jQuery, используя jQuery v1.7.2. Очевидно, живое событие устарело и было заменено на .on(). Документы jQuery говорят, что не следует смешивать старые события «щелчок» или «живые» с любыми скриптами, использующими .on().
Пытаясь привыкнуть к использованию on, я пытаюсь получить хэш данного URL-адреса.
Страница выглядит следующим образом (заголовок уже загрузил jquery.min.1.7.2.js):
<div id='menuHolder' style="position:relative; margin-left:50px;margin-bottom:30px; padding-top:35px; min-width:600px;z-index:998;">
<ul id="menu">
<li><a href="#">Events</a>
<ul id="events">
<li>
<img class="corner_inset_left" alt="" src="images/menu/corner_inset_left.png"/>
<a id="linker21 menu" class="test AJAXcaller" href="index.php#?p=1&d=AJAXcontent&i=1&k=<?=$_SESSION['authcpanel']['key']?>" rel="nofollow">Upcoming Events</a>
<img class="corner_inset_right" alt="" src="images/menu/corner_inset_right.png"/>
</li>
<li><a href="#">List All Events</a></li>
<li><a id="linkermenu" class="test AJAXcaller" href="index.php#?p=24&d=AJAXcontent&i=1&k=<?=$_SESSION['authcpanel']['key']?>" rel="nofollow">Add Events</a></li>
<li class="last">
<img class="corner_left" alt="" src="images/menu/corner_left.png"/>
<img class="middle" alt="" src="images/menu/dot.gif"/>
<img class="corner_right" alt="" src="images/menu/corner_right.png"/>
</li>
</ul>
</li>
</ul>
</div>
<script>
$(document).on("click", "a.AJAXcaller", function(){
alert("Goodbye!");
alert($(this).attr("hash"));
});
</script>
Первое оповещение срабатывает при нажатии на ссылку «Добавить события» (с хэшем), ретранслирует «До свидания! ', то второй обработчик срабатывает и передает 'undefined'. Как мне получить доступ к этому хешу?
Мой старый код выглядит следующим образом, и он работает, но к любым страницам, вызываемым ajax, не будут прикреплены обработчики событий, поэтому я использую событие .on(). Кроме того, если на этот раз я собираюсь научиться делать это ПРАВИЛЬНО ;), я не хочу, чтобы использовались устаревшие функции...
СТАРЫЙ КОД (работает)
var linkClickAction = {
'a.AJAXcaller' : function(element){
element.onclick = function(){
var locationString = $(this).attr("hash");
locationString = locationString.replace(/.*\#(.*)/, "$1")
var parameterString = locationString.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');
var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');
var parameterList = new Array();
for (j = 0; j < parameterTokens.length; j++) {
var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j
var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1
parameterList[parameterName] = parameterValue;
}
var page = parameterList['p'];
var key = parameterList['k'];
var includesDir = parameterList['i'];
var changeDiv = parameterList['d'];
sndReq(page,key,includesDir,changeDiv,parameterString);
return false;
}
}
};
Behaviour.register(linkClickAction);
Также было поведение.js, который в основном обрабатывал слушателя. В то время я вообще не использовал jQuery. Это было приятно и БЫСТРО (крошечные файлы .js, без постороннего кода), сравнительно говоря, но я достиг своего предела возможности написать эффективный JavaScript, когда дело дошло до обработки причудливых вещей в моем пользовательском интерфейсе. Поэтому я все равно должен загрузить скрипт jQuery при загрузке страницы. Видя, как он уже загружен, я пытаюсь использовать его функции вместо добавления дополнительных ненужных скриптов для загрузки моей страницы. Таким образом, я хочу найти результат, который использует собственные функции jQuery 1.7.2 для достижения этой цели.
РЕЗУЛЬТАТЫ
Оказывается, jQuery 1.6+ может давать сбои при использовании .attr() для поиска свойства объекта DOM. Поэтому использование .prop() было правильным решением. Исправленный код выглядит следующим образом:
/*
Page: rating.js
Created: Aug 2006
Last Mod: May 30, 2012
Modder: Darren Maurer
*/
function sndReq(page,key,includesDir,changeDiv,parameterString) {
var divToChange = document.getElementById(changeDiv); // the Div that the data will be put into
// switch Div with a loading div
divToChange.innerHTML = '<div class="loading"><img src="images/loading.gif" title="Saskatoon.CityGuru.ca - Loading Page" alt="Saskatoon.CityGuru.ca - Loading Page" border="0"/></div>';
if (includesDir == 1){
//Find Current Working Directory. Use to find path to call other files from
/*var myloc = window.location.href;
var locarray = myloc.split("/");
delete locarray[(locarray.length-1)];
var arraytext = locarray.join("/");
*/
$.ajax({
type: "POST",
url: "AJAXCaller.php",
data: parameterString,
success: function(msg){
$('#'+changeDiv).html(msg);
}
});
}
}
/* =======END AJAX FUNCTIONS================= */
/* =======BEGIN CLICK LISTENER FUNCTIONS================= */
/* Listens to any a href link that has a class containing ' AJAXcaller' */
/* ie. <a id="link1" class="test AJAXcaller" href="index.php#http://233.help?id=22&think=33" rel="nofollow">> AJAX TEST LINK <</a> */
$(document).on("click", "a.AJAXcaller", function(){
alert($(this).prop("hash"));
var locationString = $(this).prop("hash");
locationString = locationString.replace(/.*\#(.*)/, "$1")
var parameterString = locationString.replace(/.*\?(.*)/, "$1"); // onclick="sndReq('j=1&q=2&t=127.0.0.1&c=5');
var parameterTokens = parameterString.split("&"); // onclick="sndReq('j=1,q=2,t=127.0.0.1,c=5');
var parameterList = new Array();
for (j = 0; j < parameterTokens.length; j++) {
var parameterName = parameterTokens[j].replace(/(.*)=.*/, "$1"); // j
var parameterValue = parameterTokens[j].replace(/.*=(.*)/, "$1"); // 1
parameterList[parameterName] = parameterValue;
}
var page = parameterList['p'];
var key = parameterList['k'];
var includesDir = parameterList['i'];
var changeDiv = parameterList['d'];
sndReq(page,key,includesDir,changeDiv,parameterString);
return false;
});
надеюсь, что это кому-то поможет, для меня это определенно было спасением!