2014-01-23 6 views
1

Существует несколько сообщений на StackOverflow и других веб-сайтах относительно проблемы избежания конфликтов пространства имен. В моем сценарии я просто хочу, чтобы метод в моем JavaScript выполнялся после доступа DOM.Что произойдет, если несколько скриптов устанавливают window.onload?

Если я сделаю следующее, это позволит избежать конфликтов пространства имен?

<script type="text/javascript">window.onload = function() { //Define my namespace var here, and execute all my code }</script> 

Что делать, если скрипт, который вводится позже, также устанавливает функцию onload? Будет ли меня переписываться? Я полностью понимаю, что я могу проверить это, но мне также хотелось бы получить некоторые отзывы, поскольку я новичок в JavaScript, и может быть ряд других сценариев, которые будут делать то, о чем я не знаю.

EDIT: Мне нужно только поддержать Safari 5.0+

+1

@ Ориол является правильным. Поскольку вы новичок в этом ... сделайте свою жизнь легкой ... используйте JQuery. Не поймите меня неправильно ... изучите JavaScript, но изучите его с помощью JQuery – CodeHacker

+0

Вне темы: имейте в виду, что если вы только хотите подождать, пока DOM будет готов, вы должны выслушать 'DOMContentLoaded' вместо' load', который пока изображения не будут загружены. – Oriol

ответ

2

Да, последний будет перезаписывать предыдущие.

Решение: используйте API нового события: addEventListener.

+0

addEventListener не будет работать с IE. Как уже было сказано, если нет особых причин не использовать jQuery, используйте jQuery $ (window) .on ("load", function() {}); –

+0

@MaksymKozlenko Не будет работать только на старых версиях IE, которые в настоящее время имеют очень низкое использование.И вы думаете, что каждый должен использовать jQuery, но другие люди (например, я) предпочитают другие фреймворки, такие как удивительно быстрый [vanilla-js] (http://vanilla-js.com/). – Oriol

+0

Написание кода на языке ассемблера также выполняется быстрее, но большинство из нас использует языки высокого уровня, такие как C++ или JavaScript. Pure JS хорош для простых вещей, но когда ваше приложение растет, вам нужно использовать некоторые фреймворки, чтобы сделать ваш код модульным. К сожалению, старые IE 7 и 8 по-прежнему остаются проблемой, поскольку некоторые ИТ-подразделения некоторых компаний слишком ленивы, чтобы обновить Windows или использовать другие, более совместимые со стандартами браузеры :-( –

0

Это прекрасный Javascript способ сделать это правильно

function addLoadEvent(func) { 
var oldonload = window.onload; 
if (typeof window.onload != 'function') { 
    window.onload = func; 
} else { 
    window.onload = function() { 
    if (oldonload) { 
     oldonload(); 
    } 
    func(); 
    } 
} 
} 
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad); 
addLoadEvent(function() { 
    /* more code to run on page load */ 
}); 

Explained Source

+0

Проблема в том, что, если у asker нет контроля над скриптом, t используйте этот код и перепишите его прослушиватель событий. – Oriol

0

Там много информации об этом, но вот короткая версия:

, если вы хотите, чтобы хорошо играть с на выгрузке, вы можете сделать

var prev_onLoad = window.onload; 
window.onload = function() { 
    if (typeof(prev_onLoad)=='function') 
     prev_onLoad(); 

    // rest of your onLoad handler goes here 
} 

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

Однако более современные браузеры имеют функции регистрации событий (addEventListener и attachEvent на IE), которые, в частности, занимаются этой цепочкой. Было написано несколько кросс-браузерных функций события onload, которые заботятся об этой логике для вас.

0

Это будет чрезмерно тяжело. В Javascript, когда вы определяете дескриптор события, как

window.onload = function(){ 
    console.log("in Load function 1"); 

}; 
window.onload = function(){ 
    console.log(" In load function 2"); 
}; 

Это сделает "назначить" window.onload =>() функцию. И window.onload будет назначаться последней функции.

Но в JQuery, Вы можете обрабатывать событие во много раз, и браузер сделает все

$("body").on("click",function(){ 
console.log("make a callback function 1"); 
}); 
$("body").on("click",function(){ 
console.log("make a callback function 2"); 
}); 

Поскольку JQuery сделать обратный вызов не «назначить». Надеюсь, он вам поможет.

Смежные вопросы