【问题标题】:Javascript closure scoping issueJavascript关闭范围问题
【发布时间】:2010-11-05 23:45:01
【问题描述】:

我正在尝试获取对单元格的引用,但它显示为空。如果我理解正确,我应该能够引用该变量。对吗?

$('td[someAttr]').mouseenter(function(cell) {
    var timeoutId = setTimeout(function() {
        // what should variable cell be? 
    }, 1000);
});

或

$('td[someAttr]').mouseenter(function(cell) {
    var timeoutId = setTimeout(function() {
        // what should variable cell be? 
    }, 1000, cell);
});

更新:这很明显,但我问这个的原因是因为如果你有 cell.pageX 将是未定义的:

$('td[someAttr]').mouseenter(function() {
    var cell = this; //
    var timeoutId = setTimeout(function() {
        alert(cell.pageX); // cell.pageX will return null 
    }, 1000);
});

但是,如果你有:

$('td[someAttr]').mouseenter(function(cell) {
    alert(cell.pageX); // works fine as cell.pageX will have correct value.
});

【问题讨论】:

    标签: javascript jquery scoping


    【解决方案1】:

    事件处理程序的上下文设置为触发事件的元素。你可以这样处理:

    $('td[someAttr]').mouseenter(function() {
        var cell = this;
        var timeoutId = setTimeout(function() {
            alert(cell.tagName);
        }, 1000);
    });
    

    您可能还想将其包装为 jQuery 对象:var cell = $(this);

    更新:第一个参数是事件对象,而不是元素。该元素被设置为回调的上下文(即 this),您可以完全按照您在示例中的方式访问事件对象:

    $('td[someAttr]').mouseenter(function(event) {
        var cell = this;
        var timeoutId = setTimeout(function() {
            alert(cell.tagName + ' ' + event.pageX);
        }, 1000);
    });
    

    请注意,“cell”元素也可以作为“event.target”访问。

    【讨论】:

    • 这很明显,但我问这个的原因是因为 cell.pageX 是未定义的,我会发布一个更新并告诉你我的意思。
    猜你喜欢
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多