浏览器似乎不会解析<script>
通过targetElement.innerHTML
. 这可能就是你遇到的。
最好的解决方案是使用经过良好测试的框架(如 jQuery)来解决此类问题。他们已经弄清楚了如何安全、正确地将脚本注入 DOM。除非您绝对不能为图书馆腾出带宽,否则重新发明轮子是没有意义的。
解决此问题的一种方法是在 Ajax 响应中将 JavaScript 与 HTML 分开,方法是发出两个请求(可能更慢)或在 JSON 对象中构建 JavaScript 和 HTML(可能更难维护)。
这是一个例子:
<script>
function load_content(){
var req = new XMLHttpRequest();
req.open("GET", "ajax.json", true);
req.onreadystatechange = function (e){
if (req.readyState === 4){
if (req.status === 200){
// these three lines inject your JavaScript and
// HTML content into the DOM
var json = JSON.parse(req.responseText);
document.getElementById("target").innerHTML = json.html;
eval(json.js);
} else {
console.log("Error", req.statusText);
}
}
};
req.send(null);
}
</script>
<a href="#" onclick="load_content()">Load more stuff</a>
<div id="target"></div>
服务器上的文档ajax.json
如下所示:
{
"js": "window.bar = function (){ console.log(\"bar\"); return false; }",
"html": "<p><a href=\"#\" onclick=\"bar();\">Log a message</a></p>"
}
如果您选择此路线,您必须:
- 命名你的函数:
MyApp.foo = function (){ ... };
,或
- 将您的函数显式添加到全局命名空间:
window.foo = function (){ ... };
.
这是因为eval
在当前范围内执行,因此您的函数定义继承了该范围并且不会全局可用。在我的示例中,我选择了后一个选项,因为它只是一个简单的示例,但您应该知道为什么这是必要的。
请务必阅读JavaScript 的 eval() 何时不邪恶?如果您决定自己实施。