我正在使用 Simile 来绘制动态时间线。我还使用内部库来添加评论博客。我们的内部库使用 body 元素的 onload 事件进行初始化。
<body onload="initComments('myID')">
但是 Simile 似乎出于自己的目的劫持了 onload,因此 initComments('myID') 永远不会执行。
如果没有更改 Simile 代码,我怎样才能让我的初始化程序运行?
我不希望仅仅为了解决问题而添加另一个库(即 jQuery)。
我正在使用 Simile 来绘制动态时间线。我还使用内部库来添加评论博客。我们的内部库使用 body 元素的 onload 事件进行初始化。
<body onload="initComments('myID')">
但是 Simile 似乎出于自己的目的劫持了 onload,因此 initComments('myID') 永远不会执行。
如果没有更改 Simile 代码,我怎样才能让我的初始化程序运行?
我不希望仅仅为了解决问题而添加另一个库(即 jQuery)。
首先,作为一般规则,您希望远离将 JavaScript 作为标签属性嵌入到 HTML 中。
其次,明喻很可能会覆盖onload
(以与您相同的方式使用)。因此,您需要在包含 Simile 后添加 onload 事件。
使用 jQuery:
<script src="/js/blah/simile.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function() {
initComments('myID');
});
</script>
不使用库(在此处找到):
<script src="/js/blah/simile.js" type="text/javascript"></script>
<script type="text/javascript">
function addOnloadEvent(fnc){
if ( window.addEventListener ) {
window.addEventListener( "load", fnc, false );
} else if ( window.attachEvent ) {
window.attachEvent( "onload", fnc );
}
else {
var oldOnload = window.onload || function() {};
window.onload = function(e) {
oldOnload(e);
window[fnc](e);
};
}
}
addOnloadEvent(function() { initComments('myID'); });
</script>
使用 jQuery 的$(document).ready
事件,它允许您添加任意数量的处理程序(与 不同onload
)。
除了前面提到的 jQuery 解决方案(但我强烈推荐使用它,它很棒),这里是普通的 JS 解决方案(因为您在问题中没有提到任何关于 jQuery 的内容):
// Add this to top of your script.
window.onload = function () {
for (var i = 0; arguments.callee.functions.length > i; i++) {
arguments.callee.functions[i]();
}
};
window.onload.functions = [];
// Now for every onload function you want to add, do:
window.onload.functions.push(initComments('myID'));
添加jQuery并使用
$(document).ready(function(){
// Your code here...
});
在 jQuery 中还有其他几种编写方式,但我发现这是最能说明问题的。
如果你正在做任何类型的 JavaScript 开发,你需要看看 jQuery。完全是甜的!
劫持,你的意思是,Simile 在你的代码之后加载并覆盖onload
?在这种情况下,请确保您落后于它(正如贾斯汀所说),并且在您自己覆盖它之前,存储onload
某处的值,因此它仍然会被调用(从您自己的处理程序)。
也就是说,如果你不使用 jQuery。
如果你看这里,你会看到一个 jQuery 使用的解决方案,我相信,或者它的修改,但它应该可以满足你的需要。
http://dean.edwards.name/weblog/2006/06/again/
// Dean Edwards/Matthias Miller/John Resig
function init() {
// quit if this function has already been called
if (arguments.callee.done) return;
// flag this function so we don't do the same thing twice
arguments.callee.done = true;
// kill the timer
if (_timer) clearInterval(_timer);
// do stuff
};
/* for Mozilla/Opera9 */
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", init, false);
}
/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
if (this.readyState == "complete") {
init(); // call the onload handler
}
};
/*@end @*/
/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
var _timer = setInterval(function() {
if (/loaded|complete/.test(document.readyState)) {
init(); // call the onload handler
}
}, 10);
}
/* for other browsers */
/*window.onload = init; */
你会看到最后一行被注释掉了。如果它走得那么远,您将破坏它们(取消注释)或您的代码将无法运行,但这适用于主要浏览器。