Я работаю над простым приложением Jquery Mobile, которое выполняет поиск, представляет результаты, а затем позволяет щелкнуть результат, чтобы перейти на динамическую страницу сведений. На странице сведений есть свернутый список, который использует вызов ajax для получения своего содержимого.
Кажется, что он отлично работает на поверхности, но когда я проверяю его с помощью Firebug, я замечаю, что каждый раз, когда вы переходите на страницу с подробностями и расширяете свертываемый список, ajax срабатывает несколько раз.
Так, например, я делаю поиск, захожу на страницу с подробностями, раскрываю свернутый список, ajax запускается один раз. Я возвращаюсь на страницу результатов, нажимаю на другой результат, перехожу на страницу сведений, раскрываю свернутый список, дважды запускается ajax и т. Д. Каждый раз, когда я раскрываю свернутый список, ajax запускается еще раз ... если я посмотрю на 10 результатов, ajax сработает 10 раз.
Может показаться, что динамические страницы накапливаются в DOM, и каждый раз, когда я нажимаю на свернутый список, он запускает все селекторы, созданные в DOM (по крайней мере, это моя теория).
Как мне убедиться, что мой AJAX срабатывает только один раз, а не несколько раз?
Я использую Jquery Mobile 1.0.1 с Jquery 1.6.4. Я использую php для получения данных.
Вот мой код для страницы поиска:
$('form#searchCompanies').submit(function(event) {
getSearchResultsCompanies();
return false;
});
function getSearchResultsCompanies() {
$.ajax({
type: "POST",
url: baseURL + 'server/searchCompanies.php',
data: $("form#searchCompanies").serialize(),
dataType: 'json',
success: function(results){
$('#companyList li').remove();
for ( var i=0; i < results.length; i++) {
$('#companyList').append('<li><a href="' + baseURL + 'companyDetail.htm?companyid=' + results[i].CompanyId + '" data-uid="' + results[i].CompanyId + '" class="companyDetail">' + results[i].CompanyName + '</a></li>');
}
$('#companyList').listview('refresh');
}
});
return false;
}
$('.companyDetail').live('click', function(event) {
//save companyid so that we can reference it on detail page
var companyid = $(this).attr('data-uid');
localStorage.setItem('thisCompanyId', companyid);
});
Вот код для страницы сведений:
$('#companyDetailPage').live('pageshow', function(event) {
var companyid = localStorage.getItem('thisCompanyId');
$.ajax({
type: "POST",
url: baseURL + 'server/getCompanyDetail.php?companyid=' + companyid,
data: {companyid: companyid},
dataType: 'json',
success: function(company) {
$.each(company, function(index, company) {
$('#companyName').html(company.CompanyName);
//etc...pulls in more data to populate the page
});
}
});
//this is the call that fires multiple times
$('#companyContacts').live('expand', function(event) {
$('#companyContactList li').remove();
$.ajax({
type: "POST",
url: baseURL + 'server/getCompanyContacts.php?companyid=' + companyid,
dataType: 'json',
success: function(results){
for ( var i=0; i < results.length; i++) {
$('#companyContactList').append('<li>' + results[i].LastName + 'etc...more data</li>');
}
$('#companyContactList').listview('refresh');
}
});
return false;
});
});
Заполняемый html div выглядит следующим образом:
<div data-role="collapsible" data-collapsed="true" id="companyContacts" class="cmdCompanyContacts">
<h3>Contacts (<span id="totalContacts"></span>)</h3>
<ul id="companyContactList" data-role="listview"><li></li></ul>
</div>
Я искал разрешение в верхнем и нижнем диапазонах и пытался переработать код под разными углами, но я не смог решить эту проблему. Любая помощь будет высоко ценится. Спасибо.