Ano*_*ous 6 javascript callback onload onerror external-script
我正在加载一个使用回调函数的外部脚本,它返回一些特定的数据.如果未收到此数据,则应显示错误.
这是我做的代码:
<script>
//setting initial state so that function will only work once
var visitors_loaded=false;
var my_callback = function( data ) {
if (visitors_loaded) return 0;
if (data) {
//success: callback function is called and it has a proper data
visitors_loaded=true;
alert(JSON.stringify(data));
}
else alert ('error'); //something went wrong
};
</script>
<script onload="my_callback(null)" onerror="my_callback(null)"
src="https://api.clicky.com/api/stats/4?site_id=32020&sitekey=9a19b1a4d1171193&type=visitors&date=this-month&output=json&json_callback=my_callback"></script>
Run Code Online (Sandbox Code Playgroud)
正如你所看到的......很多东西可能会出错,所以我自然会添加一个onerror事件.如果您将脚本的主机名或域更改为不存在的内容,则会发生此错误事件.
但是,如果您只更改脚本的URL,它仍然可以连接到服务器并激活onload事件.我的回调函数不会被调用那些无效的请求,所以我也添加了一个onload处理程序.
现在的问题是,如果所有正常加载并返回数据,它将同时触发回调函数和onload.我注意到在onload之前触发了回调函数并设置了visitor_loaded变量,以便只调用一次处理函数.
到目前为止,它在JS小提琴和我的离线网站中完美运行,但我想知道这是否是预期的行为?在onload处理程序之前,json_callback函数是否总是优先?
json_callback 函数总是优先于 onload 处理程序吗?
如果外部脚本my_callback同步调用,那么是的。
scripting官方html5 规范中的部分描述了这些东西应该如何工作。该规范非常笼统,必须处理许多有关编码、CORSignore-destructive-writes counter等的细节。但对于这个问题我们不关心这些细节。
第4步有一个注释:
注意:这是编译和实际执行脚本的地方。
在第 7 步中,load事件被触发:
在脚本元素上触发一个名为 load 的简单事件。
因此规范定义该load事件始终在脚本执行后触发。
正如您所看到的,规范还告诉我们为什么onerror在更改 URL 时不会触发该事件。error仅当加载脚本失败时才会创建该事件。但所有请求都会https://api.clicky.com/api/stats/ 返回 HTTP 200 状态。无效的 URL 返回 XML,因此会引发 SyntaxError。但这不会导致onerror处理程序被触发。
正如其他人提到的,如果异步调用回调,他们可以在onload事件发生后调用您的回调。但我不明白为什么他们会在外部脚本中执行此异步操作。