javascript - 我可以自己更轻松地反转这些按钮吗?

标签 javascript html css

所以,我想知道我是否可以使它更简单(在 javascript 中减少重复),以及我是否可以做到这一点,如果按钮颜色是按钮颜色,则在按下按钮时标题只会变成黑色。如果问题的第二部分是可能的,那么它不需要更简单我只是想弄清楚如何使函数目标只针对具有特定属性(样式)的标签。这可能吗?

我是编码新手,几个小时以来我一直在努力解决这个问题,但找不到已经上传的东西……可能是因为我无法浓缩问题。

<!DOCTYPE html>
<html>
<head>
    <title>
        Flood
    </title>
    <link rel="stylesheet" href="Style.css">
    <style>
        h1 {
            text-align: center;
            padding-left: 30%;
            padding-right: 30%;
            width: 40%;
        }

        p {
            font-size: 14pt
        }

    </style>
</head>
<body>
<section class="mainpage">
    <h1 id="FS"> Fun Stuff </h1>
    <div>
        <button id="Red"> Red</button>
        <button id="Blue"> Blue</button>
        <button id="Yellow"> Yellow</button>
        <button id="Blink"> Blink</button>
    </div>
    <div id="explaination">
        <p>Click the buttons at the top to see what I mean.
        </p>
    </div>
</section>
<script>
    const a = document.getElementById("FS");
    const b = document.getElementById("Red");
    const c = document.getElementById("Blue");
    const d = document.getElementById("Yellow");
    const e = document.getElementById("Blink");

    /*reset Functions*/

    function blackFunctionB() {
        a.style.color = "black";
        b.removeEventListener("click", blackFunctionB,);
        b.addEventListener("click", redFunction,);
    }

    function blackFunctionC() {
        a.style.color = "black";
        c.removeEventListener("click", blackFunctionC,);
        c.addEventListener("click", blueFunction,);
    }

    function blackFunctionD() {
        a.style.color = "black";
        d.removeEventListener("click", blackFunctionD,);
        d.addEventListener("click", yellowFunction,);
    }

    function showFunction() {
        a.style.display = "block";
        e.removeEventListener("click", showFunction,);
        e.addEventListener("click", blinkFunction,)
    }

    /*end reset functions*/

    b.addEventListener("click", redFunction,);

    function redFunction() {
        a.style.color = "Red";
        b.removeEventListener("click", redFunction,);
        b.addEventListener("click", blackFunctionB,);
    }

    c.addEventListener("click", blueFunction,);

    function blueFunction() {
        a.style.color = "Blue";
        c.removeEventListener("click", blueFunction,);
        c.addEventListener("click", blackFunctionC,);
    }

    d.addEventListener("click", yellowFunction,);

    function yellowFunction() {
        a.style.color = "Yellow";
        d.removeEventListener("click", yellowFunction,);
        d.addEventListener("click", blackFunctionD,);
    }

    e.addEventListener("click", blinkFunction,);

    function blinkFunction() {
        a.style.display = "none"
        e.removeEventListener("click", blinkFunction,);
        e.addEventListener("click", showFunction,);
    }
</script>
</body>

所以基本上,当您点击黄色按钮时,它会使方 block 变成黄色,然后如果您点击蓝色按钮,它就会变成蓝色,但如果您再次点击黄色按钮,它就会变成黑色。或者,当您点击黄色然后点击蓝色两次然后再次点击黄色时,它会保持黑色。有没有办法让它只有在你已经是黄色的时候点击黄色按钮才会变成黑色?

最佳答案

您可以创建一个更通用的函数,并且可以处理您遇到的所有情况:

function toggleCss(elem, attrib, value) {
    elem.style[attrib] = elem.style[attrib] === value ? "" : value;
}

const fs = document.getElementById("FS");

for (let color of ["red", "blue", "yellow"]) {
    const button = document.getElementById(color);
    button.addEventListener("click", () => toggleCss(fs, "color", color));
}
const button = document.getElementById("blink");
button.addEventListener("click", () => toggleCss(fs, "visibility", "hidden"));
<section class="mainpage">
    <h1 id="FS"> Fun Stuff </h1>
    <div>
        <button id="red"> Red </button>
        <button id="blue"> Blue </button>
        <button id="yellow"> Yellow </button>
        <button id="blink"> Blink </button>
    </div>
    <div id="explanation">
        <p>Click the buttons at the top to see what I mean.</p>
    </div>
</section>

您甚至可以通过在指示哪个 CSS 属性需要切换的按钮上定义数据属性来使其更通用:

function toggleCss(elem, attrib, value) {
    elem.style[attrib] = elem.style[attrib] === value ? "" : value;
}

const fs = document.getElementById("FS");

for (const button of document.querySelectorAll("button[data-attr]")) {
    button.addEventListener("click", () =>
        toggleCss(fs, button.dataset.attr, button.dataset.value)
    );
}
<section class="mainpage">
    <h1 id="FS"> Fun Stuff </h1>
    <div>
        <button data-attr="color" data-value="red">Red</button>
        <button data-attr="color" data-value="blue">Blue</button>
        <button data-attr="color" data-value="yellow">Yellow</button>
        <button data-attr="visibility" data-value="hidden">Blink</button>
    </div>
    <div id="explanation">
        <p>Click the buttons at the top to see what I mean.</p>
    </div>
</section>

关于javascript - 我可以自己更轻松地反转这些按钮吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945902/

相关文章:

javascript - 为什么节点被chrome覆盖时没有触发点击事件

css - 在固定大小的父 div 中插入 div 10px?

jquery - 固定 Bootstrap 导航栏下的模糊效果

javascript - 如何在Bootstrap中为*独立*几个进度条部分设置动画?

javascript - JCrop - 功能未实现

javascript - 使用 jQuery 进行部分页面刷新但忽略某些元素

javascript - 在刷新和/或计时器时在 div 之间切换内容

jquery - Bootstrap 中的内容重叠

javascript - 将提示框中输入的值写入asp.net中的文本框

jquery - 如何在点击切换开关时增加值(value)?