Короткий вариант domReady()
Собственно, только что идея появилась :)
function domReady(fn) {
setTimeout(function(){
document.body ? fn() : setTimeout(arguments.callee, 0);
}, 0);
}
Имеет ли право на жизнь? Или есть какие-то подводные камни? |
масло-масляное
function domReady(fn) {
setTimeout(function(){
document.body ? fn() : domReady(fn);
}, 0);
}
или вообще
function domReady(fn) {
var timer=setInterval(function(){
if(document.body) {clearInterval(timer);fn();}
}, 13);//повысил интервал также
}
ИМХО код не имеет права на жизнь, из-за сомнительной кросбраузерности(не уверен что проверка одного только document.body будет достаточной) к тому же лучше там, где это возможно, обходится без setInterval или setTimeout, дабы не давать бессмысленную загрузку на процессор |
Хм, вот как раз вопрос "сомнительной кроссбраузерности" и интересует. Бегло проверил на 9 и 10 опере, 8,7,6 ие, 4 хроме и фф 2, 3 - работает.
Про таймеры согласен, но в противном случае - много больше кода получается.
var k = 0;
function domReady(fn){
setTimeout(function(){
++k;
document.body ? fn() : setTimeout(arguments.callee, 0);
}, 0);
}
domReady(function(){
document.getElementById('asd').style.color = '#f00';
alert(k) // 1 везде выдает
})
Причем не на пустой странице |
Цитата:
лично я, если мне нужен компактный и кросбраузерный код для мелких скриптов, выдергиваю его из jQuery кросбраузерней чем у них я не напишу, и в том, что я смогу написать компактней при тех же требованиях кроссбраузерности, у меня сомнений не возникает вот, код, который получился после выдирания:
(function(){
var readyBound = false;
var bindReady=function(){
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 );
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 );
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 ( isReady ) return;
try {
// If IE is used, use the trick by Diego Perini
// [url]http://javascript.nwbox.com/IEContentLoaded/[/url]
document.documentElement.doScroll("left");
} catch( error ) {
setTimeout( arguments.callee, 0 );
return;
}
// and execute any waiting functions
ready();
})();
}
// A fallback to window.onload, that will always work
if (window.addEventListener)
window.addEventListener('load', ready, false);
else if (window.attachEvent)
window.attachEvent('onload', ready);
else
window.onload=ready;
}
/////------------------------------------------------
var isReady=false;
var readyList= [];
// Handle when the DOM is ready
var ready=function() {
// Make sure that the DOM is not already loaded
if ( !isReady ) {
// Remember that the DOM is ready
isReady = true;
// If there are functions bound, to execute
if ( readyList ) {
// Execute all of them
var fn_temp=null
while(fn_temp=readyList.shift()){
fn_temp.call( document);
}
// Reset the list of functions
readyList = null;
}
// Trigger any bound ready events
//jQuery(document).triggerHandler("ready");//???
}
}
/////------------------------------------------------
domReady=function(fn) {
// Attach the listeners
bindReady();
// If the DOM is already ready
if ( isReady )
// Execute the function immediately
fn.call(document);
// Otherwise, remember the function for later
else
// Add the function to the wait list
readyList.push( fn );
return this;
}
})();
ну, вроде достаточно гладко выдрал, и все обернул в замыкание вызывать через
domReady(function(){
alert('OK');
});
если вас интересует в первую очередь мнимый выигрыш от минимизации кода, можете не использовать тогда я просто оставлю этот тут для следующих поколений |
Свойство document.body становится доступным сразу после открытия тега body, а не после закрытия. Так что ваше domReady будет срабатывать сильно раньше.
|
Спасибо, это и хотел услышать:)
|
Цитата:
|
Цитата:
|
Вот гадство:(
Самый короткий и кроссбраузерный способ узнать DOMReady - поместить скрипт перед </body>:) |
Почему гадство? Я всегда так и делаю.
|
| Часовой пояс GMT +3, время: 20:44. |