Необходимо использовать событие onload тела, но сторонняя библиотека JavaScript его взломала - PullRequest
0 голосов
/ 10 ноября 2009

Я использую Simile для рисования динамических временных шкал. Я также использую собственную библиотеку для добавления блога с комментариями. Наша внутренняя библиотека использует событие onload элемента body для инициализации.

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

Но Simile, похоже, захватил onload для своих собственных целей, так что initComments ('myID') никогда не выполняется.

Если не считать изменения кода Simile, как я могу запустить мой инициализатор?

Я бы предпочел не добавлять другую библиотеку (например, jQuery) просто для решения проблемы.

Ответы [ 6 ]

2 голосов
/ 10 ноября 2009

Прежде всего, как правило, вы хотите избежать встраивания JavaScript в ваш HTML в качестве атрибутов тега.

Во-вторых, Simile, вероятно, перезаписывает onload (используя его так же, как вы). Итак, вы захотите добавить событие onload после включения Simile.

Использование 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>
1 голос
/ 10 ноября 2009

Добавьте в jQuery и используйте

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

Есть несколько других способов написать это в jQuery, но я считаю, что это наиболее объяснительно.

Если вы занимаетесь разработкой JavaScript, вам нужно , чтобы посмотреть на jQuery. Это совершенно мило!

1 голос
/ 10 ноября 2009

Помимо вышеупомянутого решения 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'));
1 голос
/ 10 ноября 2009

Используйте событие jQuery $(document).ready, которое позволяет добавить произвольное количество обработчиков (в отличие от onload).

0 голосов
/ 10 ноября 2009

Если вы посмотрите здесь, то увидите решение, которое, как я полагаю, использует 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; */

Вы увидите, что последняя строка закомментирована. В случае, если это зашло слишком далеко, вы либо закроете их (раскомментируете), либо ваш код не запустится, но это будет работать для основных браузеров.

0 голосов
/ 10 ноября 2009

Под угнанным вы имеете в виду, что Simile загружается после вашего кода и перезаписывает onload? В этом случае убедитесь, что вы отстаете от него (как говорит Джастин ), и прежде чем перезаписывать его самостоятельно, сохраните значение onload где-нибудь, чтобы оно все равно вызывалось (из вашего собственного обработчика).

То есть, если вы не используете jQuery.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...