0

我正在使用 Simile 来绘制动态时间线。我还使用内部库来添加评论博客。我们的内部库使用 body 元素的 onload 事件进行初始化。

<body onload="initComments('myID')">

但是 Simile 似乎出于自己的目的劫持了 onload,因此 initComments('myID') 永远不会执行。

如果没有更改 Simile 代码,我怎样才能让我的初始化程序运行?

我不希望仅仅为了解决问题而添加另一个库(即 jQuery)。

4

6 回答 6

2

首先,作为一般规则,您希望远离将 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>
于 2009-11-09T21:42:18.877 回答
1

使用 jQuery 的$(document).ready事件,它允许您添加任意数量的处理程序(与 不同onload)。

于 2009-11-09T21:37:39.747 回答
1

除了前面提到的 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'));
于 2009-11-09T21:39:44.457 回答
1

添加jQuery并使用

$(document).ready(function(){
  // Your code here...
});

在 jQuery 中还有其他几种编写方式,但我发现这是最能说明问题的。

如果你正在做任何类型的 JavaScript 开发,你需要看看 jQuery。完全是甜的!

于 2009-11-09T21:39:54.630 回答
0

劫持,你的意思是,Simile 在你的代码之后加载并覆盖onload?在这种情况下,请确保您落后于它(正如贾斯汀所说),并且在您自己覆盖它之前,存储onload某处的值,因此它仍然会被调用(从您自己的处理程序)。

也就是说,如果你不使用 jQuery。

于 2009-11-09T21:45:49.237 回答
0

如果你看这里,你会看到一个 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; */

你会看到最后一行被注释掉了。如果它走得那么远,您将破坏它们(取消注释)或您的代码将无法运行,但这适用于主要浏览器。

于 2009-11-09T22:03:27.717 回答