对象文字jquery事件范围
Object literal jquery event scoping
解决这个作用域问题的最佳方法是什么?
NAMESPACE.myObject = {
foo: 'foo',
init: function() {
$('.myBtn').on('click', this.myMethod);
},
myMethod: function() {
console.log($(this), foo);
}
};
NAMESPACE.myObject.init();
console.log的结果应该是被点击的jQuery对象和myObject的属性foo。我该如何做到这一点?
基本上你不能有一个以上的this
,所以需要围绕它工作。
作为一般规则,创建一个作用域变量(在下面的示例中为THIS
)来保存您希望在任何其他作用域中保留/访问的作用域。
你需要在调用myMethod时保留this
,虽然,在点击处理程序中,所以你不能只传递myMethod
,因为它失去了myObject
实例。
NAMESPACE.myObject = {
this.foo: 'foo',
init: function() {
var THIS = this;
$('.myBtn').on('click', function(){
// "this" here is the button clicked
// "THIS" is still the myObject instance
THIS.myMethod(this);
});
},
myMethod: function(element) {
// "this" here is myObject
// The clicked element was passed as parameter "element" instead
console.log($(element), this.foo);
}
};
NAMESPACE.myObject.init();
我希望我已经把这个解释得够清楚了:)
正如jfriend00指出的那样,你也可以使用bind
来创建一个具有this
作用域的函数调用(非常可爱),但这在IE8或更早的版本上不起作用。
您可以这样使用.bind()
:
NAMESPACE.myObject = {
foo: 'foo',
init: function() {
$('.myBtn').on('click', this.myMethod.bind(this));
},
myMethod: function() {
console.log($(this), foo);
}
};
NAMESPACE.myObject.init();
或者,对于旧版本的IE,因为你已经有了jQuery,你可以使用jQuery的$.proxy()
:
NAMESPACE.myObject = {
foo: 'foo',
init: function() {
$('.myBtn').on('click', $.proxy(this.myMethod, this));
},
myMethod: function() {
console.log($(this), foo);
}
};
NAMESPACE.myObject.init();
当您将this.myMethod
传递给事件侦听器时,它将失去与this
的绑定(正如您已经注意到的),因为事件侦听器不会保存该引用或使用它调用方法。保持绑定的一种方法是使用.bind()
(需要IE9或早期版本的IE的polyfill)。
既然我看到你标记了jQuery,你也可以使用这种方法,我知道它与你在问题中发布的不同,但我仍然是一个选项。
工作示例
var NAMESPACE = NAMESPACE || {};
$(function() {
"use strict"
$.extend(NAMESPACE, true, {
getMyObject: function() {
function myObject() {
var self = this;
self.foo = 'foo';
self.init = function() {
$('.myBtn').click(self.myMethod);
};
self.myMethod = function() {
console.log($(this), self.foo);
};
}
return new myObject();
}
});
var myObject = NAMESPACE.getMyObject();
myObject.init();
})
相关文章:
- firefox中的Javascript事件范围问题
- 是否可以在jQuery事件中更改Angular范围
- 如何在Jasmine/Rect中测试带有范围输入的“onChange”事件
- 为什么我从 JSLint 获得从事件调用的函数的“超出范围”
- $scope之后未更新角度范围$在$broadcast之后的事件上
- Extjs 4,事件处理,范围,自定义组件
- 如何获取整个 JavaScript 范围内上次单击的事件数据
- 如何启用事件单击仅在指定的小时范围内
- 在指令的链接函数中修改事件中的范围变量
- 范围滑块输入事件在 IE 10 中未触发
- 使用带有 AngularJS 的 onclick 事件重置范围
- 事件调用和范围问题
- JavaScript 事件处理程序函数范围控件
- 使用 noUiSlider 通过点击事件创建范围时出错
- 如何为范围滑块创建事件处理程序
- 事件的角度更新范围
- 如何“范围”事件监听器
- Angularjs禁用鼠标范围事件
- 可变范围&事件触发匿名函数
- 使用jQuery UI datepicker验证日期范围:事件顺序