jquery自定义事件 this问题 30

$.fn.longPress=function(fn){vartimeout=undefined;var$temThis=this;//var$(this)=this;f... $.fn.longPress = function(fn) {
var timeout = undefined;
var $temThis = this;
//var $(this) = this;
for(var i = 0;i<$temThis.length;i++){
$temThis[i].addEventListener('touchstart', function(event) {
timeout = setTimeout(fn, 800);
}, false);
$temThis[i].addEventListener('touchend', function(event) {
clearTimeout(timeout);
}, false);
}
return this;
}
$('.common-get-input').longPress(function(){
$(this).hide();//这里的this不能指向我想要的?请问怎么解决?
console.log('changan');
});
这里的this不能指向我想要的?请问怎么解决?
展开
 我来答
vampire_c
推荐于2018-03-28 · TA获得超过735个赞
知道小有建树答主
回答量:315
采纳率:0%
帮助的人:486万
展开全部

两个地方需要说明

  1. $.fn.xxx 中的 this 指向的是 $() 调用时的 jQuery 对象,不用再通过$来封装;

  2. $.fn.longPress 中,如果要调用参数里的 fn,并且正确传递DOM对象的话,需要写成类似以下这样:

$.fn.longPress = function(fn) {
  ...
  this.each(function() {
    fn.apply(this /*, 其它参数 */ );
  });
};

用 apply 方法来替换回调函数fn中的 this 。


具体来说,在setTimeout的时候,可以类似这么调用:

timeout = setTimeout(function() {
  fn.apply($temThis[i]);
}, 800);

这样,在 fn() 中的this就变成当前DOM对象了。

但是,这样写还有一个重要问题,那就是变量 i ,它的值在当前闭包环境中会变成 $temThis.length ,导致代码出错。要正确工作,需要改成这样:

for(var i = 0; i < $temThis.length; i++) {
  (function(target) {
    var timeout;
    target.addEventListener('touchstart', function(event) {
      timeout = setTimeout(function() {
        fn.apply(target);
      }, 800);
    }, false);
    target.addEventListener('touchend', function(event) {
      clearTimeout(timeout);
    }, false);
  })($temThis[i]);
}

这样创建一个闭包,确保$temThis[i]在每个闭包中都是正确的。另外注意那个timeout,由于对象可能有多个,因此每个对象需要一个单独的 timeout 。


使用 jQuery 的方法会简化一些,含义是一样的,如下:

$temThis.each(function() {
    var timeout, target = this;
    this.addEventListener('touchstart', function(event) {
      timeout = setTimeout(function() {
        fn.apply(target);
      }, 800);
    }, false);
    this.addEventListener('touchend', function(event) {
      clearTimeout(timeout);
    }, false);
});
断肠天涯
2015-04-14 · 超过13用户采纳过TA的回答
知道答主
回答量:43
采纳率:0%
帮助的人:12.9万
展开全部
把this 换成你的 要换的ID 名。
譬如说你之前定义了一个 id="xxx" ,那么这里的this 就用xxx代替。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式