Jquery $ (). Каждый метод скрывает ключевое слово this - PullRequest
19 голосов
/ 11 июня 2009

Я создаю объект Javascript, который содержит функцию, которая выполняет метод jQuery each, как показано ниже:

function MyClass {

  Method1 = function(obj) { 
    // Does something here
  }

  Method2 = function() {
    $(".SomeClass").each(function() {

       // 1          2
       this.Method1(this);

    });
  }

}

К какому объекту относится каждый THIS? jQuery ссылается на элемент, возвращенный из итерации each. Тем не менее, я бы хотел This[1] сослаться на содержащий класс ...

Как я могу сослаться на содержащий класс из цикла jQuery?

Ответы [ 4 ]

20 голосов
/ 11 июня 2009

Я думаю, вы могли бы сделать что-то вроде этого:

function MyClass {
     Method1 = function(obj) {
         //do something here
     } 

     Method2 = function () {
          var containingClass = this;
          $(".SomeClass").each(function () {
             containingClass.Method1(this);
           });
        }
    }
}
10 голосов
/ 11 июня 2009

С http://docs.jquery.com/Core/each:

Это означает, что каждый раз, когда переданная функция выполняется (которая один раз для каждого элемента соответствует) это ключевое слово указывает на конкретный Элемент DOM. Обратите внимание, что «это» не указывают на объект jQuery.

Лично я предпочитаю использовать явные параметры. Таким образом, его легче прочитать:

$('#rotfl').each(function(index, domObject)
{
   var jQueryObject = $(domObject);
   // code
});

Чтобы ответить на ваш вопрос: JavaScript имеет динамический статический объем. Вы можете сделать следующее:

var that = this;
$('#rotfl').each(function(index, domObject)
{
   var jQueryObject = $(domObject);
   that.DoSomething();
   // code
});
4 голосов
/ 11 июня 2009

То, что вы видите, не является проблемой с jQuery или его each() методом - это то, что некоторые люди считают ошибкой проектирования в JavaScript - вложенная функция должна «наследовать» контекст предыдущей области видимости, поэтому «this» во вложенной функции должен быть равен «this» в родительской области видимости, если только он не был намеренно вызван из другого контекста (используя apply() или call() ** 1009).

Чтобы обойти это, вам нужно присвоить переменную this перед вложенной функцией, чтобы у вас был другой способ ссылаться на нее.

2 голосов
/ 11 июня 2009

В jQuery 1.3.3 вы сможете вручную устанавливать контекст для обработчиков событий и тому подобное.

jQuery Edge: связать с другим «этим»

Между тем, различные техники здесь (псевдоним "this", использование call / apply) являются обычной практикой. Питер Хиггинс из Додзё также создал плагин jQuery.hitch , который отвечает тем же требованиям.

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