Nis*_*hal 17 javascript internet-explorer dom
我们一直在我们的工作场所讨论这个问题,其中一些反对行为,一些反对行为.想听听你们的意见:
<html>
<body>
<div>
Test!
<script> document.body.removeChild(document.getElementsByTagName('div')[0]); </script>
</div>
</body>
</html>
上述脚本应该工作并执行它应该做的事情吗?首先,让我们看看这里发生了什么:
我有一个javascript在<div>元素内.这个javascript将删除正文中的子节点,该节点恰好包含脚本本身存在的div.
现在,上面的脚本在Firefox,Opera和IE8中运行良好.但IE6和IE7发出警告说他们无法打开页面.
我们不讨论IE应该如何处理这个问题(他们已经将其视为一个bug,因此在IE8中修复了它).这里的要点是因为'SCRIPT'标签本身是DOM的一部分,是否允许它做这样的事情?这样的手术后是否应该存在?
编辑:
如果我运行上面的代码,Firefox,Opera,IE9等不会删除'script'标记.但是,document.getElementsByTagName('script').length返回0!
要理解我的意思,请在上面的代码中添加alert(document.getElementsByTagName('script').length);前后document.body.removeChild(document.getElementsByTagName('div')[0]);.
例如,自我移除可以很方便的一个例子是一些长的轮询技术,这些技术肯定会在几分钟后使DOM变大.
JavaScript框架添加和删除脚本元素作为日常例程的一部分.
例如,getScript()在jQuery中,在文档头中放置一个脚本标记,并在评估后立即将其删除.
他们这样做是为了保持DOM清洁 - 否则标签会不必要地积累.评估后不再需要它们.
我看到的唯一缺点是调试 - 例如,带有Firebug的Firefox似乎丢失了这些脚本的下落,无法找到源代码行.(撰写本文时)
小智 5
实际上你可以这样做:
var currentScript;
currentScript = document.currentScript || document.scripts[document.scripts.length - 1];
currentScript.parentNode.removeChild(currentScript);