Повесить .on на this в document

99
15 мая 2021, 10:00

Помогите плиз, не пойму, как мне повесить слушалку на

$(document).on('touchstart') в методе init

где в роли selector выступает this?

Явное указание селектора типа .item - все отлично, с this не пашет.

Есть ли решение какое?

Мой мини плагин

(function($) 
{
// значения по умолчанию
var defaults = 
{ 
    touchduration: 200,
    touch: function(){ alert("Touch"); return false; },
    longtouch: function(){ alert("Long touch"); return false; }
},
timerInterval,
leftTimer,
_this;
var methods = 
{
    init: function(params) 
    {
        var options = $.extend({}, defaults, params),
        init = $(this).data('fctouch');
        if(init) 
        return this;
        else 
        {
            _this = this;
            $(_this).data('options', options);
/* Проблемное место */
            $(document)
            .css({ "-ms-user-select": "none", "-moz-user-select": "none", "-khtml-user-select": "none", "-webkit-user-select": "none" })
            .on('touchstart', _this, function() { touchstart() } )
            .on('touchend', _this, function() { touchend() } );
            return $(this);
        }
    },
// Уничтожить
    destroy: function() 
    {
        $(_this).off().removeData();
    }
};
// Таймер    
function timer(interval) 
{
    interval--;
    leftTimer = interval;
    if(interval >= 0) 
    {
        timerInterval = setTimeout(function() 
        {
            timer(interval);
        });
    } 
    else 
    {
        $(_this).data("options").longtouch();
        touchend();
    }
}
// Тачстарт    
function touchstart() 
{
    timer($(_this).data("options").touchduration);
}
// Тачэнд    
function touchend() 
{
    if(leftTimer >= 100)
    $(_this).data("options").touch();
    clearTimeout(timerInterval);
}
$.fn.fctouch = function(method)
{
    if(methods[method]) 
    {
    // Если запрашиваемый метод существует, мы его вызываем, все параметры, кроме имени метода прийдут в метод, this так же перекочует в метод
        return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
    } 
    else if(typeof method === 'object' || !method) 
    {
        return methods.init.apply(this, arguments);
    } 
    else 
    {
    // Если ничего не получилось
        $.error( 'Метод "' +  method + '" не найден в плагине jQuery.fctouch' );
    }
};
})(jQuery);
Answer 1

Придумал такой костыль, но для меня осталось загадкой, почему бы не $(this).on(...)
Даже если элемент создается динамически, но функция, которая будет включать событие, срабатывает после него - всё будет работать.

var i = 0;
var methods = {
  init: function(params) {
    var options = $.extend({}, defaults, params),
      init = $(this).data('fctouch');
    if (init)
      return this;
    else {
      _this = this;
      var id = this.id;
      if (!id) { // Проверка, если у элемента нет id - добавляем его.
        this.id = 'help-id-bubufication-' + i;
        i++; // пойдет нумерация, чтобы между собой не пересекались.
      }
      $(_this).data('options', options);
      $(document)
        .css({
          "-ms-user-select": "none",
          "-moz-user-select": "none",
          "-khtml-user-select": "none",
          "-webkit-user-select": "none"
        })
        .on('touchstart', '#' + this.id, function() {
          touchstart();
        })
        .on('touchend', '#' + this.id, function() {
          touchend();
        });
      return $(this);
    }
  },
}
READ ALSO
Проблема со стилем и меню

Проблема со стилем и меню

Добавил меню оно у меня какое то корявое, слова не отображаются прямо по центруА слово "О нас" так вообще одна буква "О" только отображается

99
Не загружается img в Flask

Не загружается img в Flask

Не получается загрузить изображение с помощью FlaskВ лучшем случае - выдаёт html с "битой картинкой"

94
Не работает создание объекта из меню

Не работает создание объекта из меню

Пробую создать объект из меню:

91
Не работает шейдер

Не работает шейдер

Написал шейдер который должен делать эффект тумана в дали, но он не работаетВ чём может быть причина?

72