【问题标题】:Including html+javascript with javascript包括html+javascript和javascript
【发布时间】:2013-11-03 19:32:52
【问题描述】:

我正在处理这两个现有链接,尝试结合此处列出的策略。

How do I include a JavaScript file in another JavaScript file?

Execute my jQuery script after dynamically inserted jQuery library has finished loading

我已将我的问题归结为一个简单的脚本来演示我遇到的问题。我有这两个文件:

test2.html:

<script type="text/javascript">alert('test');</script>
foreign html;

test1.html:

<script type="text/javascript" language="javascript">
var xmlhttp;

    if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        // code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
        }
    }

    xmlhttp.open("GET", "test2.html", true);
    xmlhttp.send();
</script>
<div id="myDiv">my div</div>

显然 test1.html 应该对 test2.html 进行 ajax 调用,并将其 HTML 写入 div。当我运行 test1.html 时,它会执行此操作 - div 显示来自 test2.html 的“外部 html” - 但是它不会执行警报框。直接访问 test2.html 确实会显示警告框。

换句话说,我需要抓取远程网页的内容,并将其插入到 div 中,并执行其 javascript。 “真正的”test2.html 将使用 jquery,所以 test1.html 不能使用它,否则我要加载 jquery 两次。

================================================ ===

基于 cmets 警告我有关 XSS 并建议我更改架构,我正在编辑此内容以进行详细说明。这个项目的目标是我的用户可以在他们的网站上粘贴的“一块”html,这会带来很多功能。他们引入的功能包括加载 jquery 插件和 HTML。是的,我的用户必须相信我不会 XSS 攻击他们。就像您在使用 Google Analytics 时相信 Google 不会对您进行 XSS 攻击一样。我的帖子不是在寻求安全建议。我只是想让这个简单的“hello world”类型的示例工作。真正的应用程序是安全的。

当我在 test1.html 中使用 jquery 时,它确实导致 test2.html 中的 JS 被执行,但这只是一个人为的示例,与我的真实应用程序相比过于简化。真正的应用程序在 test2.html 中使用大量 jquery - 我需要能够更新我的服务器上的 test2.html,而不给我的用户新版本的 test1.html。让 test1.html 加载它自己的 jquery 版本需要很多开销,只需要包含 test2.html。

【问题讨论】:

  • 拜托,有人告诉他有关 XSS 攻击的事情。
  • 您的评论有点没有根据。我的帖子特别指出这是一个专门为复制问题而构建的示例。你对我正在构建的应用一无所知。
  • 是的,没错。这只是对您和其他可能阅读此问题的人的警告。
  • 对,好点 - 任何阅读此问题的人都应该知道 test1.html 正在将其 cookie 等暴露给控制 test2.html 的人 - 不过这是一个商业决策。公司通常以这种方式信任其他公司,例如人们在他们的页面上包含 Analytics 时信任 Google,或者人们信任 jquery CDN 等。
  • 我这样做的一种方法是使用 eval() 正如我在上面放置的链接和 Stratton 的回答中所讨论的那样,但是它需要我将所有 HTML 转换为 JS 字符串,并内联 test2.html 包含的所有外部 JS。除非有更好的方法,否则这可能必须解决。

标签: javascript html ajax


【解决方案1】:

如果你真的想这样做,你可以将你的 js 包装到一个 div 中,然后在加载 test2.html 的内容后使用eval() 执行 javascript
例如

eval(document.getElementById('script').innerHTML);

但是,您应该考虑更改应用程序的架构并改用回调函数
我还建议使用像 jquery 这样的库,因为它可以大大简化 ajax 调用和回调函数
我注意到的另一件事:您应该将 javascript 包装到 onload 函数中。如果您不这样做,您可能会在尝试将内容添加到在您调用该函数时可能不存在的 div 时出现 javascript 错误

【讨论】:

  • 我对建议持开放态度,但我已经基于特定的设计目标得出了这种方法,例如能够对我的用户拉入其网站的功能进行更改,而不必他们最终更新代码。请参阅我上面编辑的帖子进一步解释。使用 jquery 2x 是非常矫枉过正的。包含的内容使用 jquery 并且需要能够在用户更新其代码的情况下升级 jquery。缺少 onload 函数是这个人为示例所特有的,但谢谢。
【解决方案2】:

出于安全原因,您不应使用eval...

使用

(new Function(document.getElementById('script').innerHTML))()

https://stackoverflow.com/a/19711866/2450730

【讨论】:

    猜你喜欢
    • 2015-11-16
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多