Существует замена на основе стандартов, DOMContentLoaded
, которая поддерживается более 98% браузеров , хотя не IE8:
document.addEventListener("DOMContentLoaded", function(event) {
//do work
});
Нативная функция jQuery намного больше сложнее, чем просто window.onload, как показано ниже.
function bindReady(){
if ( readyBound ) return;
readyBound = true;
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", function(){
document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
jQuery.ready();
}, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent("onreadystatechange", function(){
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", arguments.callee );
jQuery.ready();
}
});
// If IE and not an iframe
// continually check to see if the document is ready
if ( document.documentElement.doScroll && window == window.top ) (function(){
if ( jQuery.isReady ) return;
try {
// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
document.documentElement.doScroll("left");
} catch( error ) {
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
jQuery.ready();
})();
}
// A fallback to window.onload, that will always work
jQuery.event.add( window, "load", jQuery.ready );
}
JavaScript не имеет автономных пространств имен. Это имеет функции, которые могут обеспечить объем для разрешения имен и объектов, которые могут способствовать именованным данным, доступным в данном объеме.
Вот Ваш пример, исправленный:
var namespaces = { com: { example: { /* example.com's data */ } } }
Это - переменная namespaces
присваиваемый литерал объектов. Объект содержит одно свойство: com
, объект с одним свойством: example
, объект, который, по-видимому, содержал бы что-то интересное.
Так, можно ввести что-то как [1 115] namespaces.com.example. somePropertyOrFunctionOnExample и это будут все работать. Конечно, это также смешно. У Вас нет иерархического пространства имен, у Вас есть объект, содержащий объект, содержащий объект с материалом, о котором Вы на самом деле заботитесь.
var com_example_data = { /* example.com's data */ };
, Который работает точно также без бессмысленной иерархии.
Теперь , если Вы на самом деле хотите создать иерархию, можно попробовать что-то вроде этого:
com_example = com_example || {};
com_example.flags = com_example.flags || { active: false, restricted: true};
com_example.ops = com_example.ops || (function()
{
var launchCodes = "38925491753824"; // hidden / private
return {
activate: function() { /* ... */ },
destroyTheWorld: function() { /* ... */ }
};
})();
..., который, по моему скромному мнению, довольно краток.
Здесь была интересная статья Peter Michaux на Пространство имен JavaScript . Он обсуждает 3 различных типов пространства имен JavaScript:
я не буду незаконно заимствовать то, что он сказал здесь, но я думаю, что его статья очень информативна.
Peter даже пошел, насколько указать, что существуют соображения производительности с некоторыми из них. Я думаю, что эта тема была бы интересна говорить о рассмотрении, что новые планы Гармонии ECMAScript отбросили 4,0 плана относительно пространства имен и упаковки.
Я пытаюсь следовать конвенции Yahoo разбирания объекта родителя-одиночки в глобальной области видимости для содержания всего;
var FP = {};
FP.module = {};
FP.module.property = 'foo';
Для проверки Вы не перезаписываете существующий объект, Вы должны так что-то как:
if(!window.NameSpace) {
NameSpace = {};
}
или
var NameSpace = window.NameSpace || {};
Этот путь можно поместить это наверху каждого файла в приложении/веб-сайте, не волнуясь о перезаписи объекта пространства имен. Кроме того, это позволило бы Вам записать модульные тесты на каждый файл индивидуально.
Библиотека YUI библиотека имеет код, который обрабатывает пространство имен с помощью функции, которую можно найти предпочтительным. Другие библиотеки могут сделать это также.
Как альтернатива точке или подчеркиванию, Вы могли использовать символ знака доллара:
var namespaces$com$example = "data";
Мне также нравится это ( источник ):
(function() {
var a = 'Invisible outside of anonymous function';
function invisibleOutside() {
}
function visibleOutside() {
}
window.visibleOutside = visibleOutside;
var html = '--INSIDE Anonymous--';
html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
contentDiv.innerHTML = html + '<br/><br/>';
})();
var html = '--OUTSIDE Anonymous--';
html += '<br/> typeof invisibleOutside: ' + typeof invisibleOutside;
html += '<br/> typeof visibleOutside: ' + typeof visibleOutside;
contentDiv.innerHTML += html + '<br/>';