问题标签 [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.
javascript - JavaScript脚本动态脚本加载IE6问题
我正在使用内部自定义库来复制 jsonp 调用。在你们要求我使用 JQuery 或其他库之前,让我告诉我由于某些限制我不能使用它。
以下是用于发出请求的代码:
这在第一次执行时有效。在随后的执行中,发出请求但不执行回调。
如果我使用如下的睡眠方法(在代码中注释),回调也会在后续调用中执行。
睡眠如何影响回调的执行?虽然在 Firefox 中运行良好。
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 的思路进行了测试。但是我添加了一些东西,包括
- 使用 javascript 直接将脚本元素添加到头部。(测试 A -> D)
- 使用 jquery 的 append() 方法将脚本元素添加到头部。(测试 E -> H)
- 使用 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 所示)。
javascript - 为什么不加载 jQuery?
当使用 importjs() 类型的函数时(参见下面的示例),jQuery 似乎没有在它后面的代码之前加载。
这是一个示例 html 文件:
使用上面的代码,警报应该成功触发。
接下来,注释掉第一个脚本块,即显式加载 jQuery 的那个,并取消注释第二个脚本块中的 importjs(f1) 行。这一次,警报不会触发,至少在 firefox 和 safari 中是这样。
现在,在“var $j=jQuery”行之前添加一个额外的警报。对我来说,无论我等待多长时间,它都适用于两种浏览器。setTimeout 可能也可以解决问题,但它也不是编写此类程序的理想方法。
如果javascript是单线程的,为什么importjs会失败?是因为 importjs 创建的新元素在第一个块完成之前不会“执行”,还是应该在创建新元素后立即执行?
javascript - 如何禁用客户端脚本块服务器端 (asp.net)
我有 js 脚本块(很长的一个对发票页面具有编辑功能的块)。
我想在服务器端启用/禁用此功能。我想到的第一件事就是对标签说 runat="server",并将 visible=true/false 设置为 asp.net,认为 asp.net 不会为不可见项目呈现 HTML,因此该块不会根本不加载,这就是我想要的。但我很快意识到,对客户端代码说 runat="server" 是一个非常糟糕的主意 :)
除了从客户端加载脚本之外,还有哪些敌人的选择。因为我还有其他来自服务器的按钮 - 这也将启用可死...如果我为它们使用 js 代码会很丑...在此先感谢