javascript - 避免为每个元素重复使用 javascript

标签 javascript performance dialog modal-dialog polyfills

我正在使用 Google dialog-polyfill对于我网站上的模式。我需要在一个页面上有多个可以独立启动的模式。现在,我唯一可以开始工作的方法是重复所有的 javascript,这似乎效率很低:

<dialog id="dialog" name="modal">
    <p>This is the login modal dialog.</p>
    <input type="text"></input>
    <p><button id="close-dialog">Close dialog</button></p>
</dialog>
<p><button id="open-dialog">Open login dialog</button></p>

<dialog id="dialog2" name="modal">
    <p>This is the registration modal dialog.</p>
    <input type="text"></input>
    <p><button id="close-dialog2">Close dialog</button></p>
</dialog>
<p><button id="open-dialog2">Open registration dialog</button></p>

<script>
    var dialog = document.getElementById('dialog');
    var dialog2 = document.getElementById('dialog2');
    dialogPolyfill.registerDialog(dialog);
    dialogPolyfill.registerDialog(dialog2);

    document.getElementById('open-dialog').addEventListener('click', function () {
        dialog.showModal();     });
    document.getElementById('close-dialog').addEventListener('click', function () {
        dialog.close();     });

    document.getElementById('open-dialog2').addEventListener('click', function () {
        dialog2.showModal();     });
    document.getElementById('close-dialog2').addEventListener('click', function () {
        dialog2.close();     });

    dialog.addEventListener('click', function (event) {
        var rect = dialog.getBoundingClientRect();
        var isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width);
        if (!isInDialog) {
            dialog.close();
        }
    });

    dialog2.addEventListener('click', function (event) {
        var rect = dialog2.getBoundingClientRect();
        var isInDialog = (rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width);
        if (!isInDialog) {
            dialog2.close();
        }
    });
</script>

我已经尝试过这个并添加 name 属性但无济于事:

    var names = document.getElementsByName("modal");
    for (var i = 0; i < names.length; i++) {
        names[i].onchange = function () {
            document.getElementById('open-dialog').addEventListener('click', function () {
                dialog.showModal();
            });
            document.getElementById('close-dialog').addEventListener('click', function () {
                dialog.close();
            });
        }
    }

我不明白类如何解决这个问题。有没有办法压缩代码,这样我就不需要为每个模式对话框重复它?

最佳答案

我编辑了你的 fiddle :

http://jsfiddle.net/178f81qc/2/

你是这个意思吗?

HTML

<div class="dialog-container">
    <dialog>This is dialog one <button class="close">close</button></dialog>

    <button class="open">open dialog one</button>
</div>

<br>

<div class="dialog-container">
    <dialog>This is dialog two <button class="close">close</button></dialog>

    <button class="open">open dialog two</button>
</div>

Javascript

var dialogContainers = document.querySelectorAll('.dialog-container'), i;
for (i=0; i<dialogContainers.length; i++) {

    var dialog = dialogContainers[i].querySelector('dialog'), // the <dialog> element
        btnOpen = dialogContainers[i].querySelector('.open'),  // the open button
        btnClose = dialogContainers[i].querySelector('.close'); // the close button

    // for old browsers
    dialogPolyfill.registerDialog(dialogContainers[i]);

    btnOpen.addEventListener('click', function () {
        this.showModal();
    }.bind(dialog));

    // because you bind 'dialog' to the function, 'this' will be the dialog.
    // (if you don't use bind, 'this' will be btnOpen instead)

    btnClose.addEventListener('click', function () {
        this.close();
    }.bind(dialog));
}

关于javascript - 避免为每个元素重复使用 javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28989974/

相关文章:

javascript - 从包含中文和拉丁字符的电子邮件字段中检索原始值

C 线程程序

performance - JMeter:更多 HTTP 请求导致性能提高?

sql - MySQL INSERT INTO table VALUES.. vs INSERT INTO table SET

c# - 如何在WPF窗口中隐藏关闭按钮?

javascript - 简单的 Webpack + React + ES6 + babel 示例不起作用。意外的 token 错误

javascript - 在 Backbone View 中添加下拉菜单

java - 调整 Swing 窗口大小时如何避免闪烁?

javascript - ko.applybindings 不适用于动态 html 元素

java - GWT 中的 JOptionPane.showInputDialog()