Pergunta

Estou usando o SIMILE para desenhar cronogramas dinâmicos. Também estou usando uma biblioteca interna para adicionar um blog de comentários. Nossa biblioteca interna usa o evento ONLOAD do elemento corporal para inicializar.

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

Mas o Simile parece ter sequestrado a Onload para seu próprio propósito, para que o Initcomments ('Myid') nunca seja executado.

Além de alterar o código do símile, como eu poderia fazer meu inicializador funcionar?

Eu preferiria não adicionar outra biblioteca (ou seja, jQuery) apenas para resolver o problema.

Foi útil?

Solução

Use jQuery's $(document).ready evento, que permite adicionar um número arbitrário de manipuladores (ao contrário onload).

Outras dicas

Primeiro, como regra geral, você deseja ficar longe de incorporar JavaScript em seu HTML como atributos de tag.

Em segundo lugar, o símile provavelmente está substituindo o onload (usando -o da mesma maneira que você é). Então, você deseja adicionar seu evento OnLoad depois de incluir o SIMILE.

Usando jQuery:

<script src="/js/blah/simile.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready(function() {
        initComments('myID');
    });
</script>

Usando nenhuma biblioteca (encontrado aqui):

<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>

Adicione jQuery e use

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

Existem algumas outras maneiras de escrever isso no jQuery, mas acho que isso é o mais explicativo.

Se você está fazendo algum tipo de desenvolvimento de javascript, você precisar estar olhando para o jQuery. É totalmente doce!

Além da solução jQuery acima mencionada (no entanto, eu recomendo usá -la, é ótimo) aqui está a solução simples de baunilha JS (como você não mencionou nada sobre jQuery em sua pergunta):

// 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'));

Por seqüestrado, você quer dizer, símile carrega após seu código e substitui onload? Nesse caso, certifique -se de ficar por trás (como Justin diz) e antes de você substituí -lo, armazenar o valor de onload Em algum lugar, então ainda é chamado (do seu próprio manipulador).

Ou seja, se você não usa jQuery.

Se você olhar aqui, verá uma solução que é o que o jQuery usa, acredito, ou uma modificação, mas deve funcionar para suas necessidades.

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; */

Você verá que a última linha é comentada. Caso chegue tão longe, você os derrubará (excomiação) ou seu código não será executado, mas isso funcionará para os principais navegadores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top