【问题标题】:How to use dynamically generated javascript in an SRC attribute?如何在 SRC 属性中使用动态生成的 javascript?
【发布时间】:2014-04-08 08:32:50
【问题描述】:

我有一些 Javascript,它会生成其他 Javascript 代码并将其放入字符串中:

var my_string = "alert('Hello World!');";

(这对于我实际上是如何获得包含 JS 代码的字符串的方式过于简单化了,但不用说,通过一个太长而无法描述的过程,我最终得到了一个 - 这不是我能做到的改变。)

我想要做的是找出一种方法来使用包含在该字符串中的 Javascript,该字符串包含在我要写入文档头的新 SCRIPT 标记的 SRC 属性中。由于无法解释的原因,我无法将其内联。

我尝试使用 HTML5 本地存储来执行此操作,如下所示:

// Store
localStorage.setItem('hello', my_string);

// Access
var s = document.createElement('script');
s.setAttribute("type","text/javascript");
s.setAttribute("src", "javascript:localStorage.getItem('hello')");
document.head.appendChild(s);

但显然它只是不那样工作。出于同样的原因,不能使用 IDBObjectStore。

我还研究了使用 HTML5 FileSystem API,它完全可以解决我需要解决这个问题,但它只适用于 Chrome。我需要我的代码才能在 Firefox 中工作。

有什么办法可以做到吗?

【问题讨论】:

  • 尽管我已经写了一个答案,但我不确定我是否完全理解这个问题。为什么你认为你需要一个script 标签?

标签: javascript html


【解决方案1】:

src 属性必须引用一个作为 JavaScript 加载和评估的文件。如果您想将字符串评估为 JavaScript,只需使用 eval:

eval("localStorage.getItem('hello')");

当然,只有在输入可信的情况下,您才应该这样做。否则这是一个很大的安全漏洞。


如果你真的想使用脚本标签,你必须将代码设置为元素的内容

var s = document.createElement('script');
s.text = "localStorage.getItem('hello')";
document.head.appendChild(s);

【讨论】:

  • 谢谢。在这种情况下,.text 和 .innerHTML 之间有区别吗?或者它本质上是在做同样的事情?
  • 我真的不确定。通常,当您使用.innerHTML 时,HTML 解析器应该启动,如果您的源代码以某种方式包含有效的 HTML,这可能会导致问题。所以这就是为什么我认为.text 在这里是一个更安全的选择。
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多