在下面的例子中:
有了这些信息。是否有一种不同的方法可以销毁文档并将其替换为新文档,从而在不使用函数的情况下销毁事件处理程序?document.write()
document.write()容易出错,“强烈不鼓励”使用它,但我仍然希望能够销毁文档及其事件侦听器。
document.addEventListener('contextmenu', function (e) {
alert('still listening');
e.preventDefault();
})
function m1() {
var doc = document.implementation.createHTMLDocument();
document.replaceChild(
document.importNode(doc.documentElement, true),
document.documentElement
);
}
function m2() {
document.close();
document.write('<html></html>');
}Run Code Online (Sandbox Code Playgroud)
<button onclick="m1()">m1</button>
<button onclick="m2()">m2</button>Run Code Online (Sandbox Code Playgroud)
需要明确的是,按钮/函数“m1”未能实现我的目标,因为尽管替换了文档元素,但出于某种原因保留了前一个文档元素的事件处理程序。我想实现 m2 实现的目标,但不使用document.write并且document.close不推荐使用。
这个问题是为了更好地理解语言和实现它们的引擎的限制。请不要尝试在字里行间阅读或解决某些替代目标。这只是一个事情是否可能的问题。
我不需要知道如何删除事件侦听器或管理事件侦听器,或删除文档的所有子元素。我想知道是否有可能销毁文档元素本身,不留下任何<html>标签,也不留下任何事件侦听器。这是可能的,document.write()但我只是想知道是否有其他方法可以实现这个确切的目标,而不是任何其他假设的目标。
我创造了简单的fidlle
var cnt = 1;
function add() {
var root = document.getElementById('root')
root.innerHTML += '<br /><a id= "a_' +cnt + '" href="#">click</a>'
var a = document.getElementById("a_"+cnt)
a.addEventListener('click', function(event) {
alert('click:a_'+cnt)
})
cnt++
}
Run Code Online (Sandbox Code Playgroud)
添加新链接后单击"添加"按钮,单击此链接后会出现警报.
当使用"添加"按钮添加更多链接时,只有最后一个链接有效(其他链接根据开发工具没有单击事件侦听器).
为什么只有最后一个链接工作,如何使所有链接工作?
这是添加事件的代码
$(document).on({
click: function() {
$(this).hide();
$('#form_name').removeClass('hide');
$('#form_template_name')
.attr('placeholder', $(this).text())
.focus();
}
}, '.form-template-name');
Run Code Online (Sandbox Code Playgroud)
对于某些情况,我不希望触发此事件.所以我尝试的是
$('.form-template-name').off();
$('.form-template-name').unbind();
Run Code Online (Sandbox Code Playgroud)
但似乎没有任何效果.我错过了什么吗?
如果您还删除了元素,则删除与项目关联的事件removeChild()?即使用简单的项目删除项目this.innerHTML =''?这同样适用于与此类内联元素关联的事件<div onclick="/*this event*/"> </div>?提前致谢.