Javascript eval() 并不总是处理附加到 div 内容的文本
Javascript eval() not always working on text appended to contents of a div
我使用 AJAX 将动态内容加载到 #main_content
元素:
var con = document.getElementById('main-content');
con.innerHTML = xhr.responseText;
然而,innerHTML
没有 运行 JS 中的 script
元素。为了评估它们,我使用
$("#main-content").find("script").each(function(i) {
eval($(this).text());
console.log($(this).text);
});
我加载的其中一个页面具有以下 <script>
元素,该元素得到执行并按预期工作:
<!-- AJAX response -->
<script>alert(123);</script>
但是,如果我在 AJAX 请求中定义函数,当我尝试调用它们时它们会显示为未定义:
<!-- AJAX response -->
<script>
function func() {
alert(123);
}
</script>
我不确定为什么第一个 <script>
元素被评估和执行,而第二个元素没有。它们都被同一个函数调用以加载和评估 div.
的内容
问题在于,在非严格模式下,由 direct eval
call 评估的全局变量成为调用 eval
:
范围内的局部变量
var code = "var foo = 123";
(function() {
eval(code); // direct call
foo; // 123
})();
foo; // ReferenceError: foo is not defined
在严格模式下有一些restricctions,所以变量也不会在本地范围内创建。
相反,如果您希望变量成为全局变量,您可以使用间接 eval 调用:
var code = "var foo = 123";
(function() {
window.eval(code); // indirect call
foo; // 123
})();
foo; // 123
这在 10.4.2 - Entering Eval Code 中有解释。
我使用 AJAX 将动态内容加载到 #main_content
元素:
var con = document.getElementById('main-content');
con.innerHTML = xhr.responseText;
然而,innerHTML
没有 运行 JS 中的 script
元素。为了评估它们,我使用
$("#main-content").find("script").each(function(i) {
eval($(this).text());
console.log($(this).text);
});
我加载的其中一个页面具有以下 <script>
元素,该元素得到执行并按预期工作:
<!-- AJAX response -->
<script>alert(123);</script>
但是,如果我在 AJAX 请求中定义函数,当我尝试调用它们时它们会显示为未定义:
<!-- AJAX response -->
<script>
function func() {
alert(123);
}
</script>
我不确定为什么第一个 <script>
元素被评估和执行,而第二个元素没有。它们都被同一个函数调用以加载和评估 div.
问题在于,在非严格模式下,由 direct eval
call 评估的全局变量成为调用 eval
:
var code = "var foo = 123";
(function() {
eval(code); // direct call
foo; // 123
})();
foo; // ReferenceError: foo is not defined
在严格模式下有一些restricctions,所以变量也不会在本地范围内创建。
相反,如果您希望变量成为全局变量,您可以使用间接 eval 调用:
var code = "var foo = 123";
(function() {
window.eval(code); // indirect call
foo; // 123
})();
foo; // 123
这在 10.4.2 - Entering Eval Code 中有解释。