javascript - 如何将 Javascript 函数应用于一个类的多个实例?

标签 javascript

我有一个网页,它使用表格显示一组图像以进行简单布局。我想做的是允许用户单击图像并让该图像在模式中放大显示。

包含图形的 html 行:

<tr>
    <td>Graphic One</td>
    <td><img class="graph" src="/chart1.jpg">
        <div class="modal">
        <div class="modal-content">
            <span class="close-btn">&times;</span>
                <img src="/chart1.jpg">
        </div>
    </div>
    </td>
</tr>

重复此操作以创建更多带有图形的行。这是脚本:

<script>
let modalBtn = document.querySelector(".graph")
let modal = document.querySelector(".modal")
let closeBtn = document.querySelector(".close-btn")
    modalBtn.onclick = function(){
    modal.style.display = "block"
    }
closeBtn.onclick = function(){
    modal.style.display = "none"
    }
    window.onclick = function(e){
    if(e.target == modal){
        modal.style.display = "none"
    }
}
</script>
不过,这似乎只激活页面上的第一个图形,因此我假设 querySelector() 在找到的第一个实例处停止。

如何将其应用到表中带有图像的每一行?

最佳答案

如果您想将其应用于每个表格行,您只需选择所有 <td>然后迭代地将与上面相同的逻辑应用于其中找到的元素。

要访问各个元素,您可以简单地使用 Element.querySelector()相反,假设 Element<td> 。它有助于给出这个 <td>包含所有这些元素的类的元素,因此您可以缩小选择范围,例如<td class="action"> :

<tr>
    <td>Graphic One</td>
    <td class="action">
        <img class="graph" src="/chart1.jpg">
        <div class="modal">
        <div class="modal-content">
            <span class="close-btn">&times;</span>
                <img src="/chart1.jpg">
        </div>
    </div>
    </td>
</tr>

...那么你可以这样做:

document.querySelectorAll('.action').forEach(el => {
    let modalBtn = el.querySelector(".graph");
    let modal = el.querySelector(".modal");
    let closeBtn = el.querySelector(".close-btn");

    modalBtn.addEventListener('click', e => {
        // Stop click event from bubbling up
        e.stopPropagation();

        modal.style.display = 'block';
    });

    closeBtn.addEventListener('click', e => {
        // Stop click event from bubbling up
        e.stopPropagation();

        modal.style.display = 'none';
    });
});

// Listen to click event on the window ONCE, outside the forEach loop
window.addEventListener('click', () => {
    document.querySelectorAll(".modal").forEach(el => {
        el.style.display = 'none';
    });
});

您可以看到我在 foreach 循环中省略了窗口单击事件监听器。原因是您可以简单地依赖 event.stopPropagation阻止单击事件冒泡到窗口对象。这意味着,您只需在窗口上绑定(bind)一次点击事件即可。

另外,我不建议使用 Element.onclick = Function添加事件监听器,因为这意味着您只能通过这种方式分配一个处理程序。使用Element.addEventListener相反。

关于javascript - 如何将 Javascript 函数应用于一个类的多个实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60993493/

相关文章:

Javascript 如果 url 然后图像

javascript - 不在 Rails 中附加实际的 HTML

javascript - 在 Javascript 中重新格式化 JSON 数据的优雅、简洁的方法?

javascript - 如何在 #document 中通过 XPath 查找元素

JavaScript 递增 (++) 运算符位于参数两侧?

javascript - 用合并范围的左上角单元格数据填充范围内的空合并单元格

javascript - 在 API 中打开数组(puppeteer)

javascript - 预期在箭头函数末尾返回一个值。 (一致返回)

javascript - 对象不支持此属性或方法 'isotope'

javascript - 一个接一个的jQuery BlockUi Message