jQuery.live () не работает внутри плагина - PullRequest
3 голосов
/ 20 февраля 2010

Я пишу плагин и мне нужно вживую привязать клик. Плагин работает нормально, когда я делаю обычную привязку клика, но не живую привязку.

Я свел плагин к основам:

(function($) {
  $.fn.liveBindTest = function() {
    return this.each(function() {
      $(this).live('click', function(){
        console.log('live click');
        return false;
      });
      $(this).click(function(){
        console.log('click');
        return false;
      });
    });
  };
})(jQuery);

Когда я вызываю функцию плагина по ссылке, на мою консоль выводится только click.

Что я должен сделать, чтобы live() заработал? Благодаря.

Ответы [ 5 ]

3 голосов
/ 19 октября 2010

это работает без обходных путей вне плагина:

(function ($) {
    $.fn.liveBindTest = function () {
        return this['live']('click', function () {
            console.log('click');
            return false;
        });
    };
})(jQuery);

$('a').liveBindTest();
1 голос
/ 16 апреля 2011

Я нахожу это работает (jQuery 1.5.2):

(function($) {
$.fn.clickTest = function () {
    return this.each(function() {
        $('.clicker').die('click').live('click', function() {
            console.log('clicked');
        });
        $(this).click(function() {
            $('body').append('<a href="#" class="clicker">click here '+$(this).attr('id')+'</a><br> ');

        });
    });
}; }) (jQuery);
1 голос
/ 20 февраля 2010

Обдумав это, я понял, что нет смысла вызывать live для существующего элемента DOM, потому что он уже находится в DOM.

Хитрость заключается в использовании live при вызове плагина:

(function($) {
  $.fn.liveBindTest = function() {
    return this.each(function() {
      $(this).click(function(){
        console.log('click');
        return false;
      });
    });
  };
})(jQuery);
$('a').live('click', function(){ $(this).liveBindTest(); });
1 голос
/ 20 февраля 2010

По какой конкретной причине у вас есть событие 2 click, связанное в один объект? Второе связывание перезапишет связывание live, поэтому live никогда не сработает.

0 голосов
/ 24 марта 2010

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

$(dom_elements).myplugin();

Что делать, если вы добавляете несколько ссылок через jsor ajax на свою страницу? Я не думаю, что повторная привязка, используя ваш

$('a').live('click', function(){ $(this).liveBindTest(); });

будет правильным путем! Это будет работать, но, говоря правду, я не думаю, что это будет "лучшая практика". Реальная проблема заключается в том, что в jQuery 1.4.2 живое делегирование событий ожидает строку ('a.test'), а не объект (this). Может ли это быть ошибкой jQuery 1.4.2?

...