Ответ 1
Я решил эту проблему сейчас, я использовал
$(document).ready
в загруженном содержимом ajax вместе с...
<script src="/js/jquery-ui.js"></script>
Поэтому я предполагаю, что он удваивает "живую" функцию!
Большое спасибо за ответы.
Я попытался отменить событие click, но он срабатывает иногда дважды, иногда 5 раз! Теперь немного надоело!
Код от modal.asp
$("input[name=add_associate]").live("click",function(){
var addassociateID = $(this).attr("id")
$.ajax({
type: 'POST',
url: '/data/watchlist_save.asp',
data: {m : 'share_watchlist_add', watchListID : <%=WatchListID%>, a : addassociateID},
async:true,
success: function(data) {
$(".associate_users").load("/data/sub_watch_members.asp?watchListID=<%=WatchListID%>",
{cache:false},function() {
$(".search_note").html(data)
$(this).unbind('click').bind('click',handler);
})
},
error: function(data){
$(".search_note").html(data)
}
});
})
ОБНОВЛЕНИЕ:
В основном я вызываю следующий код в .associate_users
<div id="associate_list">
<div class="associate_record">
<div class="left" style="padding:8px;"><img src="../imgs/nopic-m.png" style="width:30px;height:30px;" class="img_border" /></div>
<div class="left" style="padding-top:15px;">5)Neil Burton</div>
<div class="right" style="padding-top:10px;margin-right:5px;"><input type="button" class="btn-blue" name="add_associate" id="890" value="Add"></div>
<div style="clear:both;"></div>
</div>
<div style="clear:both;"></div>
</div>
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:
Это происходит только тогда, когда я запускаю событие, закрываю модальный диалог, а затем повторно открываю его с помощью другого watchListID
СТРУКТУРА ДАННЫХ:
Я решил эту проблему сейчас, я использовал
$(document).ready
в загруженном содержимом ajax вместе с...
<script src="/js/jquery-ui.js"></script>
Поэтому я предполагаю, что он удваивает "живую" функцию!
Большое спасибо за ответы.
Следите за своими точками с запятой, убедитесь, что вы завершаете каждую команду одним из них, позже сохраните головную боль.
Что касается событий, связанных с live()
, они должны быть несвязаны, вызывая die()
. Он имеет те же параметры, что и unbind()
. Посмотрите документацию.
function ajaxHandler(){
var addassociateID = $(this).attr("id");
var $this = $(this);
$this.die('click');
$.ajax({
type: 'POST',
url: '/data/watchlist_save.asp',
data: {m : 'share_watchlist_add', watchListID : <%=WatchListID%>, a : addassociateID},
async: true,
success: function(data) {
$(".associate_users").load("/data/sub_watch_members.asp?watchListID=<%=WatchListID%>",{cache:false},function(){
$(".search_note").html(data);
$this.bind('click',handler);
});
},
error: function(data){
$(".search_note").html(data);
$this.live('click', ajaxHandler);
}
});
}
$("input[name=add_associate]").live("click", ajaxHandler);
Изменить: Забыл добавить некоторые важные моменты. Вы должны развязать свое прямое событие прямо в обработчике кликов и переустановить его при ошибке, как показано в @stefan.
Также убедитесь, что вы сохранили объект this
в переменной, поскольку он не указывает на ваш элемент DOM в функции обратного вызова ajax. В качестве альтернативы вы можете использовать свойство context
в своем аякс-запросе, проверьте документацию.
Как я вижу, все, что вы хотите сделать, это связать событие один раз и затем умереть. В последних версиях jQuery есть метод .one(), который свяжет событие только один раз.
Пример:
$('#myDiv').one('click', function() {
alert('clicked once...');
});
В следующий раз, когда вы нажмете кнопку, событие не будет срабатывать.
Подробнее в http://api.jquery.com/one/
Это может быть полезно - http://sholsinger.com/archive/2011/08/prevent-jquery-live-handlers-from-firing-multiple-times/
Вы можете решить свою проблему двумя способами:
1) Переместите свой javascript-код в main.asp, вместо modal.asp.
Это мгновенно устранит проблему с двойным огнем. Вам придется немного изменить свой код, чтобы вытащить значение WatchListID из некоторого HTML внутри modal.asp, а не кодировать его напрямую, поскольку вы (поскольку main.asp еще не имеет этого значения.)
2) Сохраняйте свой код javascript там, где он есть, но прекратите использование живых событий.
Используйте простой вызов .click(function() { "вместо".live('click', function() {".
Вы перезагружаете modal.asp каждый раз, когда открывается диалоговое окно, что означает, что ваш javascript запускается каждый раз, когда он загружается. Если вы сохраняете свой javascript-код в modal.asp, тогда live(), вероятно, не подходит.
Сначала вы отключаете успех. Вам нужно отвязать его в обработчике кликов, а затем снова добавить его в onerror.
Я решил это так:
var liveActionRemove = $('#ajax-list-action-remove');
$(liveActionRemove).live('click', function(){
$(liveActionRemove).die('click');
$.ajax({
url: '/someurl',
success: function(data){
}
});
});
Просто позвоните .off()
прямо перед вызовом .on()
.
Это удалит все обработчики событий:
$(element).off().on('click', function() {
// function body
});
Чтобы удалить только зарегистрированные обработчики событий click
$(element).off('click').on('click', function() {
// function body
});
После одного щелчка, когда я нажимаю любой элемент html-элемента последнего клика, если он запущен, Я решаю его, используя ubind событие click ----, используя следующий код...
.$( "selcetor" ) отвязать ('click');