藏的陷阱和不兼容问题,用JavaScript 代码处理DOM 的某些部分要比处理其他部分更复杂一些。
10.2.1
动态脚本
使用<script>元素可以向页面中插入JavaScript 代码,一种方式是通过其src 特性包含外部文件,
另一种方式就是用这个元素本身来包含代码。而这一节要讨论的动态脚本,指的是在页面加载时不存在,
但将来的某一时刻通过修改DOM 动态添加的脚本。跟操作HTML 元素一样,创建动态脚本也有两种方
式:插入外部文件和直接插入JavaScript 代码。
动态加载的外部JavaScript 文件能够立即运行,比如下面的<script>元素:
<script type="text/javascript" src="client.js"></script>
var script = document.createElement("script"); script.type = "text/javascript"; script.src = "client.js"; document.body.appendChild(script);
function loadScript(url){ var script = document.createElement("script"); script.type = "text/javascript"; script.src = url; document.body.appendChild(script); }然后,就可以通过调用这个函数来加载外部的JavaScript 文件了:
loadScript("client.js");加载完成后,就可以在页面中的其他地方使用这个脚本了。问题只有一个:怎么知道脚本加载完成
<script type="text/javascript"> function sayHi(){ alert("hi"); } </script>从逻辑上讲,下面的DOM 代码是有效的:
var script = document.createElement("script"); script.type = "text/javascript"; script.appendChild(document.createTextNode("function sayHi(){alert('hi');}")); document.body.appendChild(script);
var script = document.createElement("script"); script.type = "text/javascript"; script.text = "function sayHi(){alert('hi');}"; document.body.appendChild(script);
var script = document.createElement("script"); script.type = "text/javascript"; var code = "function sayHi(){alert('hi');}";
try { script.appendChild(document.createTextNode("code")); } catch (ex){ script.text = "code"; } document.body.appendChild(script);这里,首先尝试标准的DOM 文本节点方法,因为除了IE(在IE 中会导致抛出错误),所有浏览器
function loadScriptString(code){ var script = document.createElement("script"); script.type = "text/javascript"; try { script.appendChild(document.createTextNode(code)); } catch (ex){ script.text = code; } document.body.appendChild(script); }
loadScriptString("function sayHi(){alert('hi');}");以这种方式加载的代码会在全局作用域中执行,而且当脚本执行后将立即可用。实际上,这样执行