Jquery选择器以“this”返回

时间:2017-03-16 17:02:45

标签: javascript jquery

我有以下代码:

function checkBoxOpenStatus(clickedBox) {
    if($("#productsBox").hasClass("boxOpen")) {
         closeBox(obj.productsBox.bx, clickedBox);
         delay = 200; 
    } else if($("#fabricationBox").hasClass("boxOpen")) {
         closeBox(obj.fabricationBox.bx, clickedBox);
         delay = 200;
    } else if($("#aboutPBBox").hasClass("boxOpen")) {
         closeBox(obj.aboutPBBox.bx, clickedBox); 
         delay = 200;
    } else { delay = 0; }

我的目标是评估三个框,如果其中一个具有类“boxOpen”,那么我需要关闭该框,并为我的“openSelectedBox”函数添加延迟(上面没有)。我的问题是,我可以将上面的代码更改为以下内容:(不会失去发送特定选择器的能力吗?)

    if($("#productsBox" || "#fabricationBox" || "#aboutPBBox").hasClass('boxOpen') {
        closeBox(obj.(**WHAT SELECTOR CAN GO HERE??**).bx, clickedBox);
        delay = 200;

我知道“或”评估有效,但我不知道如何使用该“或”定义的实例来激活具有适当选择的“closeBox”函数。我宁愿学习这个,所以请给我一个解释,选择器可以在那里进行这样的评估。

2 个答案:

答案 0 :(得分:0)

使用与该类的所有方框匹配的选择器。如果这返回至少1个元素,则会打开一个框,您可以获取此元素的ID。

然后你可以使用另一个选择器来获取带有类的元素的ID。

var openBoxes = $("#productBox.boxOpen, #fabricationBox.boxOpen, #aboutPBBox.boxOpen");
if (openBoxes.length > 0) {
    var openId = openBoxes.attr("id");
    closeBox(obj[openId].bx, clickedBox);
    delay = 200;
} else {
    delay = 0;
}

如果你给所有这些盒子一个公共类,而不是必须列出选择器中的所有ID,那会更简单。

答案 1 :(得分:0)

您注意到重复的代码块并想要优化它们。 (插入我喜欢你在这里meme。)

你可以这样做:

// This will get the 3 elements in a jQuery object and filter the 3 elements to only keep the ones that have the class "boxOpen"
var theOnesWithTheClass = $("#productsBox, #fabricationBox, #aboutPBBox").filter(".boxOpen");

// This will call the closeBox with the id of each element inside the jQuery object. I do it this way just in case there are more than 1 element.
// The jQuery each method will call the function setting the this context to each element inside the jQuery object.
theOnesWithTheClass.each(function() {
    closeBox(obj[this.id].bx, clickedBox);
});

// This will set the delay to 200 only if there are elements inside the jQuery object. The ? conditional returns the block before the : if true and the block after it if false.
delay = theOnesWithTheClass.length > 0 ? 200 : 0;