jQuery "маркировка" событий - PullRequest
1 голос
/ 07 ноября 2011

Я не уверен, как это описать, но я попробую с некоторым базовым кодом:

<input type="text" id="num" placeholder="eg: 55"/>

Допустим, мы добавим базовый код фильтрации:

$('.num').keyUp(function(){
    this.value = parseInt(this.value);
});

Это то, что делает конечный разработчик.Теперь давайте представим, что он / она также использует систему проверки формы нашего проекта:

// ...
if(el.val()!=parseInt(el.val()))
    showError(el);
// ...

Предположим, что наш showError показывает всплывающую подсказку, только когда пользователь наводит на нее курсор:

function showError (el){
    el.css('border-color', 'red');
    el.mouseOver(function(){
        showErrorTooltip(this);
    });
}

Это прекрасно работает, но что, если ошибка была исправлена?С jQuery вы обычно делаете:

removeError(el);

Эта функция удаляет некоторые CSS-элементы из рассматриваемого элемента, но, что наиболее важно, она также удаляет наше событие mouseOver, подобное тому, которое мы добавили выше:

function removeError(el){
    el.css('border-color': null); // default color
    el.unbind('mouseOver');
}

Это работает хорошо, пока конечный разработчик не должен сделать что-то броское, когда мышь наводит курсор на элемент, с помощью jQuery mouseOver.

Проблема в том, что моя функция removeError очищает оба моисобытие, а также событие разработчика.

Итак, мой последний вопрос: как пометить обратные вызовы событий, чтобы я мог их выборочно удалить?


Есливышеприведенное, кажется, не имеет смысла, это какой-то псевдокод на то, как может выглядеть результат:

Что-то вроде:

var tag_a = $('#a').click(function(){ alert('test1'); });
var tag_b = $('#a').click(function(){ alert('test2'); });
$('#a').unbind(tag_a);
$('#a').click(); // shows test2 only

Ответы [ 3 ]

4 голосов
/ 07 ноября 2011

Механизм, который вы ищете, это пространство имен событий: http://docs.jquery.com/Namespaced_Events

Пример в вашем случае:

el.bind('mouseOver.error', function() { ... })
el.unbind('mouseOver.error') //does not remove other mouse over events
2 голосов
/ 07 ноября 2011

Я бы рекомендовал использовать jQuery namespace events

0 голосов
/ 07 ноября 2011

Вы должны использовать именованную функцию вместо анонимной функции

function showError (el){
  var onMouseOver = function(){
    showErrorTooltip(this);
  });
  el.css('border-color', 'red');
  el.bind('mouseOver', onMouseOver);
}

function removeError(el){
  el.css('border-color': null); // default color
  el.unbind('mouseOver', onMouseOver);
}

Это приведет к откреплению этой функции только от mouseOver.Единственная проблема заключается в том, что функция onMouseOver должна просматриваться с помощью removeError, поскольку вы не показываете весь код, я не могу вам сказать, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...