Javascript 在插入脚本标记后调用回调

Javascript 在插入脚本标记后调用回调,javascript,jquery,Javascript,Jquery,我寻找答案,但没有找到。如果屏幕大于768px,我想包括Nivo滑块脚本。我有一个函数,在窗口大小大于768px时创建一个脚本标记,然后从这个脚本调用一个函数 $(function(){ (function(d, s, id){ if(window.innerWidth > 768){ var js, fjs = d.getElementsByTagName(s)[0]; js = d.createEleme

我寻找答案,但没有找到。如果屏幕大于768px,我想包括Nivo滑块脚本。我有一个函数,在窗口大小大于768px时创建一个脚本标记,然后从这个脚本调用一个函数

    $(function(){

    (function(d, s, id){
        if(window.innerWidth > 768){
            var js, fjs = d.getElementsByTagName(s)[0];
            js = d.createElement(s); js.id = id;
            js.src = "plugins/nivo-slider/jquery.nivo.slider.js";
            fjs.parentNode.insertBefore(js, fjs);
            $('#slider').nivoSlider();
        }
    }(document, 'script', 'nivo'));

    });
Javascript在插入脚本标记后立即调用
nivoSlider()
方法,但脚本尚未加载。如果我将nivo方法放在
setTimeout()
中,它就可以工作,但这是一个蹩脚的hack


有什么想法吗?

您正在使用jQuery,因此请使用jQuery加载脚本并使用成功处理程序

$.ajax({
  url: "plugins/nivo-slider/jquery.nivo.slider.js",
  dataType: "script",
  cache : true,
  success: function() {
      $('#slider').nivoSlider();
  }
});

您正在使用jQuery,因此请使用jQuery加载脚本并使用成功处理程序

$.ajax({
  url: "plugins/nivo-slider/jquery.nivo.slider.js",
  dataType: "script",
  cache : true,
  success: function() {
      $('#slider').nivoSlider();
  }
});

我建议使用
jQuery.getScript

或者如果你真的想成为本地人:

js.onload = js.onreadystatechange = function() {
  var state = this.readyState;
  if( !this.loaded && ( !state || state=='loaded' || state=='complete' ) ) {
    this.loaded = 1;
    $('#slider').nivoSlider();
  }
}

我建议使用
jQuery.getScript

或者如果你真的想成为本地人:

js.onload = js.onreadystatechange = function() {
  var state = this.readyState;
  if( !this.loaded && ( !state || state=='loaded' || state=='complete' ) ) {
    this.loaded = 1;
    $('#slider').nivoSlider();
  }
}

从文档中可以看出,“一旦加载脚本,就会触发回调,但不一定执行。”调用.nivoSlider()?@Ceres时,如何保证脚本已执行?这是一条有趣的语句,但我从未纠正过脚本延迟执行的情况。我想这更像是一个“免责声明”。我添加了一个本机onload,以便您可以选择毒药。感谢您的分享,@David。从文档中,它声明“一旦加载脚本,就会触发回调,但不一定执行。”您如何保证在调用.nivoSlider()时脚本已执行?@Ceres这是一条有趣的语句,但是我从来没有考虑过脚本延迟执行的情况。我想这更像是一个“免责声明”。我添加了一个本地的onload,这样你就可以选择你的毒药了。谢谢你的分享,@David。为什么我以前没想到呢?谢谢@epascarello,对我来说很好。@RGraham这与getScript相同,只是getScript禁用了缓存,这是不好的。缓存绝对不错。不进行版本控制当然是不好的。不,这是不好的,因为对文件的每个请求都会命中服务器!哈哈,我把它误读为默认情况下
getScript
缓存。对不起:)我一直在想你为什么我以前没想到?谢谢@epascarello,对我来说很好。@RGraham这与getScript相同,只是getScript禁用了缓存,这是不好的。缓存绝对不错。不进行版本控制当然是不好的。不,这是不好的,因为对文件的每个请求都会命中服务器!哈哈,我把它误读为默认情况下
getScript
缓存。对不起:)不管怎样,我还是会喜欢你的