正在发生的事情是表单正在提交,因此页面正在刷新(使用其原始内容)。您正在处理提交按钮上的click 事件。
如果您想删除元素并且不提交表单,请改为处理表单上的submit 事件,并从您的处理程序返回false:
HTML:
<form onsubmit="return removeDummy(); ">
<input type="submit" value="Remove DUMMY"/>
</form>
JavaScript:
function removeDummy() {
var elem = document.getElementById('dummy');
elem.parentNode.removeChild(elem);
return false;
}
但您根本不需要(或不想要)一个表单,如果它的唯一目的是删除虚拟 div。而是:
HTML:
<input type="button" value="Remove DUMMY" onclick="removeDummy()" />
JavaScript:
function removeDummy() {
var elem = document.getElementById('dummy');
elem.parentNode.removeChild(elem);
return false;
}
然而,这种设置事件处理程序的方式已经过时了。你似乎有很好的直觉,因为你的 JavaScript 代码在它自己的文件中等等。下一步是更进一步,避免使用onXYZ 属性来连接事件处理程序。相反,在您的 JavaScript 中,您可以使用更新的(大约 2000 年)方式将它们连接起来:
HTML:
<input id='btnRemoveDummy' type="button" value="Remove DUMMY"/>
JavaScript:
function removeDummy() {
var elem = document.getElementById('dummy');
elem.parentNode.removeChild(elem);
return false;
}
function pageInit() {
// Hook up the "remove dummy" button
var btn = document.getElementById('btnRemoveDummy');
if (btn.addEventListener) {
// DOM2 standard
btn.addEventListener('click', removeDummy, false);
}
else if (btn.attachEvent) {
// IE (IE9 finally supports the above, though)
btn.attachEvent('onclick', removeDummy);
}
else {
// Really old or non-standard browser, try DOM0
btn.onclick = removeDummy;
}
}
...然后从页面末尾的script 标记body(就在结束</body> 标记之前)调用pageInit();,或从windowload 事件中调用,虽然这发生在页面加载周期中非常晚,因此通常不适合连接事件处理程序(例如,它发生在所有图像最终加载之后)。
请注意,我必须进行一些处理以处理浏览器差异。您可能需要一个用于连接事件的函数,这样您就不必每次都重复该逻辑。或者考虑使用像 jQuery、Prototype、YUI、Closure 或 any of several others 这样的库来为您消除浏览器的差异。 非常重要了解正在发生的底层内容,包括 JavaScript 基础知识和 DOM 基础知识,但是库处理了很多不一致的问题,并且还提供了很多方便的实用程序——比如连接处理浏览器差异的事件处理程序。它们中的大多数还提供了一种方法来设置函数(如 pageInit),以便在 DOM 准备好被操作时立即运行,早在 window load 触发之前。