gpt4 book ai didi

javascript - $(文档).ready() 来源

转载 作者:可可西里 更新时间:2023-11-01 02:41:36 29 4
gpt4 key购买 nike

我需要等待我的 JavaScript 中的文档准备就绪,才能在正文底部插入一个 div。

我想:

  • 使此 JavaScript 文件尽可能小(如果可能,将其编译到 < 1kb)
  • 在闭包中内联提供文档就绪性的代码(不导出它)

在我的文件中内联整个 jQuery 源代码会太大,所以我正在寻找其他方法。 window.onload 会起作用,但我特别希望文档准备就绪,而不是等待 window.onload 事件。

有人知道可以执行此操作的 JS 代码段吗?或者我应该只复制部分 jQuery 源代码?

编辑:

我设法抓取了 jQuery 源代码并将其与以下代码片段放在一起:

var ready = (function () {
var ready_event_fired = false;
var ready_event_listener = function (fn) {

// Create an idempotent version of the 'fn' function
var idempotent_fn = function () {
if (ready_event_fired) {
return;
}
ready_event_fired = true;
return fn();
}

// The DOM ready check for Internet Explorer
var do_scroll_check = function () {
if (ready_event_fired) {
return;
}

// If IE is used, use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
try {
document.documentElement.doScroll('left');
} catch(e) {
setTimeout(do_scroll_check, 1);
return;
}

// Execute any waiting functions
return idempotent_fn();
}

// If the browser ready event has already occured
if (document.readyState === "complete") {
return idempotent_fn()
}

// Mozilla, Opera and webkit nightlies currently support this event
if (document.addEventListener) {

// Use the handy event callback
document.addEventListener("DOMContentLoaded", idempotent_fn, false);

// A fallback to window.onload, that will always work
window.addEventListener("load", idempotent_fn, 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", idempotent_fn);

// A fallback to window.onload, that will always work
window.attachEvent("onload", idempotent_fn);

// If IE and not a frame: continually check to see if the document is ready
var toplevel = false;

try {
toplevel = window.frameElement == null;
} catch (e) {}

if (document.documentElement.doScroll && toplevel) {
return do_scroll_check();
}
}
};
return ready_event_listener;
})();

// TEST
var ready_1 = function () {
alert("ready 1");
};
var ready_2 = function () {
alert("ready 2");
};
ready(function () {
ready_1();
ready_2();
});

非常感谢您帮助我在 jQuery 源代码中找到它。我现在可以将所有这些放在一个闭包中,并在不导出任何函数和污染全局范围的情况下完成我的工作。

最佳答案

一种选择是从 github 获取 core.js jQuery 文件。

对于不需要的代码,您可能可以将其精简很多。然后通过 YUI 压缩器运行它,它应该很小。

我试过了,这段代码工作正常:

$(function() {
var newDiv = document.createElement('div');
document.getElementsByTagName('body')[0].appendChild(newDiv);
});

更新:这和我得到的一样小。它完全来自 jQuery,大约 1,278 字节(压缩后)。 gzip 时应该会变小。

唯一的区别是你需要这样调用它:

$.fn.ready(function() {
// your code
});

YUI 压缩:

(function(){var e=function(i,j){},c=window.jQuery,h=window.$,d,g=false,f=[],b;e.fn={ready:function(i){e.bindReady();if(e.isReady){i.call(document,e)}else{if(f){f.push(i)}}return this}};e.isReady=false;e.ready=function(){if(!e.isReady){if(!document.body){return setTimeout(e.ready,13)}e.isReady=true;if(f){var k,j=0;while((k=f[j++])){k.call(document,e)}f=null}if(e.fn.triggerHandler){e(document).triggerHandler("ready")}}};e.bindReady=function(){if(g){return}g=true;if(document.readyState==="complete"){return e.ready()}if(document.addEventListener){document.addEventListener("DOMContentLoaded",b,false);window.addEventListener("load",e.ready,false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",b);window.attachEvent("onload",e.ready);var i=false;try{i=window.frameElement==null}catch(j){}if(document.documentElement.doScroll&&i){a()}}}};d=e(document);if(document.addEventListener){b=function(){document.removeEventListener("DOMContentLoaded",b,false);e.ready()}}else{if(document.attachEvent){b=function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",b);e.ready()}}}}function a(){if(e.isReady){return}try{document.documentElement.doScroll("left")}catch(i){setTimeout(a,1);return}e.ready()}window.jQuery=window.$=e})();

完整源代码(同样,这是 jQuery 代码):

(function() {
var jQuery = function( selector, context ) {
},
_jQuery = window.jQuery,
_$ = window.$,

rootjQuery,
readyBound = false,
readyList = [],
DOMContentLoaded;

jQuery.fn = {
ready: function( fn ) {
jQuery.bindReady();
if ( jQuery.isReady ) {
fn.call( document, jQuery );
} else if ( readyList ) {
readyList.push( fn );
}
return this;
}
};
jQuery.isReady = false;
jQuery.ready = function() {
if ( !jQuery.isReady ) {
if ( !document.body ) {
return setTimeout( jQuery.ready, 13 );
}
jQuery.isReady = true;
if ( readyList ) {
var fn, i = 0;
while ( (fn = readyList[ i++ ]) ) {
fn.call( document, jQuery );
}
readyList = null;
}
if ( jQuery.fn.triggerHandler ) {
jQuery( document ).triggerHandler( "ready" );
}
}
};
jQuery.bindReady = function() {
if ( readyBound ) {
return;
}
readyBound = true;

if ( document.readyState === "complete" ) {
return jQuery.ready();
}
if ( document.addEventListener ) {
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
window.addEventListener( "load", jQuery.ready, false );
} else if ( document.attachEvent ) {

document.attachEvent("onreadystatechange", DOMContentLoaded);
window.attachEvent( "onload", jQuery.ready );

var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
};
rootjQuery = jQuery(document);
if ( document.addEventListener ) {
DOMContentLoaded = function() {
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
jQuery.ready();
};
} else if ( document.attachEvent ) {
DOMContentLoaded = function() {
if ( document.readyState === "complete" ) {
document.detachEvent( "onreadystatechange", DOMContentLoaded );
jQuery.ready();
}
};
}
function doScrollCheck() {
if ( jQuery.isReady ) {
return;
}
try {

document.documentElement.doScroll("left");
} catch(e) {
setTimeout( doScrollCheck, 1 );
return;
}
jQuery.ready();
}
window.jQuery = window.$ = jQuery;
})();

我确定还有更多字节可以删除。

不要忘记:

/*!
* jQuery JavaScript Library v1.4.2
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/

关于javascript - $(文档).ready() 来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3430455/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com