Объявление переменных внутри jQuery на () карте событий? - PullRequest
0 голосов
/ 06 января 2012

Вот маленький пример. Я хочу объявить t как $(this), чтобы использовать его как внутри событий click, так и mouseout.

$('div a').on({
  click: function() {
    t.find('div').show();
  },
  mouseout: function() {
    t.find('div').hide();
  }
});

Ответы [ 3 ]

2 голосов
/ 06 января 2012

В общем случае: нет, вы не можете этого сделать.

Использование карты для создания нескольких обработчиков событий - это просто ярлык, конечный результат - отдельные функции, назначенные каждому событию.Когда происходит одно из событий и выполняется соответствующая функция, jQuery устанавливает this в качестве элемента, для которого было инициировано событие, поэтому невозможно заранее узнать, какой из элементов соответствует селектору $('div a').является правильным.

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

var t = $('div a');
t.on({
  click: function() {
    t.find('div').show();
  },
  mouseout: function() {
    t.find('div').hide();
  }
});

(Конечноэто не работает, если селектор возвращает несколько элементов, потому что тогда t содержит все соответствующие элементы, а не только текущий this на момент события.)

РЕДАКТИРОВАТЬ: потому что поздно ночьюи я чувствую себя глупо, вот способ, которым оригинальная карта из вашего вопроса может быть использована таким образом, что t будет $(this).Понятно, что это нелепо, учитывая всю дополнительную упаковку, необходимую для его работы, но, как я уже сказал, я чувствую себя глупо - ваша карта находится в переменной m:

$('div a').on("click mouseout", (function() {
   var t,
       m = {
            click: function() {
               t.find('div').show();
            },
            mouseout: function() {
               t.find('div').hide();
            }
        };
   return function(e) {
      if (e.type in m){
         t = $(this);
         return m[e.type].call(this, e);
      }
   })();
});
0 голосов
/ 06 января 2012

В этих 2 событиях есть отдельная область видимости, поэтому нет, вы не можете делать то, что просите.

Вы должны были бы определить t в каждом событии, что может показаться бессмысленным, но этоеще хорошая вещь, если вы собираетесь использовать ту же ссылку снова.(Быстрее использовать локальную переменную снова и снова, чем каждый раз использовать $ (this).)

0 голосов
/ 06 января 2012

Почему вы удалили последнее сообщение? Кто-то ответил вам правильно.

t=$('div a');

t.on({
  click: function() {
    t.find('div').show();
  },
  mouseout: function() {
    t.find('div').hide();
  }
});

или

$('div a').on({
  t = $(this);
  click: function() {
    t.find('div').show();
  },
  mouseout: function() {
    t.find('div').hide();
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...