javascript - 异步脚本加载回调

标签 javascript function asynchronous callback

http://jsfiddle.net/JamesKyle/HQDu6/

我创建了一个基于 Mathias Bynens Optimization of the Google Analytics asynchronous script 的简短函数如下:

function async(src) {
  var d = document, t = 'script',
      o = d.createElement(t),
      s = d.getElementsByTagName(t)[0];
  o.src = '//' + src;
  s.parentNode.insertBefore(o, s);
}

这非常有效,我已经开始将它用于几个不同的脚本

// Crazy Egg
async('dnn506yrbagrg.cloudfront.net/pages/scripts/XXXXX/XXXXX.js?' + Math.floor(new Date().getTime() / 3600000));

// User Voice
var uvOptions = {};
async('widget.uservoice.com/XXXXX.js');

// Google Analytics
var _gaq = [['_setAccount', 'UA-XXXXX-XX'], ['_setDomainName', 'coachup.com'], ['_trackPageview']];
async('google-analytics.com/ga.js');

// Stripe
async('js.stripe.com/v1');​

当我遇到加载后需要调用的脚本时,问题就出现了:

// Snap Engage
async('snapabug.appspot.com/snapabug.js');
SnapABug.init('XXXXX-XXXXX-XXXXX-XXXXX-XXXXX');

所以我想我应该把它变成一个回调函数,这样使用:

async('snapabug.appspot.com/snapabug.js', function() {
    SnapABug.init('XXXXX-XXXXX-XXXXX-XXXXX-XXXXX');
});

我没想到这对我来说很难做到,但结果却是这样。

我的问题是添加回调而不使代码过于复杂的最有效方法是什么。

See the jsfiddle: http://jsfiddle.net/JamesKyle/HQDu6/

最佳答案

谢谢RASG对于 https://stackoverflow.com/a/3211647/982924

带回调的异步函数:

function async(u, c) {
  var d = document, t = 'script',
      o = d.createElement(t),
      s = d.getElementsByTagName(t)[0];
  o.src = '//' + u;
  if (c) { o.addEventListener('load', function (e) { c(null, e); }, false); }
  s.parentNode.insertBefore(o, s);
}

用法:

async('snapabug.appspot.com/snapabug.js', function() {
    SnapABug.init('XXXXX-XXXXX-XXXXX-XXXXX-XXXXX');
});

jsFiddle

关于javascript - 异步脚本加载回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12820953/

相关文章:

javascript - 使用javascript检查输入是否为整数

c# - 调用 .Show on new Window 时 UI 卡住

java - 遗传算法-收敛性

Javascript : functions without prototype

c# - 异步库最佳实践 : ConfigureAwait(false) vs. 设置同步上下文

java - ResponseListener 在 snmp4j 中的工作原理

javascript - JavaScript 中的测验 : Convert into binary numbers, 覆盖数组

javascript - 在一行中 react jsx 中的内联函数

javascript - SVG 路径不显示

python - 如何将带有参数的函数作为参数传递给Python中的另一个函数(函数名作为字符串)?