jQuery 选择器中的变量

Posted

技术标签:

【中文标题】jQuery 选择器中的变量【英文标题】:Variables in jQuery selectors 【发布时间】:2013-07-03 02:00:24 【问题描述】:

下面是我为动画导航方案编写的一些 jQuery 代码。

当我像这样写出来进行测试时,代码运行良好:

$("#about").click(function(e) 
                e.preventDefault();
                if ( !$(".current").hasClass("about") )
                    $("body").css("overflow-x","hidden");
                    $(".current").animate(left:'-1500px', 500).slideUp(500);
                    $(".about").animate(left:'+3000px', 1).delay(500).slideDown();
                    $(".about").animate(left:'0px', 500, function()
                            $(".current").removeClass("current");
                            $(".about").addClass("current");
                            $("body").css("overflow-x","visible");
                    );
                
            );

但是当我尝试将它放入循环并在 jquery 选择器中使用变量时,它停止工作。 sections 数组中的每个字符串对应一个锚标记的 id 及其匹配的 div 元素的类。

它一直运行到第 7 行,但以 $("."+sections[i]) 开头的第 8 行和第 9 行不起作用。

var sections = ["about","photography","contact"];
for (var i=0; i<sections.length; i++) 
                $("#"+sections[i]).click(function(e) 
                    e.preventDefault();
                    if ( !$(".current").hasClass(sections[i]) )
                        $("body").css("overflow-x","hidden");
                        $(".current").animate(left:'-1500px', 500).slideUp(500);
                        $("."+sections[i]).animate(left:'+3000px', 1).delay(500).slideDown();
                        $("."+sections[i]).animate(left:'0px', 500, function()
                                $(".current").removeClass("current");
                                $("."+sections[i]).addClass("current");
                                $("body").css("overflow-x","visible");
                        );
                    
                );

            

console.log( $("."+sections[i]).attr("class") ) 给我未定义。我认为问题出在选择器上,但我不知道它是什么。 id 选择器似乎工作正常,只是类选择器不行。任何建议表示赞赏!

【问题讨论】:

console.log($("."+sections[i])) 输出什么?它应该告诉您选择器是什么以及长度(以及许多其他内容)。 console.log($("."+sections[i])) 返回[prevObject: x.fn.x.init[1], context: document, selector: ".undefined", jquery: "1.10.1", constructor: function…] context: document length: 0 prevObject: x.fn.x.init[1] selector: ".undefined" __proto__: Object[0] 我得到了运行代码并给出了下面的答案,但我仍然想弄清楚为什么它一开始就不起作用,因为我刚刚开始jQuery 【参考方案1】:

您的代码不起作用的原因是因为您只是在 for 循环中注册事件,而不是创建闭包变量 i 以在相应的处理程序中使用。到您的处理程序执行时。 "i" 将是 3,在 for 循环的最后一次迭代增量之后(在为数组中的最后一个元素注册事件之后)并且它保持在那里,所以你试图寻找 sections[3] 总是未定义的。

保持简单:

立即加入选择器并注册一次您的处理程序,在您的处理程序中,您试图通过执行sections[i] 来引用它自己的 id,您可以使用this.id 获取 id 并在处理程序中使用它.

var sections = ["about", "photography", "contact"];
var selector = '#' + sections.join(',#'); //get your selector joined here.

    $(selector).click(function (e) 
        e.preventDefault();
        var id = this.id; // in your code sections[i] is same as id of the clicked element. SO just use this id.
        if (!$(".current").hasClass(id))  
            $("body").css("overflow-x", "hidden");
            $(".current").animate(
                left: '-1500px'
            , 500).slideUp(500);
            $("." + id).animate(
                left: '+3000px'
            , 1).delay(500).slideDown();
            $("." + id).animate(
                left: '0px'
            , 500, function () 
                $(".current").removeClass("current");
                $("." + id).addClass("current");
                $("body").css("overflow-x", "visible");
            );
        
    );

【讨论】:

看起来更干净,运行漂亮,并且摆脱了 for 循环。谢谢!但是我仍然不清楚为什么我的原始代码不起作用。 :// @B.B.不客气。我在第一段中解释过。在您的处理程序中执行 console.log(i) 您将看到它打印 3. 啊,我明白了。非常感谢!

以上是关于jQuery 选择器中的变量的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jquery 检查变量选择器中的属性?

JQuery 选择器中的变量不起作用

在 jQuery 选择器中使用 jQuery 对象

如何在 jQuery 选择器中使用 JavaScript 变量?

如何在 Jquery 选择器中使用变量 [重复]

在 Jquery 选择器中附加变量