在jQuery on()事件映射中声明变量?

在jQuery on()事件映射中声明变量?,jquery,variables,Jquery,Variables,这里有一个小例子。我想将t声明为$(this),这样我就可以在单击和鼠标出事件中使用它 $('div a').on({ click: function() { t.find('div').show(); }, mouseout: function() { t.find('div').hide(); } }); 你为什么删除上一篇文章? 有人答对了 t=$('div a'); t.on({ click: function() { t.find('di

这里有一个小例子。我想将
t
声明为
$(this)
,这样我就可以在
单击
鼠标出
事件中使用它

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

你为什么删除上一篇文章? 有人答对了

t=$('div a');

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


在一般情况下:不,你不能这样做

使用映射创建多个事件处理程序只是一种快捷方式,最终结果是为每个事件分配单独的函数。当其中一个事件发生并执行相应的函数时,
jQuery将此
设置为触发事件的元素,因此无法提前知道与
$('div a')
选择器匹配的元素中的哪一个是正确的

在知道选择器始终只返回一个元素的特殊情况下,可以执行以下操作:

var t = $('div a');
t.on({
  click: function() {
    t.find('div').show();
  },
  mouseout: function() {
    t.find('div').hide();
  }
});
(当然,如果选择器返回多个元素,则这不起作用,因为
t
包含所有匹配元素,而不仅仅是事件发生时的当前
this
。)

编辑:因为已经很晚了,我觉得自己很傻,这里有一种方法,可以使用你问题中的原始地图,这样
t
将是
$(这个)
。很明显,考虑到要使其工作所需的所有额外包装,这是荒谬的,但正如我所说的,我觉得很愚蠢-您的映射位于变量
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);
      }
   })();
});

在这两个事件中有单独的作用域,所以不,你不能按你的要求去做


您必须在每个事件中定义t,这可能看起来毫无意义,但如果您要再次使用相同的引用,这仍然是一件好事。(反复使用局部变量比每次使用$更快。)

不幸的是,只有在只有一个锚的情况下,这才有效。如果有多个锚点,这将发生故障。您的第二个示例代码段无法工作,您正在对象文本中创建赋值。您的问题是什么?问题是:“有办法吗?”。
$('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);
      }
   })();
});