javascript - 关闭叠加层,除非使用 jQuery/Javascript 单击 "special"Div

标签 javascript jquery html css

我有一个名为“MyDiv”的 div。单击此 div 时,会显示一个叠加层,并附加一个“MyDiv_subDiv”。当用户点击叠加层时, View 应该消失,但如果用户点击“MyDiv_subDiv”则不会。

我在这里发现了一个类似的问题并尝试了一下,这是我的代码:

var $MyDiv = $('#MyDiv');
var $overlay = $('<div id="overlay"></div>');
var $MyDiv_subDiv = $('<div id="MyDiv_subDiv" class="subDiv">\n\
<div class="subDivContent">\n\
<div class="subDivContent">\n\
<p>some content</p>\n\
</div>\n\
</div>\n\
</div>');

//Add overlay
$("body").append($overlay);

//When overlay is clicked
$overlay.click(function () {
    //Hide the overlay
    $overlay.hide();
    $overlay.empty();
});

$MyDiv.click(function (event) {
    event.preventDefault();
    $overlay.show();
    $overlay.append($MyDiv_subDiv);
});

$MyDiv_subDiv.click(function (event) {
    event.stopPropagation();
});
#overlay {
    background:rgba(0,0,0,0.7);
    width:100%;
    height:100%;
    position:absolute;
    top:0;
    left:0;
    display:none;
    text-align:center;
}

.subDiv{
    width: 400px;
    height: 125px;
    margin: 0 auto;
    
}

#MyDiv_subDiv{
    background-color: lightgreen;
}

#MyDiv{
    width: 185px;
    height: 80px;
    background-color: lightgray;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="MyDiv">
Click to show MyDiv_SubDiv
</div>

问题是:它只在第一次点击“MyDiv”时有效。当覆盖关闭并第二次单击“MyDiv”然后单击“MyDiv_subDiv”时,它会消失 - 它不应该!

感谢任何帮助!

最佳答案

来自 jquery.empty

To avoid memory leaks, jQuery removes other constructs such as data and event handlers from the child elements before removing the elements themselves.

If you want to remove elements without destroying their data or event handlers (so they can be re-added later), use .detach() instead.

所以你必须使用.detach来保留事件。

因为 .detach 是应用于自身,而不是 child ,你必须改变

$overlay.empty();$MyDiv_subDiv.detach();$overlay.children().detach();

或者您可以在每次将事件附加到 $overlay 时重新绑定(bind)该事件。

var $MyDiv = $('#MyDiv');
var $overlay = $('<div id="overlay"></div>');
var $MyDiv_subDiv = $('<div id="MyDiv_subDiv" class="subDiv">\n\
<div class="subDivContent">\n\
<div class="subDivContent">\n\
<p>some content</p>\n\
</div>\n\
</div>\n\
</div>');

//Add overlay
$("body").append($overlay);

//When overlay is clicked
$overlay.click(function () {
    //Hide the overlay
    $overlay.hide();
    $overlay.children().detach();
});

$MyDiv.click(function (event) {
    event.preventDefault();
    $overlay.show();
    $overlay.append($MyDiv_subDiv);
});

$MyDiv_subDiv.click(function (event) {
    event.stopPropagation();
});
#overlay {
    background:rgba(0,0,0,0.7);
    width:100%;
    height:100%;
    position:absolute;
    top:0;
    left:0;
    display:none;
    text-align:center;
}

.subDiv{
    width: 400px;
    height: 125px;
    margin: 0 auto;
    
}

#MyDiv_subDiv{
    background-color: lightgreen;
}

#MyDiv{
    width: 185px;
    height: 80px;
    background-color: lightgray;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="MyDiv">
Click to show MyDiv_SubDiv
</div>

关于javascript - 关闭叠加层,除非使用 jQuery/Javascript 单击 "special"Div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314764/

相关文章:

javascript - 图像上出现波纹

javascript - jQuery 验证插件 : Unable to get property 'setdefaults' of undefined or null reference IE

javascript - JS 在函数内调用函数并设置日期格式

javascript - 如何使用 jQuery 过滤具有多个选择组的结果?

javascript - 代码无法在 IE 中隐藏和取消隐藏 Div

javascript - 输入范围 slider 拇指js事件

javascript - 如何从 javascript 验证上传的照片不大于 1MB

javascript - 在 Jquery Mobile 中刷新页面时如何使用 Coldfusion toScript?

jquery - jquery slider 的CSS定位问题

javascript - 服务器端如何获取隐藏字段的值