【问题标题】:javascript dynamically adding and removing classes [duplicate]javascript动态添加和删除类[重复]
【发布时间】:2017-12-20 00:03:48
【问题描述】:

我正在做一个简单的例子,如果用户点击元素,那么它上面的所有元素都应该有一个类,而它下面的所有元素都不应该有任何应用到它们的类。

这是我的代码:

<script>
function test(object) {
    var pid = object.id;
    var id = parseInt(pid.split("")[1]);
    console.log(id);
    for (var i = 1; i <= id; i++) {
        var element = document.getElementById("p"+i);
        console.log(element);
        element.className = "active";
    }
    console.log(id+1);
    for(var i = id+1; i <= 4; i++) {
        var element = document.getElementById("p"+i);
        element.className.replace(new RegExp('(?:^|\\s)'+ 'active' + '(?:\\s|$)'), ' ');
        console.log(element);
    }
}   
</script>

<div id="divid">
    <p id="p1" onclick="test(this)">one</p>
    <p id="p2" onclick="test(this)">two</p>
    <p id="p3" onclick="test(this)">three</p>
    <p id="p4" onclick="test(this)">four</p>
</div>

所以在这里,如果我点击三,那么一、二、三的元素应该有活动的类,而元素四不应该有任何类。这工作正常。

现在如果我点击一个,我希望二、三、四应该有任何 css 类,但它不是那样工作的。

你能帮我解决问题吗?我想使用纯 Javascript。

【问题讨论】:

  • 如果,,p2 出现在p3 之后怎么办?
  • @KoushikChatterjee,好问题。目前我的身份证只在增加。还需要检查这种情况。
  • hmmm,也为这种情况提供了一个简单的解决方案,请检查我的新答案。

标签: javascript html css


【解决方案1】:

由于关注点分离,考虑使用 onclick 属性的替代方法可能是明智的。以下内容允许您在工作时更改 HTML,而无需考虑 JavaScript。

https://jsfiddle.net/gseh0wxc/2/

var getList = (selector) => [].slice.call(document.querySelectorAll(selector));

var paragraphs = getList("#divid p[id ^= 'p']");
paragraphs.forEach((paragraph, index) => {
  paragraph.addEventListener('click', (e) => {
    for (let i = 0; i < index; i++) {
      paragraphs[i].classList.remove('active');
    }
    for (let i = index; i < paragraphs.length; i++) {
      paragraphs[i].classList.add('active');
    }
  });
})

【讨论】:

  • 这真是太好了,你能解释一下这段代码是什么意思吗? var getList = (selector) =&gt; [].slice.call(document.querySelectorAll(selector));
  • 它创建了一个名为 getList 的函数,它返回一个元素数组,这些元素与您传递给它的任何 CSS 选择器相匹配。最重要的是它返回一个你可以实际操作的元素数组。
  • 很有趣,我想了解更多,能否请您指出一些解释此功能的 javascript 文档,之前从未见过。
  • 这是你在进步的过程中学到的东西,它变得非常有用。有关它为何使用和有用的更多解释,请查看这篇文章:stackoverflow.com/questions/19099170/…
  • 这应该是公认的答案,因为它解决了问题,也提高了代码质量,这对 SO 总是有好处的。
【解决方案2】:

请试试这个代码

function test(object) {
    var pid = object.id;
    var id = parseInt(pid.split("")[1]);
    console.log(id);
    for (var i = 1; i <= id; i++) {
        var element = document.getElementById("p"+i);
        element.classList.add("active");
    }
    console.log(id+1);
    for(var i = id+1; i <= 4; i++) {
        var element = document.getElementById("p"+i);
        element.classList.remove("active");
    }
}

希望这会有所帮助。

【讨论】:

  • 我看到像这样&lt;p id="p3" onclick="test(this)" class=""&gt;three&lt;/p&gt; 是否可以删除类属性本身使其看起来像&lt;p id="p3" onclick="test(this)"&gt;three&lt;/p&gt;
  • 当然。您可以使用 removeAttribute 类。例如 element.removeAttribute("class");然后你会得到你想要的。
  • 仅代码的答案不如那些解释了添加/删除了哪些代码的答案有用。如果您添加参考资料,用户可以了解classList 界面,那就更好了。
【解决方案3】:

改用这种简单的方法,不需要提取 id 号和所有内容,并且只需一个简单的循环。

function test(option) {
//this will select all p tags id starts with "p" inside div having id "divid" and return a array
var targetPTags = document.querySelectorAll("div#divid p[id^=p]")
var idx, flag=false;
    //we are iterating over that array and taking each dom element in el
    for(idx=0;idx<targetPTags.length;idx++) {
        var el = targetPTags[idx];
        if(flag) {
            //do operation you want for after elements in el
        } else if(option===el) {
            flag=true; // we are making flag true when its the element that clicked and doing no operation
            //do the operation you want for the element, may be the same as below operation in else
        } else {
            //do operation you want for before element in el
        }
    }
}

【讨论】:

  • 你能解释一下这段代码吗,这里的 if、else if 和 else 做什么。无法与我的程序相关联。
  • @user3181365 我已经用 cmets 编辑了我的答案,这可能会有所帮助。否则告诉我,我会进一步解释。
【解决方案4】:

有点类似于“Chatterjee”的解决方案,但在这里:

function test(object)
{
    var parentElem = null;
    var childElems = null;
    var currElemSet = false;
    var i=-1;

    try
    {
        parentElem = object.parentElement;

        if(parentElem!=null)
        {
            childElems=parentElem.getElementsByTagName(object.nodeName); // could refine to accommodate sibling nodes only
            if(childElems!=null)
            {
                for(i=0;i<childElems.length; i++)
                {
                    if(currElemSet) childElems[i].className = "";
                    else childElems[i].className = "active";

                    if(childElems[i]==object) currElemSet = true;
                }
            }

        }
    }
    catch(e)
    {
        alert("Error:  " + e.Message);
    }
    finally
    {

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多