我正在构建应异步加载的javascript小部件。
问题是页面上可能有不止一个这样的窗口小部件,并且应该通过通过{}向其发送选项数组来初始化该窗口小部件。
做到这一点的最佳方法是什么?我听说仅设置onload或onreadystatechange并不能在所有浏览器中使用。
我已经检查了digg小部件,但是我真的不能理解他们在做什么,有人可以看看吗?
这是他们的一些代码:
(function () {
var s, s1, diggWidget = {
id: "digg-widget-1282651415272",
width: 300,
display: "tabbed"
};
if (window.DiggWidget) {
if (typeof DiggWidget == 'function') {
new DiggWidget(diggWidget);
} else {
DiggWidget.push(diggWidget);
}
} else {
DiggWidget = [diggWidget];
s = document.createElement('SCRIPT');
s.type = 'text/javascript';
s.async = true;
s.src = 'http://widgets.digg.com/widgets.js';
s1 = document.getElementsByTagName('SCRIPT')[0];
s1.parentNode.insertBefore(s, s1);
}
})();
因此,如果DiggWidget已经可用(由于多个实例而较早加载),则如果DiggWidget是一个函数,它将创建一个新的小部件,否则将DiggWidget用作数组并将当前设置推入该数组。
首先,为什么DiggWidget会成为函数?
如果窗口小部件是唯一的窗口小部件(或第一个窗口小部件),则脚本标签是异步添加的,因此未定义回调。
然后,查看widgets.js,他们这样做:
在顶部:
(function () {
var A;
if (window.DiggWidget) {
if (typeof DiggWidget != "function") {
A = DiggWidget
} else {
return
}
}
在底部:
if (A) {
while (A.length) {
new DiggWidget(A.shift())
}
}
现在,我对此不太了解。 DiggWidget(数组)可用于该.js吗?它在一个匿名函数中。因此,如果我两次包含这样的脚本,DiggWidget不会每次都是新实例吗?
还是我完全错了?抱歉,是这样。如果有更好的方法来对脚本的多个实例进行回调,请务必告知。
最佳答案
首先,为什么DiggWidget会成为函数?
当异步脚本加载并执行时,它将成为一个函数
DiggWidget(数组)可用于该.js吗?
是的,window.DiggWidget
是全局的,因此可用于该脚本。
小部件的工作方式非常简单。
如果尚未加载DiggWidget
脚本,则window.DiggWidget
将不是函数。最初它将是一个未定义的变量,所以else块
} else {
DiggWidget = [diggWidget];
执行并将其定义为数组。从现在开始直到小部件脚本加载,它将被定义为一个数组。
现在,直到
DiggWidget
脚本异步加载为止,继续将所有初始化对象{..}
推入同名数组-window.DiggWidget
。加载脚本后,在覆盖全局
DiggWidget
变量之前,它会看到该数组中的对象,并将其安全地记录在其他位置。然后接管DiggWidget名称,遍历每个对象,并为每个对象初始化小部件。这是带有注释的完整嵌入代码。
用户密码
(function () {
var s, s1, diggWidget = {
id: "digg-widget-1282651415272",
width: 300,
display: "tabbed"
};
// either the external widget script has already loaded, or there is more than
// one widget to be embedded on the page, and the previous widget's embed code
// defined this variable
if (window.DiggWidget) {
// the external widget script has been loaded asynchronously
// because DiggWidget is a function. Can directly create a new object.
if (typeof DiggWidget == 'function') {
new DiggWidget(diggWidget);
}
// a previous widget's embed code defined this global array. Remember the
// widgets initialization settings for when the external script loads.
else {
DiggWidget.push(diggWidget);
}
}
// the external widget script has not loaded yet and
// this is the first widget ever to be embedded on the page
else {
// DiggWidget does not exist at this point. So make it an array
// and store the first widget's config object in it
DiggWidget = [diggWidget];
s = document.createElement('SCRIPT');
s.type = 'text/javascript';
s.async = true;
s.src = 'http://widgets.digg.com/widgets.js';
s1 = document.getElementsByTagName('SCRIPT')[0];
s1.parentNode.insertBefore(s, s1);
}
})();
小部件代码(在顶部)
(function () {
var A;
// global DiggWiget is defined. it will either be an array if
// the widget code hasn't loaded yet, or a function if it has
if (window.DiggWidget) {
// it's an array, so keep that array somewhere safe
// because we are gonna take over the DiggWidget variable purdy soon
if (typeof DiggWidget != "function") {
A = DiggWidget
}
// window.DiggWidget must be a function
// there is no widget to initialize, just return
else {
return
}
}
(在底部)
// A is the array of widget settings we backed up a little earlier
if (A) {
// loop through each config object and create the actual
// widget object
while (A.length) {
new DiggWidget(A.shift())
}
}