我正在嘗試將腳本塊動態添加到文檔。當我這樣做時,腳本塊沒有被執行。將腳本元素動態添加到div不會執行腳本
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
elem.innerHTML = tmpStr;
hello("World");
</script>
</body>
上述代碼無效。在另一篇文章(How do you execute a dynamically loaded JavaScript block?)中,我看到了一個回覆,如果腳本被添加到innerHTML,它將不會被執行。不是直接使用innerHTML,而是使用innerHTML創建一個div,並使用appendChild添加腳本。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
var newdiv = document.createElement('div');
newdiv.innerHTML = tmpStr;
elem.appendChild(newdiv);
hello("World");
</script>
</body>
如何,這個解決方案也沒有爲我工作。
在另一個回覆中,我再次看到我們應該獲取腳本元素並使用eval執行它們。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
var newdiv = document.createElement('div');
newdiv.innerHTML = tmpStr;
elem.appendChild(newdiv);
var scripts = newdiv.getElementsByTagName('script');
for (var ix = 0; ix < scripts.length; ix++) {
eval(scripts[ix].text);
}
hello("World");
</script>
</body>
此解決方案適用於我。
但是,如果在一個函數中這樣做,那麼它不起作用。
<body>
<div id="dynamicDiv">
</div>
<script type="text/javascript">
function createFunction(){
var elem = document.getElementById("dynamicDiv");
var tmpStr = "<script type=\"text\/javascript\"> ";
tmpStr += "function hello (val)";
tmpStr += "{";
tmpStr += "alert('hello ' + val);";
tmpStr += "}";
tmpStr += "<\/script>";
var newdiv = document.createElement('div');
newdiv.innerHTML = tmpStr;
elem.appendChild(newdiv);
var scripts = newdiv.getElementsByTagName('script');
for (var ix = 0; ix < scripts.length; ix++) {
eval(scripts[ix].text);
}
hello("World 1");
}
createFunction();
hello("World 2");
</script>
</body>
我可以看到該函數在腳本被撤銷後可用。並在函數createFunction中可用。在createFunction()作用域之外,hello()不可用。
我在做什麼錯?我錯過了一些非常基本的東西?請檢查並提供幫助。
感謝, 保羅
附:我不使用jQuery。 我正在使用chrome來測試這個。
您不能在函數內動態添加腳本.. – 2013-03-22 09:57:29
我在'firefox'中測試了您的第一個代碼,它正在工作。 – 2013-03-22 09:58:02
@RohanKumar第三個代碼片段也適用於我的Chrome和Firefox。但是第四個片段在兩者中都不起作用。第四個片段應該提醒2次。 「你好世界1」和「你好世界2」。不知何故,hello函數不能在createFunction()作用域之外訪問。 – 2013-03-22 11:12:03