javascript - 2 个相似的模态

标签 javascript jquery css

我是 javascript 的新手。现在我正在做一个元素,允许用户在我的网站上添加和删除公园。为此,我想要一个弹出窗口,允许他们输入州和公园名称以添加或删除。我正在尝试添加 2 个模态框,一个用于添加,一个用于删除。但是,因为我在 2 个单独的 js 文件中执行此操作,所以只调用了 remove,并且为它们两个都调用了它。

这是我的一些html

<body id="page-dash" class="container">
    <div class="one">
        <ul class="vertical">
            <li id="addBtn" class="vertical"><a href="#">Add a Park</a><br></li>
            <li id="remBtn" class="vertical"><a href="#">Remove a Park</a><br></li>
            <li id="updateBtn" class="vertical"><a href="#">Update List</a><br></li>
            <li id="passBtn" class="vertical"><a href="#">Reset Password</a><br></li>
        </ul>
    </div>

    <div id="stateParkList" class="two">
        <p id="desc">List of states and their National Parks.</p>
    </div>

    <!-- Pop Up Window -->
    <div id="addWindow">
    <div id="popUp-add" class="popUp">
        <div class="popUp-content">
            <span class="close">&times;</span>
            <form id="Form">
                <p>Add Park</p><br>
                <p>State:</p>
                <input type="text" id="state"><br>
                <p>National Park:</p>
                <input type="text" id="park"><br>
                <button onclick="addPark()">Submit</button>
            </form>
        </div>

    </div>

    <div id="remWindow">
    <div id="popUp-rem" class="popUp">
        <div class="popUp-content">
            <span class="close">&times;</span>
            <form id="Form">
                <p>Remove Park</p><br>
                <p>State:</p>
                <input type="text" id="state"><br>
                <p>National Park:</p>
                <input type="text" id="park"><br>
                <button onclick="remPark()">Submit</button>
            </form>
        </div>

    </div>

    <footer>&copy; Copyright CS234-SIUe-Spring 17. All rights reserved.</footer>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="../js/parks.js"></script>
    <script src="../js/add.js"></script>
    <script src="../js/remove.js"></script>

这是 add.js:

var modal = document.getElementById('popUp-add');

var btn = document.getElementById("addBtn");

var span = document.getElementsByClassName("close")[0];

btn.onclick = function() {
    modal.style.display = "block";
}

span.onclick = function() {
    modal.style.display = "none";
}

window.onclick = function(event) {
    if (event.target == modal) {
        modal.style.display = "none";
    }
}

remove.js:

var modal = document.getElementById('popUp-rem');

var btn = document.getElementById("remBtn");

var span = document.getElementsByClassName("close")[0];

btn.onclick = function() {
    modal.style.display = "block";
}

span.onclick = function() {
    modal.style.display = "none";
}

window.onclick = function(event) {
    if (event.target == modal) {
        modal.style.display = "none";
    }
}

和 CSS:

/*Pop up window in dashboard*/
.popUp {
    display: none; 
    position: fixed;
    z-index: 1;
    left: 0;
    top: 0;
    width: 100%; 
    height: 100%;
    overflow: auto; 
    background-color: rgb(0,0,0); 
    background-color: rgba(0,0,0,0.4);
}

.popUp-content {
    background-color: #fefefe;
    margin: 15% auto;
    padding: 20px;
    border: 1px solid #888;
    width: 15%;
    height: 23%;
    font-size: 18px;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.close {
    color: #aaa;
    float: right;
    font-size: 28px;
    font-weight: bold;
    margin-top: -7%;
    margin-right: -5%;
}

.close:hover,
.close:focus {
    color: black;
    text-decoration: none;
    cursor: pointer;
}

form#Form input{
    border: 1pt solid black;
}
form#Form input{
    margin-bottom: 5%;
}

最佳答案

您的代码有两个问题。

  1. 您在全局(窗口)范围内定义所有变量,这会导致意外更改。在add.js中定义了三个变量modal,btnspan,在中是完全一样的remove.js。因为你后面加载了remove.js,三个变量的实际值是后面在remove.js

    中赋值的
    var modal = document.getElementById('popUp-rem');
    var btn = document.getElementById("remBtn");
    var span = document.getElementsByClassName("close")[0];
    

    您可以使用 function scopeIIFE避免全局命名空间污染

  2. 你应该使用 addEventListener而不是 onclick 当您需要将多个事件添加到同一个 dom 元素时,在这种情况下是 windowspan。因为绑定(bind)事件 onclick 会在较新的分配后被覆盖。因此 onclick 只会响应最新的函数,在这种情况下只会调用 remove.js 中的函数.

你应该这样修改你的代码

添加.js

 (function() {
    var modal = document.getElementById('popUp-add');

    var btn = document.getElementById("addBtn");

    var span = document.getElementsByClassName("close")[0];

    btn.onclick = function() {
        modal.style.display = "block";
    }

    span.addEventListener('click',function() {
        modal.style.display = "none";
    })

    window.addEventListener('click',function(event) {
        if (event.target == modal) {
            modal.style.display = "none";
        }
    })
})()

删除.js

 (function() {
    var modal = document.getElementById('popUp-rem');

    var btn = document.getElementById("remBtn");

    var span = document.getElementsByClassName("close")[0];

    btn.onclick = function() {
        modal.style.display = "block";
    }

    span.addEventListener('click',function() {
        modal.style.display = "none";
    })

    window.addEventListener('click',function(event) {
        if (event.target == modal) {
            modal.style.display = "none";
        }
    })
})()

另外一件事,如果您的网站需要与 IE 兼容,请考虑使用 attachEvent相反。

关于javascript - 2 个相似的模态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941677/

相关文章:

javascript - 将嵌套 Knockout.js 组件与 RequireJs 结合使用

jquery - 如何最小化 bxslider 上元素之间的边距

jquery - Rails 2.3.4 和 jquery 表单插件适用于开发,而不适用于生产?

javascript - 如何动态设置图像大小?

javascript - 滚动到 div 顶部时隐藏另一个 div

html - 在 Twitter Bootstrap 中,Grid Column 应该是它自己的特殊 Div 吗?

javascript - Angular $http POST 将空对象作为正文发送

javascript - 范围变量未在指令之外设置

javascript - 如何使用 Mocha 测试私有(private)功能?

javascript - 如何在样式组件中获取元素的宽度(以 px 为单位)?