【问题标题】:javascript - adding two script tags (in body) before continue another code from same js filejavascript - 在从同一个 js 文件继续另一个代码之前添加两个脚本标签(在正文中)
【发布时间】:2017-02-08 22:39:39
【问题描述】:

如何修改以下代码?在从函数 yourCodeToBeCalled 添加下一个代码之前,我想准确加载 两个 脚本。有人可以给初学者一个提示吗?我在评论后给出了我的建议//。

var loadJS = function(url, implementationCode){//url, url_Next
    //url is URL of external file, implementationCode is the code
    //to be called from the file, location is the location to 
    //insert the <script> element

    var scriptTag = document.createElement('script');//will add scriptTag_Next
    scriptTag.type = 'text/javascript';
    scriptTag.setAttribute('nonce','22os9h3sdfa');
    scriptTag.src = url;

    scriptTag.onload = implementationCode;//Will It be work? -> scriptTag.onload = scriptTag_Next = implementationCode;
    scriptTag.onreadystatechange = implementationCode;//like as above scriptTag_Next.onreadystatechange ??

    document.body.appendChild(scriptTag);
};
var yourCodeToBeCalled = function(){
    console.log('okay'); } loadJS('js/jquery-3_1_1.min.js', yourCodeToBeCalled);//My my suggestion loadJS('js/jquery-3_1_1.min.js', 'js/test.js' yourCodeToBeCalled)

我借用的原始代码:link

【问题讨论】:

  • “我想在同一个 js 文件中添加下一个代码之前恰好加载两个脚本” - 你能重新表述一下你的说法吗?
  • 为什么有人会降低我的主题评分?我尝试了很多组合以获得正确的结果。在下一个 js 代码之前是否可能加载多个脚本?
  • 不确定我是否理解,但为什么不加载脚本两次(通过创建 2 个脚本标签并填充)然后将代码添加到另一个 JS 文件中并以相同的方式加载它,这样你最终会加载 3 个脚本动态。
  • 再次提醒:如果您需要等待脚本,不要为该脚本使用asyncasync 属性适用于当您明确不想希望等待它完成加载后再继续下一步的情况。
  • 什么都没有减轻:您看到页面更快,但总的零到所有数据传输解析和活动是完全相同的,所以您为用户只看到比以前更早的页面支付的价格是(a)您的用户在“真正完成”之前与您的页面进行交互(可能有一些,甚至很多缺少功能)和(b)您不再保证任何事件顺序,因此如果您想“在运行脚本 3 之前等待 2 个脚本”,使用 async 完成会破坏任何执行此操作的能力。

标签: javascript html


【解决方案1】:

好的,我找到了一种逐个执行脚本的方法。由于加载脚本的顺序不正确,不再出现错误,例如:下一个脚本使用jQuery命令时缺少jQuery框架。所以我决定使用promises

var loadJS = function(url) { /*url is URL of external file*/
    return new Promise(function(resolve, reject) {
        var scriptTag = document.createElement('script');
        scriptTag.type = 'text/javascript';
        scriptTag.setAttribute('nonce', '22os9h3sdfa');
        scriptTag.onload = resolve;
        scriptTag.onerror = reject;
        scriptTag.src = url;
        document.body.appendChild(scriptTag);
    });
};

loadJS('js/jquery-3_1_1.min.js').then(() => { return loadJS('js/library.js'); }).then(() => {

    var $ = jQuery.noConflict();//jQuery.noConflict();
});

现在 'jquery-3_1_1.min.js' 在 'library.js' 等之后执行。

您好!

【讨论】:

【解决方案2】:

我不确定您为什么要将脚本元素添加到 location 元素。 而不是

location.appendChild(scriptTag);

你可以试试

document.body.appendChild(scriptTag);

【讨论】:

  • 当然,你说得对。我已经更正了,但我仍然不知道如何一次加入两个脚本(在 yourCodeToBeCalled 函数之前),例如'第一个 url:js/jquery-3_1_1.min.js &(下一个脚本)第二个 url:js/test.js '
【解决方案3】:

假设我正确理解您的要求,loadJS 是一个函数,所以只需调用它两次,然后调用您的代码:

(function() {
  var head = document.getElementsByTagName('head')
  loadJS('somescript.js', function() { console.log('on load') }, head)
  loadJS('somescript2.js', function() { console.log('on load2') }, head)

  // This is your code to execute once the scripts have loaded.
  console.log('Okay');
})();

此外,您还需要从 loadJS 中删除 scriptTag.async = true; 行,以便强制它等待直到加载完毕后再继续执行。

编辑:根据您最近的更改,您可以省略中间参数(回调),它将不需要。

编辑:鉴于您的最新更改,此代码应该可以工作:

(function() {
  loadJS('somescript.js')
  loadJS('somescript2.js')

  // This is your code to execute once the scripts have loaded.
  console.log('Okay');
})();

现在你在loadJS中有document.body.appendChild,你不需要传递元素。此外,您不需要使用回调,只需在 2 次 loadJS 调用之后调用您的代码(假设您已删除 async 属性)。

【讨论】:

  • 你已经接近解决我的问题了。我想在正文标签的底部添加脚本,而不是像您的情况那样在头标签中添加脚本:getElementsByTagName('head')。如果我添加两次loadJS(),那么我希望在第一个调用案例中没有回调。那个回调function() {} 可以是可选的吗?
  • 你还需要回调吗?你不能在loadJS 调用之后运行你的代码吗?
  • 是的,您可以,但我想在添加和执行这些动态脚本后运行代码(位于loadJS func 下方)。当然,如果我们能做到这一点:P 现在我看到你编辑了你的帖子。那么我可以从我的函数中删除:scriptTag.onload = implementationCode;scriptTag.onreadystatechange = implementationCode; 吗?
  • 这是my_website,我使用您的解决方案。当前的问题是执行首先添加的脚本。如果您可以查看控制台/调试器并告诉我为什么 jquery 不起作用:(
  • 我正要出门,所以现在不能看,但有时间再看。只是出于兴趣,您为什么要尝试动态加载这些脚本?为什么不手动将它们加载到 body 标签的底部?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2011-12-25
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多