Javascript eval() 并不总是适用于附加到 div 内容的文本

标签 javascript jquery ajax dom eval

我使用AJAX将动态内容加载到#main_content元素:

var con = document.getElementById('main-content');
con.innerHTML = xhr.responseText;

但是,innerHTML script中不运行JS元素。为了评估它们,我使用

$("#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 中有解释。 .

关于Javascript eval() 并不总是适用于附加到 div 内容的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35246211/

相关文章:

javascript - 切换街景

javascript - ShallowWrapper::setState() 只能在类组件上调用

javascript - google+ 分享和 onendinteraction - 不确认

javascript - 传递包含变量的 HTML 元素以替换函数

javascript - 在每次绘制数据表时访问页码

javascript - 在 es6 类中制作 Canvas 场景

javascript - 如何将div内的内容克隆到其他div

javascript - 来自 2 个不同页面的 Codeigniter 3 多个 Ajax

javascript - 如何动态绑定(bind)ajax数据中的jquery静态数据

javascript - 如何在 Google Analytics 中设置 AJAX 调用跟踪?