привязать это ключевое слово для неанонимных функций - PullRequest
3 голосов
/ 11 февраля 2010

Допустим, у меня есть следующий код

$("p").bind("click", function(){
  alert( $(this).text() );
});

Когда пользователь нажимает <p>, появляется предупреждение. Здесь хорошо то, что я использую ключевое слово "this".

Теперь я хочу избавиться от анонимной функции (используя ее несколько раз в сценарии);

$("p").bind("click", myfunction());
myfunction(){
  alert( $(this).text() );
}

теперь это относится к окну. Как я могу это исправить?

Обновление:

Предлагаемое ответчиком решение, которое действительно работает

$(function(){
    $("p").bind("click", function() { myfunction($(this));});

    function myfunction(elem)
    {
      alert( elem.text() );
    }
});

Это хорошо, но вы заканчиваете создание новой функции каждый раз, когда вызывается эта строка кода, не так ли?

Ответы [ 5 ]

4 голосов
/ 11 февраля 2010

Вы хотите передать оригинальное «this» (контекст) в функцию.

В Javascript это делается с помощью call. Например, см здесь

Поэтому я изменяю ответ Джонатона:

$("p").bind("click", function(){ myFunction.call(this); });

function myfunction(){
  alert($(this).text());
}

Добавлено:

Я посмотрел jquery bind, и Джонатон прав, контекст автоматически устанавливается как исходный элемент, к которому вы добавляете прослушиватель событий.

Я думаю, что реальная проблема в том, что вы неправильно передаете функцию ref.

Попробуйте

$("p").bind("click", myfunction);
var myfunction = function(){
  alert( $(this).text() );
}
3 голосов
/ 11 февраля 2010

Что-то вроде

$(function(){
    $("p").bind("click", function() { myfunction($(this));});

    function myfunction(elem)
    {
      alert( elem.text() );
    }
});

Здесь вы также не удаляете анонимную функцию. Но внутри этого вы можете вызвать другую функцию.

1 голос
/ 11 февраля 2010

Проблема заключалась в том, что ваш обработчик событий вызывал функцию myfunction() вместо передачи ссылки на нее myfunction.Это то, что изменило область, в которой оно выполнялось. Если вы передадите функции параметр, myfunction, «this» должно работать так, как ожидалось.

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

$("p").bind("click", function(evt) {
  // this === evt.target;

  alert($(evt.target).text());
});

Или:

$("p").bind("click", myfunction);

myfunction(evt) {
  alert($(evt.target).text());
}
1 голос
/ 11 февраля 2010

Вы можете сделать это, чтобы получить реальный элемент, который вызвал обработчик.

function myfunc(e)
{
  var _this = e.currentTarget;
  alert( $(_this).text());
}

согласно документации jQuery

event.currentTarget

Описание: Текущий элемент DOM в фазе всплытия событий.

добавлена ​​версия: 1.3

Это свойство всегда будет равно это функции.

1 голос
/ 11 февраля 2010

Я просто думал, зачем тебе это делать?

$("p").bind("click", function(){
  alert( $(this).text() );
});

, когда вы можете добавить больше селекторов, как это:

$("p,div,li,:button").bind("click", function(){
  alert( $(this).text() );
});
...