【问题标题】:Javascript AJAX include file witth eval带有 eval 的 Javascript AJAX 包含文件
【发布时间】:2012-02-19 06:35:24
【问题描述】:

假设我有

1) HTML 文档。

2) 此 HTML 文档加载 Javascript 文件“code.js”,如下所示:

<script src="code.js">

3) 用户点击“code.js”中运行“fetchdata”功能的按钮,

4) “fetchdata”函数如下所示:

var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4) {
        myjsdata = xmlhttp.responseText;
    }
}
xmlhttp.open("GET", 'http://www.example.com/data.js', false);
xmlhttp.send(null);

...

现在我该如何成功完成以下操作:

我想以某种方式插入/评估我的 Javascript,因此“code.js”中的所有函数,包括“fetchdata”和上面/下面定义的函数都可以访问数据(结构、声明、预先计算的数据值等)。 ) 在“data.js”中。

(如果可能的话,我可以等待加载实际的 JS 数据文件,直到用户明确请求它。)

【问题讨论】:

  • 您是否使用 jQuery,或者有什么特殊原因不使用?它可以极大地帮助处理 ajax 调用之类的事情,因此您不必检查 readystate 和 status,您应该在成功时检查 200。

标签: javascript ajax include scope eval


【解决方案1】:

jQuery 总能满足一切需求:

http://api.jquery.com/jQuery.getScript/

从 url 加载一个 javascript 文件并在全局上下文中执行它。

编辑: 糟糕,没有看到您没有使用 jQuery。每个人都在使用 jQuery...

只要做:

var scrpt = document.createElement('script');
scrpt.src='http://www.example.com/data.js';
document.head.appendChild(scrpt);

【讨论】:

  • 谢谢!因此,我可以在“code.js”中使用您的代码,而不是使用 Ajax/related,而“code.js”中的函数将可以立即访问“data.js”中定义的所有变量等?我现在就试试看:)
  • @Tom,是的,向头部添加一个脚本元素会执行它。
  • "第1步:如果你使用jQuery,调用getScript函数。第2步:如果你没有使用jQuery,开始使用jQuery并返回第1步。"
  • 这似乎在 IE9 中有效,但在 FireFox 中似乎无效。应用您的“appendChild”代码后,“fetchdata”立即尝试在刚刚附加的“data.js”文件中调用一个函数(初始化数据)......但 FireFox 说这个调用已定义。
  • 如果我必须在使用有缺陷的多行脚本(可能无法扩展和健壮)和使用经过验证的库和单行调用之间做出选择,我会选择库方法- 它们的制作是为了让您不必重新发明轮子。
【解决方案2】:

我觉得你应该看看this site

本网站讨论动态加载和回调(带有示例) - 您可以在加载后调用已加载脚本中的函数。没有 jQUery,只有纯 JS。

【讨论】:

  • 使用“检测加载完成”中列出的两种方法(确保我不会冒着被这两种方法调用的风险)实际上解决了我在最新版本的 IE、FF、Opera、Chrome 中的其余问题。 .. 谢谢 :)
  • 这很完美。我试图加载 jQuery ......所以我没有 jQuery 开始加载 jQuery。
  • 完美运行。我让here 我的实现。
【解决方案3】:

这取决于很多因素,但在大多数情况下,您会希望一次性加载所有代码/html/css。它需要更少的请求,因此拥有更高的感知性能优势。除非您的代码文件超过几兆字节,否则没有必要在用户请求时加载它。

除此之外,修改innerHTML 和通过eval 运行脚本可能非常麻烦和冒险(分别)。许多在线参考资料将支持这一点。不要仅仅因为图书馆在做这样的事情,就认为它是安全的。

也就是说,完全可以加载外部js文件并执行。一种方法是将所有代码粘贴到新创建的脚本标签中。您也可以尝试在 eval 函数调用中运行代码(尽管不推荐)。

address = "testscript.js";

var req = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");
if(req == null) {
    console.log("Error: XMLHttpRequest failed to initiate.");
}
req.onload = function() {
    try {
        eval(req.responseText);
    } catch(e) {
        console.log("There was an error in the script file.");
    }
}
try {

    req.open("GET", address, true);
    req.send(null);

} catch(e) {
    console.log("Error retrieving data httpReq. Some browsers only accept cross-domain request with HTTP.");
}

【讨论】:

  • 问题是我的 data.js 在 200-500kb 之间。我更喜欢只在需要时加载它。但是,“eval”在哪里将代码放入范围/声明顺序中?我是否只需要调用“eval”,所有功能/变量等都将立即可用?
  • 理论上数据文件大小没有上限...如果人们可以接受的话,很容易更多...但是,现在我操作以“最小化尺寸和时间”的心态:)
  • eval 在我相信的全局范围内执行。运行外来脚本真的就是这么简单,这就是它如此危险的原因。
  • 只想对这个建议表示感谢!我赞成所有回复,因为它们都很有价值:)
  • 我是 JS 新手,我已经找了几天了!!!你是一个救生员!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2021-08-10
相关资源
最近更新 更多