2011-02-02 7 views
4

Можно ли удалить, чем добавить событие click click к определенному элементу? т.е.JQuery удалить и добавить событие click click

У меня есть $("#elem").click(function{//some behaviour});, $(".elem").click(function{//some behaviour}); (есть более чем один элемент) в то время как моя другая функция getJson выполняет Я хотел бы, чтобы удалить событие щелчка из #elem, и добавить его снова OnSuccess от функции getJson, но все время сохраняйте как мышиные, так и мышиные события?

Или, может быть, создать наложение, чтобы не нажимать, как в модальных окнах? это лучшая идея?

редактировать:

Я видел некоторые действительно хорошие ответы, но есть одна деталь, которую я пропустил не по назначению. Есть более одного элемента, и я вызываю функцию click на className, а не на elementId, как я указал в исходном вопросе

+0

Исходный оператор if внутри обработчика событий может проверить, является ли логическое 'jsonIsLoaded' истинным или нет. Если это так, установите для него значение «false» и продолжайте, иначе вы вызываете 'event.preventDefault()' и возвращаете false. Таким образом, вам не нужно постоянно связывать и развязывать события! –

+0

@afEkenholm niceeee – London

+0

'function' должен сопровождаться набором круглых скобок, опционально получающим событие click в качестве параметра:' function (evt) {...} '. Что касается вашего обновления: должны ли элементы _all_ быть незаметными или просто щелкнуть? –

ответ

6

Вместо того чтобы использовать unbind(), что означает, что вам придется перепривязывают тот же обработчик события позже, вы можете использовать data() объект JQuery в с ajaxStart и ajaxStop событий, чтобы ваши элементы игнорировать click события во всех запросов AJAX:

$(".elem").click(function() { 
    if (!$(this).data("ajaxRequestPending")) { 
     // some behaviour 
    } 
}).ajaxStart(function() { 
    $(this).data("ajaxRequestPending", true); 
}).ajaxStop(function() { 
    $(this).removeData("ajaxRequestPending"); 
}); 

EDIT: Этот ответ также идентификатор к классу доказательство (см редактировать спрашивающий в), так как все соответствующие селектор будет обрабатывать события AJAX - правильный путь. Это основная точка продажи jQuery, и это видно.

+0

@ Frédéric Hamidi, но я не использую функцию ajax, я использую getJson также из jquery, или же он также относится к функции ajax? – London

+0

@London, [$ .getJSON()] (http://api.jquery.com/jQuery.getJSON/) вызывает [$ .ajax()] (http://api.jquery.com/jQuery.ajax/), поэтому он фактически * является * функцией AJAX и запускает 'ajaxStart' и' ajaxStop', как и ожидалось. –

+0

@ Фредерик Хамиди в порядке :) Я попробую.tnx – London

2

Вы ищете .unbind(). Передайте его 'click', и он уничтожит событие click.

Я бы поставил его перед вашим getJSON и перевязал событие click внутри обработчика успеха вашего вызова ajax.

0

Вместо того чтобы отвязывать/связывать событие click, вы можете проверить состояние другой переменной, чтобы увидеть, должно ли оно выполнять действие.

var MyObject = { 
    requestActive = false; 
}; 

function MyJsonFunction() { 
    // when requesting 
    MyObject.requestActive = true; 
    //... 
    // when request over 
    MyObject.requestActive = false; 

} 

$("#elem").click(function{ 
    if (MyObject.requestActive == true) { 
    //do something 
    } 
}); 
Смежные вопросы