0

我试图在 jQuery.on() 中使用 jQuery.proxy() 方法更进一步,但由于涉及多个“this”的范围,我被困在一个点上。

这是使用 jQuery.proxy() 的经典方式:

var obj = {
  somevar: 'some value',
  doSomething: function() {
    alert(this.somevar);
  }
};
$('div').click( $.proxy(obj.doSomething, obj) ); // -> 'some value'

好的,很好,但是...我想从“div”获取一些信息以将其发送到“doSomething”...

function Foo(element) {
  this.element = element;
  this.init();
}
Foo.prototype = {
  init: function () {
    this.element.on('click', 'button', $.proxy(function () {
      // trying to send the type of the button to the doSomething method
      this.doSomething( $(this).attr('type') );
    }, this));
  },
  doSomething: function (data) {
    alert(data); // -> 'undefined'
  }
};

var Bar = new Foo( $('div') );

当然它不起作用,因为'$(this)'中的'this'不是jQuery按钮对象......我找到的唯一解决方案是修改一点'init'方法:

  init: function () {
    var that = this;
    this.element.on('click', 'button', function () {
      that.doSomething( $(this).attr('type') );
    });
  },

有没有办法使用 $.proxy() 方法而不是这个“那个”变量?

4

1 回答 1

1

如果你将一个不同的绑定this到事件处理程序,自然你不能使用this来引用事件发生的元素。相反,您的选择是接受传递给处理程序的事件参数(例如e,)。e.targete.currentTargetthis$.proxy

例如,考虑:

<div id="foo"><span>Click here</span></div>

$("#foo").on("click", $.proxy(function(e) {
    // code here
}, someObject));

如果您单击span上面的(文本Click here),那么截至code heree.target是跨度(事件实际起源的地方),e.currentTargetdiv(您挂钩事件的地方),当然thissomeObject

实例| 来源

于 2013-10-28T22:29:16.517 回答