Проблемы с плагином событий jQuery - PullRequest
0 голосов
/ 02 ноября 2011

Исходя из моего предыдущего вопроса, я решил попробовать написать серию плагинов jQuery, имитирующих мобильные события (tap, taphold и т. Д.).

У меня работает концепция, но у меня проблемы с выполнением функций обработчика.Вот как я определяю методы плагина:

(function($) {
    var touch_capable = isTouchCapable();

    var settings = {
        swipe_h_threshold : 30,
        swipe_v_threshold : 50,
        taphold_threshold : 750,
        startevent        : (touch_capable) ? 'touchstart' : 'mousedown',
        endevent          : (touch_capable) ? 'touchend'   : 'mouseup'
    };

    // tap Event:
    $.fn.tap = function(handler) {
        return this.each(function() {

            var $this = $(this);
            var started = false;            

            $this.bind(settings.startevent, function() {
                started = true;
            });

            $this.bind(settings.endevent, function() {              
                if(started)
                {
                    handler();
                }
            });
        });
    };
}) (jQuery);

И затем я могу связать эти «события», используя $('#a_div').tap();.У меня проблема в следующем:

Если я передаю функцию в метод tap(), который работает с элементом, возникает ошибка.Например:

$('#my_div').tap(function() { alert($(this).get()) });

Фактически оповещения [object DOMWindow].Может кто-нибудь указать мне в направлении правильного выполнения функции обработчика?Может ли это быть как-то связано с распространением событий?

1 Ответ

1 голос
/ 02 ноября 2011

Вы можете использовать методы Function.prototype.call и Function.prototype.apply для установки контекста выполнения функции;

$this.bind(settings.endevent, function() {              
    if(started)
    {
        handler.call(this);
    }
});

Это позволяет минироватьинтерфейс bind предоставляет предоставленному обработчику;

$this.bind(settings.endevent, function() {              
    if(started)
    {
        handler.apply(this, arguments);
    }
});

Теперь обработчик получит объект события в качестве своего первого параметра, а this установит элемент, на котором сработало событие.

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