2015-01-17 4 views
-1

я использую следующийКак предотвратить функцию, связанную с событием клика при каждом повторе страницы?

jquery 1.11.1 
    jquery.mobile 1.4.3 
    cordova 2.9.0 
    iscroll 5 

вот мой HTML:

<div data-role="page" id="listpageid"> 

<div data-role="header" data-position="fixed"> 
     some radio buttons 
</div> 

    <div id="wrapper"> 
     <div data-role="content" id="scroller"> 
     </div> 
    </div> 

</div> 

у меня есть вызов Ajax, которая получает кучу данных с сервера. я петля через результаты и добавить их в DIV с идентификатором = «скроллер»

$('#scroller').empty(); 

for (var i=0;i<resultsArr.length;i++) 
{ 

    htmlToAppend = ""; 

    htmlToAppend = "<a id=" + i + " >" + resultsArr[i].field + "<br><br></a>"; 

    contentForDisplay = contentForDisplay.concat(htmlToAppend); 

} 

$('#scroller').append(contentForDisplay); 

$('#scroller a').click(function() { 
     alert("you clicked on " + this.id); 
}); 

этот код выполняется всякий раз, когда Ajax вызов заполняет resultsArr

первый раз на странице отображается, и это выполняется это дает меня точно, что я хочу, прокручиваемый список кликаемых ссылок.

Если я оставлю страницу и вернусь назад, все будет работать неправильно.

ДИВ имени скроллер опорожняется и отображается содержимое resultsArr, но нажав на ссылку каждые результаты в 2 предупреждений вместо 1.

если я покинуть страницу и вернуться обратно в 3-й раз, нажав на ссылку дает 3 предупреждения вместо 1.

я попытался предотвращения этого кода

$('#scroller a').click(function() { 
     alert("you clicked on " + this.id); 
}); 

от исполнения на всех, кроме первого отображения страницы, и это делает отображаемые ссылки unclickable на 2-й, 3-й и т.д. страница отображается.

я думал

$('#scroller').empty(); 

удалены/уничтожены содержимое страницы и будет включать в себя функцию, которая увольняют на событие щелчка.

очевидно его нет.

как разрешить перерисовку страницы, но только один раз присоединить функцию к событию клика?

EDIT: ни одно из ваших решений не работало. пока я не удалю iscroll. затем все ваши решения работали. так что ... есть ли у кого-нибудь какие-либо идеи о том, как iscroll накручивает это?

+0

Кажется странным, вы опорожняете контейнер и вставляете новые элементы, а старый обработчик событий не должен работать над этими новыми элементами, поскольку он не делегирован. Вы должны добавить обработчик событий внутри некоторой функции, которая выполняется несколько раз. – adeneo

+0

Вот еще jQuery'ish способ делать вещи -> ** http: //jsfiddle.net/u2ffL7mp/** – adeneo

+0

Я добавлял обработчик событий в подпрограмму, которая выполнялась каждый раз, когда я перестраивал экран. однако после того, как я перешел на делегированное событие, проблема продолжалась - см. мой разговор с Озаном ниже. Я собираюсь попробовать ваше предложение дальше. – user1126515

ответ

0

Использование делегированных событий.

http://learn.jquery.com/events/event-delegation/

$(document).on("click", "#scroller a", function(e){ alert("You clicked " + this.id); }); 

Edit: Другой способ заключается в попытке Несвязанность события, прежде чем подменой их.

$('#scroller a').off("click.myEvent"); 
$('#scroller a').on("click.myEvent", function() { 
    alert("you clicked on " + this.id); 
}); 
+0

Я попытался добавить это в onLoad(). предупреждение отображается один раз для каждого отображения страницы. поэтому, если я покажу страницу 4 раза, нажмите ссылку, тогда я получу 4 предупреждения. Я попытался добавить e.preventDefault() перед предупреждением(), но это не повлияло. – user1126515

+0

Почему вы связываете это несколько раз? Вы должны вызвать это только один раз. Просто запустите этот код один раз на загрузке страницы, и он должен работать. Когда вы добавляете какие-либо элементы, которые соответствуют элементу «#scroller a», они будут связывать функцию с событиями кликов. Другим решением является использование пространств имен событий и разворачивание событий, прежде чем их снова перепроверять. Для этого вы можете увидеть http://api.jquery.com/off/. Но использование делегированных событий намного более элегантно и устойчиво. – Ozan

+0

Я думал, что положить это в onLoad() будет связывать только один раз. я переместил его в onDeviceReady() и получил те же результаты. edit: i проверено, что мои функции onLoad() и onDeviceReady() выполняются только один раз. – user1126515

0

Поместите делегированный обработчик щелчка в обработчик событий pagecreate jQM для страницы #listpageid:

$(document).on("pagecreate", "#listpageid", function(){ 
    $("#scroller").on("click", "a", function(e){ 
     alert("You clicked " + this.id); 
     return false; 
    }); 
}); 

Тогда оставьте свой код AJAX, где (в моем демо-то в pagebeforeshowhandler, который работает каждый раз, когда вы переходите к странице.

Вот рабочая DEMO

Каждый раз, когда вы переходите и со страницы, другое количество полей добавляется в скроллера DIV; однако активен только один обработчик кликов.