【问题标题】:What's the better practice: eval or append script?更好的做法是什么:评估或附加脚本?
【发布时间】:2012-02-03 13:52:02
【问题描述】:

我需要执行一段从 AJAX 调用中获得的自定义 JavaScript。我可以对字符串做一个eval,或者我可以将它附加到一个script-tag 到DOM。哪种方法更好?

var dynamicScript = 'alert(\'Hello world!\');';

方法 1 - 脚本

var x = '<script type="text/javascript">' + dynamicScript  +'</scr' + 'ipt>';
$(document.body).append(x);

方法 2 - 评估

eval(dynamicScript);

什么方法更好,为什么?还是有更好的选择?

【问题讨论】:

  • 附言。如果您决定使用方法 1,请将代码更改为 $('&lt;scipt&gt;').text(dynamicScript).appendTo(document.body); 想象一下当 dynamicScript 包含 "&lt;/script&gt;" 时会发生什么。

标签: javascript jquery dom eval


【解决方案1】:

我更喜欢eval,因为它通常是faster,而不是创建脚本标签并附加它(特别是如果你想使用jQuery创建和插入它)。

旁注(脚本标签的有用应用)我也使用脚本标签插入方法:在谷歌浏览器的扩展中,注入脚本标签是在页面范围内运行代码的唯一方法,因为window 对象是沙盒的。

PS。 jQuery.getScript() 的概念。这个方法可能有用。

【解决方案2】:

这两种方法都不适合您正在做的事情。您的 AJAX 调用应该返回数据而不是序列化脚本。您的两种方法都可以让您进行脚本注入。

eval 应该不惜一切代价避免。又慢又危险,eval is evil

【讨论】:

    【解决方案3】:

    如果 ajax 调用返回带有脚本标签的 html,您可以使用 $.load() 来导入脚本。

    http://api.jquery.com/load/

    【讨论】:

      【解决方案4】:

      将其添加到 DOM。原因(取自http://ajaxpatterns.org/On-Demand_Javascript):

      JavaScript 将自动被评估,就像在第一次遇到标记时评估静态 HTML 中链接的 JavaScript 一样。您可以声明一个裸函数或变量,而无需将其添加到窗口中。

      您可以从外部域加载 JavaScript。

      URL 指向特定的 Javascript 资源。使用 XMLHttpRequest,有更大的灵活性:例如,您可以在不同的 XML 节点中发送多个 JavaScript sn-ps。

      DOM 以不同的方式受到影响。即使行为是暂时的,脚本也会被添加到 DOM 中,而在 XMLHttpRequest 回调对其进行评估后它会消失。

      【讨论】:

      • 不一样。它正在讨论 javascript 存在于已知 url 的位置。在这里的问题中,两种选择都涉及由 ajax 调用动态生成的 javascript。
      猜你喜欢
      • 2010-12-22
      • 2023-03-17
      • 2016-08-03
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多