2014-01-15 5 views
0

Я попал в ситуацию, когда часть содержимого страницы частично загружается в ajax и добавляет один скомпилированный js, включая jquery_ujs, который затем повторяет все события ujs, например, когда вы нажимаете на delete вы получаете подтверждение, его повторение.избежать повторения привязки событий jquery

Следовательно, вы хотели знать, как избежать повторения привязки события любым трюком и не обеспечивать, чтобы js не перезагружался в целом. Или есть какой-либо флаг или элемент управления в ujs, я не нашел его, мы могли бы достичь этого, поэтому перезагружаем ujs в любое время, но привязываем событие только один раз.

hmm ... Почему привязка события не является идемпотентной?

Есть ли какие-либо решения, кроме сохранения таких js-файлов и обеспечения их загрузки только один раз?

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

+0

Вы упомянули свое лучшее решение, не загружайте файлы js обратно в документ. Почему вы возвращаете это в своем вызове AJAX, я предполагаю, что конечная точка - это то, что вы создали? – jammykam

+0

правильно, я создал конечную точку. Некоторые из моих страниц требуют, чтобы js, мало кто. Я мог бы контролировать разделение импортированных js-записей. –

+0

Они требуют, чтобы он был возвращен в AJAX-вызов? – jammykam

ответ

0

Что-то вроде этого?

$(selector).on('click',function(){ 
    //do stuff here 
    $(this).off('click'); 
}); 

Или вы можете использовать что-то вроде этого:

var clicked = false; 
$(selector).on('click',function(){ 
    if(!clicked){ 
    clicked = true; 
    //do stuff here 

    .....somefunc(){ 
    clicked = false; 
    } 
    ... 
    } 
}); 
+0

Если на селекторе было настроено событие клика, не было бы это добавить еще один, так что оба может быть уволен, тогда событие off навсегда избавится от обоих событий, а не оставит одну привязку? –

+0

Как говорит OP: когда вы нажимаете на delete, вы получаете подтверждение, его повторение. –

+0

Да, это был момент, который я пытался выразить. Я думаю, что оригинал плюс ваше новое событие могли бы сжечь, если, скажем, оригинальные пожары. (То, что OP пытался избежать.) Затем в последней строке вашего нового события оба события отключены, а не оставляют только одну включенную, я думаю.Извините, если я не был ясно из моего первоначального комментария. –

1

Хотя вы должны использовать более чистый метод, иногда, когда вы работаете на чужом коде и просто нужно быстро исправить, чтобы обеспечить событие не установлен более чем один раз (с туманным кодом), то я сделал это:

$(someSelector).off('click').on('click', function(event) 
{ 
    // whatever 
}); 
+0

Пункт 1: да, это хороший подход. Надеюсь, что большинство из нас придерживаются того же –

+0

пункта 2: почему у jquery нет аналогичного подхода в построении –

+0

пункт 3: как мы будем искать файлы сторонних js, не принадлежащие нам –

0

Существует что-то известное как Самостоятельные * -Defining функций * в Java скрипт. Этот шаблон полезен, когда ваша функция выполняет некоторую начальную подготовительную работу, и это нужно сделать только один раз. В этом случае самоопределяющаяся функция может обновлять свою собственную реализацию.

Для например

var shout= function(){ 
    alert('shout!'); 
    shout= function(){ 
      alert('shout again'); 
    } 
} 

//using self-defining function 
shout(); // shout! 
shout(); // shout again! 

Надеется, что это будет полезно для вас.

0

Если вы найдете мусор в доме, вы его очистите или украсите?

Это ваша обязанность, чтобы не загружать ненужные js. Так же просто.

+1

Ищу красивую служанку, которая сделает это для меня –

Смежные вопросы