问题标签 [dynamic-script-loading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
735 浏览

javascript - JavaScript脚本动态脚本加载IE6问题

我正在使用内部自定义库来复制 jsonp 调用。在你们要求我使用 JQuery 或其他库之前,让我告诉我由于某些限制我不能使用它。

以下是用于发出请求的代码:

这在第一次执行时有效。在随后的执行中,发出请求但不执行回调。

如果我使用如下的睡眠方法(在代码中注释),回调也会在后续调用中执行。

睡眠如何影响回调的执行?虽然在 Firefox 中运行良好。

0 投票
6 回答
1251 浏览

javascript - 动态脚本添加应该命令吗?

<script>页面加载后,我正在向 head 元素动态添加一些标签。我知道脚本是异步加载的,但是我可以期望它们按添加顺序进行解析吗?

我在 Firefox 中看到了预期的行为,但在 Safari 或 Chrome 中没有。查看 Chrome 开发人员工具和 Firebug 中的文档,均显示以下内容 -

但是查看资源加载视图,chrome 似乎会解析服务器首先返回的内容,而 firebug 总是按照添加脚本标签的顺序加载它们,即使 B 首先从服务器返回。

我应该期望 Chrome/Safari 以指定的顺序解析文件吗?在 OS X 10.6.3 上使用 Chrome 5.0.375.29 测试版

编辑(10/5/10):当我说解析时,我的意思是执行 - 可以看到积极解析的许多好处 - thx rikh

编辑(10 年 11 月 5 日):好的,所以我按照下面 juandopazo 的思路进行了测试。但是我添加了一些东西,包括

  1. 使用 javascript 直接将脚本元素添加到头部。(测试 A -> D)
  2. 使用 jquery 的 append() 方法将脚本元素添加到头部。(测试 E -> H)
  3. 使用 jquery 的 getScript() 方法“加载”脚本。(测试 I -> L)

我还尝试了脚本标签上“异步”和“延迟”属性的所有组合。

您可以在此处访问测试 - http://dyn-script-load.appspot.com/,并查看源代码以了解它是如何工作的。加载的脚本只需调用 update() 函数。

首先要注意的是,只有上面的第 1 和第 3 方法并行运行 - 第 2 方法按顺序执行请求。你可以在这里看到这个图表 -

图 1 - 请求生命周期图 请求生命
周期图 http://dyn-script-load.appspot.com/images/dynScriptGraph.png

有趣的是,jquery append() 方法也阻塞了 getScript() 调用——你可以看到它们都不会执行,直到所有 append() 调用都完成,然后它们都并行运行。最后要注意的是,jQuery append() 方法在执行后显然会从文档头部删除脚本标签。只有第一种方法将脚本标签留在文档中。

铬结果

结果是 Chrome 总是执行第一个返回的脚本,不管测试如何。这意味着所有测试“失败”,除了 jQuery append() 方法。

图 2 - Chrome 5.0.375.29 beta 结果
Chrome 结果 http://dyn-script-load.appspot.com/images/chromeDynScript.png

火狐结果

然而,在 firefox 上,如果使用第一种方法,并且 async 为 false(即未设置),那么脚本将可靠地按顺序执行。

图 3 - FF 3.6.3 结果
FF 结果 http://dyn-script-load.appspot.com/images/ffDynScript.png

请注意,Safari 似乎以与 Chrome 相同的方式给出不同的结果,这是有道理的。

此外,我在慢速脚本上只有 500 毫秒的延迟,只是为了保持开始->结束时间。您可能需要刷新几次才能看到 Chrome 和 Safari 在所有方面都失败了。

在我看来,如果没有这样做的方法,我们就没有利用并行检索数据的能力,也没有理由不应该这样做(如 Firefox 所示)。

0 投票
1 回答
342 浏览

javascript - 为什么不加载 jQuery?

当使用 importjs() 类型的函数时(参见下面的示例),jQuery 似乎没有在它后面的代码之前加载。

这是一个示例 html 文件:

使用上面的代码,警报应该成功触发。

接下来,注释掉第一个脚本块,即显式加载 jQuery 的那个,并取消注释第二个脚本块中的 importjs(f1) 行。这一次,警报不会触发,至少在 firefox 和 safari 中是这样。

现在,在“var $j=jQuery”行之前添加一个额外的警报。对我来说,无论我等待多长时间,它都适用于两种浏览器。setTimeout 可能也可以解决问题,但它也不是编写此类程序的理想方法。

如果javascript是单线程的,为什么importjs会失败?是因为 importjs 创建的新元素在第一个块完成之前不会“执行”,还是应该在创建新元素后立即执行?

0 投票
1 回答
2521 浏览

javascript - 如何禁用客户端脚本块服务器端 (asp.net)

我有 js 脚本块(很长的一个对发票页面具有编辑功能的块)。

我想在服务器端启用/禁用此功能。我想到的第一件事就是对标签说 runat="server",并将 visible=true/false 设置为 asp.net,认为 asp.net 不会为不可见项目呈现 HTML,因此该块不会根本不加载,这就是我想要的。但我很快意识到,对客户端代码说 runat="server" 是一个非常糟糕的主意 :)

除了从客户端加载脚本之外,还有哪些敌人的选择。因为我还有其他来自服务器的按钮 - 这也将启用可死...如果我为它们使用 js 代码会很丑...在此先感谢

0 投票
4 回答
32900 浏览

javascript - Require.js 和简单地创建一个有什么区别