插件函数内的 jQuery $(this)

发布于 2024-12-16 12:38:56 字数 546 浏览 2 评论 0原文

我有这个 jQuery 插件:

$.fn.touchBind = function(func) {
  $(this).live('touchmove', function() {
    $(this).addClass('dragged');
  });

  $(this).live('touchend', function() {
    if ($(this).hasClass('dragged') == false) {
      func();
    }
  });

  return this;
}

并像这样调用它:

$('.the-element').touchBind(function() {
  $(this).hide();
});

我的问题是 $(this).hide() 中的 $(this) 不引用 $('.the-element'),而是 DOMWindow。有什么办法可以让我完成这项工作吗?

I have this jQuery plugin:

$.fn.touchBind = function(func) {
  $(this).live('touchmove', function() {
    $(this).addClass('dragged');
  });

  $(this).live('touchend', function() {
    if ($(this).hasClass('dragged') == false) {
      func();
    }
  });

  return this;
}

and call it like so:

$('.the-element').touchBind(function() {
  $(this).hide();
});

My problem is that $(this) in $(this).hide() doesn't refer to $('.the-element'), but rather DOMWindow. Is there a way I can make this work?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

牛↙奶布丁 2024-12-23 12:38:56

func(); 更改为 func.call(this);$.proxy(func, this)();

您还可以使用 apply() (当 call() 适合时不需要)或 bind() (有限的浏览器支持,$ .proxy() 本质上做同样的事情)。

Change func(); to func.call(this); or $.proxy(func, this)();.

You could also use apply() (not necessary when call() suits) or bind() (limited browser support, $.proxy() does essentially the same thing).

层林尽染 2024-12-23 12:38:56

怎么样:

$('.the-element').touchBind(function() {
  $('.the-element').hide();
});

How about:

$('.the-element').touchBind(function() {
  $('.the-element').hide();
});
魄砕の薆 2024-12-23 12:38:56

@Alex 是正确的,您只需将 func(); 替换为 func.call(this); 就可以了。不过我想指出的是,您在插件中对 jQuery 构造函数进行了 2 次冗余调用:

    $.fn.touchBind = function(func) {

    //this already refers to a jQuery object
      this.live('touchmove', function() {

        //this refers to a DOM element inside here
        $(this).addClass('dragged');
      });

      //this already refers to a jQuery object
      this.live('touchend', function() {

         //this refers to a DOM element inside here
        if ($(this).hasClass('dragged') == false) {
          func.call( this );
        }
      });

      return this;
    }

您可以像这样验证它:

$.fn.whatIsThis = function(){
return "jquery" in this ? "jQuery object" : "Something else";
};

然后:

console.log( $("div").whatIsThis() );
//"jQuery object"

@Alex is correct, all you need is to replace func(); with func.call(this); and it will work. However I'd like to point out that you are making 2 redundant calls to jQuery constructor in your plugin:

    $.fn.touchBind = function(func) {

    //this already refers to a jQuery object
      this.live('touchmove', function() {

        //this refers to a DOM element inside here
        $(this).addClass('dragged');
      });

      //this already refers to a jQuery object
      this.live('touchend', function() {

         //this refers to a DOM element inside here
        if ($(this).hasClass('dragged') == false) {
          func.call( this );
        }
      });

      return this;
    }

You could verify it like this:

$.fn.whatIsThis = function(){
return "jquery" in this ? "jQuery object" : "Something else";
};

And then:

console.log( $("div").whatIsThis() );
//"jQuery object"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文