мой плагин jquery имеет неправильную область видимости - PullRequest
0 голосов
/ 18 апреля 2011

Я пытаюсь написать простой плагин enterkeypress, который расширяет событие нажатия клавиши, но срабатывает только тогда, когда нажата клавиша - клавиша ввода:

(function ($) {
  $.fn.enterkeypress = function (fn) {
    return this.keypress(function(event){
      if(event.which == '13'){
        event.preventDefault();
        fn();
        }
    });
  };
})(jQuery);

при тестировании это срабатывает корректнособытие, но ключевое слово this ссылается на окно, а не на элемент.

$(":text").enterkeypress(function(){console.log(this)});

этот код выведет Window в консоли ... Я бы предпочел выводить элемент управления вводом.

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

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

(function ($) {
  $.fn.enterkeypress = function (fn) {
    return this.keypress(function(event){
      if(event.which == '13'){
        event.preventDefault();
        fn.apply(this);
        }
    });
  };
})(jQuery);
0 голосов
/ 18 апреля 2011

Передаваемый параметр обратного вызова fn по-прежнему вызывается с использованием глобальной области видимости - окна. Вы должны использовать либо call, либо применить для выполнения fn с использованием контекста объектов jquery.

Попробуйте это:

 (function ($) {
      $.fn.enterkeypress = function (fn) {
        return this.keypress(function(event){
          if(event.which == '13'){
            event.preventDefault();
           //#####NOTICE THE CHANGE HERE###.
            fn.call(this);
            }
        });
      };
    })(jQuery);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...