在事件触发器上被jQuery'parent'范围混淆

时间:2013-02-27 13:22:40

标签: jquery scope interaction

当用户点击链接时,我正在尝试检查该链接的容器是否分配了active类。

但我认为我在确定范围方面存在问题,因为当浏览器应用视觉样式时,点击在触发时没有看到该类别。

我创建了一个jsfiddle replicating the problem。非常赞赏启蒙运动。

5 个答案:

答案 0 :(得分:0)

$link超出了处理程序中的annoynmous函数的范围。您需要在点击处理程序中使用$(this)

$links.each( function(i) {
    $link = $(this);
    $link.click( function(e) {
        e.preventDefault();
        console.log('L' + i + ': ' + $(this).parent().hasClass('active'));
    });
});

请参阅updated jsFiddle


如果必须在不使用$(this)的情况下解决此问题,您还可以使用事件数据作为闭包,例如:

$links.each( function(i) {
    $link = $(this);
    $link.click({ link : $link }, function(e) {
        e.preventDefault();
        //console.log('L' + i + ': ' + $(this).parent().hasClass('active'));
        e.data.link.parent();
    });
});

答案 1 :(得分:0)

或者您可以使用on

$controls.on("click", "a", function(e) {
    e.preventDefault();
    var theParent = $(this).parent();
    //if you need 'i' here it is
    var i = $.inArray(theParent[0], $controls);
    console.log('L' + i + ': ' + theParent.hasClass('active'));
});

http://jsfiddle.net/F69nh/6/

答案 2 :(得分:0)

一种解决方案可能是使用var关键字来缩小变量的范围:

$links.each(function () {
    var $link = $(this);
    ...
});

全球范围演示:

var a = 1;
function f(v) { a = v; };
console.log(a); // 1
f(2);
console.log(a); // 2

本地范围演示:

var a = 1;
function f(v) { var a = v; };
console.log(a); // 1
f(2);
console.log(a); // 1

选中great post about javascript scoping

答案 3 :(得分:0)

简化您的JavaScript:

var $controls = $('#controls li');
var $links = $('a', $controls);
var $control, $link;

$controls.each( function(i) {
    $control = $(this);
    if (i == 0) {
        $control.addClass('active');
    }
    console.log('C' + i + ': ' + $control.hasClass('active'));
});

$links.click(function(e) {
    e.preventDefault();
    console.log('L' + $(this).index() + ': ' + $(this).parent().hasClass('active'));
});

答案 4 :(得分:-1)

这是另一种可能的菜单方法: http://jsfiddle.net/earthdesigner/7uxcg/1/

javascript部分:

$(document).ready(function(){
    $('nav a').click(function(){
        $('nav li').removeClass('active');
        $(this).parent().addClass('active');
    })  
});