脚本加载后调用javascript函数

IT技术 javascript jquery html
2021-02-07 00:37:24

我有一个 html 页面,我在其中通过如下所示的 javascript 动态附加 html

<script type="text/javascript" src="/myapp/htmlCode"></script>

我想调用一个js函数,例如loadedContent(); 一旦上述脚本添加了动态 html。

有人可以帮助我如何做到这一点吗?

6个回答

你可以在不使用 head.js javascript 的情况下实现这一点。

function loadScript( url, callback ) {
  var script = document.createElement( "script" )
  script.type = "text/javascript";
  if(script.readyState) {  // only required for IE <9
    script.onreadystatechange = function() {
      if ( script.readyState === "loaded" || script.readyState === "complete" ) {
        script.onreadystatechange = null;
        callback();
      }
    };
  } else {  //Others
    script.onload = function() {
      callback();
    };
  }

  script.src = url;
  document.getElementsByTagName( "head" )[0].appendChild( script );
}


// call the function...
loadScript(pathtoscript, function() {
  alert('script ready!'); 
});
onload处理器可以当脚本还没有执行完毕,不可能被调用,因为JavaScript是单线程的。这意味着onload处理程序只能在脚本开始执行之前或执行完成之后调用。我个人从未见过前一种情况发生......永远。如果有人知道onload可以在脚本开始执行之前调用处理程序的可重现情况,请告诉我们。
2021-03-15 00:37:24
@MaDude 你能参考一下相关的任何文档吗?
2021-03-17 00:37:24
加载脚本数组的简单扩展: function loadScripts (urls, callback) {var counter = 0 for (var i=0; i<urls.length; i++) { loadScript(urls[i], function () { if (++counter === urls.length) { callback() } }) } }
2021-03-31 00:37:24
仅供参考:onload适用于 IE 9 及更高版本 - 所以onload现在对大多数人来说只是设置可能没问题
2021-04-01 00:37:24
注意onload将在脚本“加载”的那一刻开始回调,而不是在它实际完成执行时,这令人失望
2021-04-11 00:37:24

我有同样的问题......我的解决方案(没有jQuery):

<script onload="loadedContent();" src ="/myapp/myCode.js"  ></script>
@guettli 不,不幸的是你不能随机数一个内联事件处理程序。只有元素内容是“不可重复的”,因此如果您尝试使用具有严格 CSP 的 OPs 属性,执行将会失败。
2021-03-24 00:37:24
请注意:这与严格的 CSP 不兼容。
2021-03-30 00:37:24
@布拉德利你确定吗?我想 addignonce="${nonce}"应该使它工作(未经测试的猜测)。
2021-04-09 00:37:24

如果您在 2021 年阅读这篇文章,那么您可能更习惯于 Promise。如果您的所有目标浏览器都支持 ES6 或者您正在使用 polyfill,则更可取的方法是更现代的方法。

此解决方案的工作原理类似于@JaykeshPatel答案,但它基于Promises:

// definition
function loadScript(scriptUrl) {
  const script = document.createElement('script');
  script.src = scriptUrl;
  document.body.appendChild(script);
  
  return new Promise((res, rej) => {
    script.onload = function() {
      res();
    }
    script.onerror = function () {
      rej();
    }
  });
}

// use
loadScript('http://your-cdn/jquery.js')
  .then(() => {
    console.log('Script loaded!');
  })
  .catch(() => {
    console.error('Script loading failed! Handle this error');
  });

您可以在res回调的参数中传递一些上下文变量,或者如果您的库导入了一些全局符号,您可以在那里引用它。

例如,由于 jQuery 引入了$全局符号,您可以res($)为其调用并创建一个局部作用域(如果您正在使用 TypeScript 并且不想在每个文件中声明module变量,则可以这样编写,这是完美的const $ = await loadScript(..))。

如果您不想传递任何参数,则可以像这样缩短代码:

script.onload = res;
script.onerror = rej;
script.onLoad = res; // 简化
2021-04-04 00:37:24
@Kunukn 还有一个较短的return new Promise(res => script.onload = res)但是将函数分配给onload更容易阅读,并允许您在解析时传递参数
2021-04-07 00:37:24

尝试这样的事情

var script = document.createElement('script');

if(script.readyState) {  //IE
script.onreadystatechange = function() {
  if ( script.readyState === "loaded" || script.readyState === "complete" ) {
    script.onreadystatechange = null;
    alert(jQuery);
  }
};
 } else{//others
script.onload = function() {
  alert(jQuery); 
}
}
script.src = "http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"
document.documentElement.appendChild(script);

实际上你可以把它loadedContent()作为你正在加载的脚本的最后一行(这是 JSONP 背后的概念)