Javascript 替换jquery';s仅在加载DOM功能后运行
我试图消除对jQuery的依赖。我从underline.js中窃取了一些我需要的函数,但仍然需要在DOM加载后以与jQuery相同的方式运行我的代码 起初的 渴望的Javascript 替换jquery';s仅在加载DOM功能后运行,javascript,jquery,Javascript,Jquery,我试图消除对jQuery的依赖。我从underline.js中窃取了一些我需要的函数,但仍然需要在DOM加载后以与jQuery相同的方式运行我的代码 起初的 渴望的 有一个很好的解决方案 这里有一个脚本 /** * DOMReady * * @fileOverview * Cross browser object to attach functions that will be called * immediatly when the DOM is ready. *
有一个很好的解决方案 这里有一个脚本
/**
* DOMReady
*
* @fileOverview
* Cross browser object to attach functions that will be called
* immediatly when the DOM is ready.
* Released under MIT license.
* @version 2.0.0
* @author Victor Villaverde Laan
* @link http://www.freelancephp.net/domready-javascript-object-cross-browser/
* @link https://github.com/freelancephp/DOMReady
*/
/**
* @namespace DOMReady
*/
var DOMReady = (function () {
// Private vars
var fns = [],
isReady = false,
errorHandler = null,
run = function ( fn, args ) {
try {
// call function
fn.apply( this, args || [] );
} catch( err ) {
// error occured while executing function
if ( errorHandler )
errorHandler.call( this, err );
}
},
ready = function () {
isReady = true;
// call all registered functions
for ( var x = 0; x < fns.length; x++ )
run( fns[x].fn, fns[x].args || [] );
// clear handlers
fns = [];
};
/**
* Set error handler
* @static
* @param {Function} fn
* @return {DOMReady} For chaining
*/
this.setOnError = function ( fn ) {
errorHandler = fn;
// return this for chaining
return this;
};
/**
* Add code or function to execute when the DOM is ready
* @static
* @param {Function} fn
* @param {Array} args Arguments will be passed on when calling function
* @return {DOMReady} For chaining
*/
this.add = function ( fn, args ) {
// call imediately when DOM is already ready
if ( isReady ) {
run( fn, args );
} else {
// add to the list
fns[fns.length] = {
fn: fn,
args: args
};
}
// return this for chaining
return this;
};
// for all browsers except IE
if ( window.addEventListener ) {
document.addEventListener( 'DOMContentLoaded', function(){ ready(); }, false );
} else {
// for IE
// code taken from http://ajaxian.com/archives/iecontentloaded-yet-another-domcontentloaded
(function(){
// check IE's proprietary DOM members
if ( ! document.uniqueID && document.expando ) return;
// you can create any tagName, even customTag like <document :ready />
var tempNode = document.createElement( 'document:ready' );
try {
// see if it throws errors until after ondocumentready
tempNode.doScroll( 'left' );
// call ready
ready();
} catch ( err ) {
setTimeout( arguments.callee, 0 );
}
})();
}
return this;
})();
我将把我的问题留在这里,因为我在搜索stack overflow的答案后问了,但搜索了我猜的wring术语。我希望其他人会觉得这个答案有用 最初,我打算设计一个功能等同于jQuery的解决方案,但没有jQuery依赖性。事实证明,这是非常大和复杂的 然后我决定要一个简洁的解决方案,因为删除jQuery依赖性的原因是为了在低规格设备上更快地加载代码 我只针对Android移动设备,我最终使用了以下功能:
function afterload(content){
/in/.test(document.readyState)
? setTimeout(function(){ afterload(content) }, 9)
: content()
}
它也应该在桌面浏览器上运行,显然在所有主要浏览器上都进行了测试。详细信息和FFI的修复如果您查看jQuery源代码,那么检测文档就绪要比您想象的困难得多……我认为这也可能对您有所帮助。在这方面已经有几个问题了。
/**
* DOMReady
*
* @fileOverview
* Cross browser object to attach functions that will be called
* immediatly when the DOM is ready.
* Released under MIT license.
* @version 2.0.0
* @author Victor Villaverde Laan
* @link http://www.freelancephp.net/domready-javascript-object-cross-browser/
* @link https://github.com/freelancephp/DOMReady
*/
/**
* @namespace DOMReady
*/
var DOMReady = (function () {
// Private vars
var fns = [],
isReady = false,
errorHandler = null,
run = function ( fn, args ) {
try {
// call function
fn.apply( this, args || [] );
} catch( err ) {
// error occured while executing function
if ( errorHandler )
errorHandler.call( this, err );
}
},
ready = function () {
isReady = true;
// call all registered functions
for ( var x = 0; x < fns.length; x++ )
run( fns[x].fn, fns[x].args || [] );
// clear handlers
fns = [];
};
/**
* Set error handler
* @static
* @param {Function} fn
* @return {DOMReady} For chaining
*/
this.setOnError = function ( fn ) {
errorHandler = fn;
// return this for chaining
return this;
};
/**
* Add code or function to execute when the DOM is ready
* @static
* @param {Function} fn
* @param {Array} args Arguments will be passed on when calling function
* @return {DOMReady} For chaining
*/
this.add = function ( fn, args ) {
// call imediately when DOM is already ready
if ( isReady ) {
run( fn, args );
} else {
// add to the list
fns[fns.length] = {
fn: fn,
args: args
};
}
// return this for chaining
return this;
};
// for all browsers except IE
if ( window.addEventListener ) {
document.addEventListener( 'DOMContentLoaded', function(){ ready(); }, false );
} else {
// for IE
// code taken from http://ajaxian.com/archives/iecontentloaded-yet-another-domcontentloaded
(function(){
// check IE's proprietary DOM members
if ( ! document.uniqueID && document.expando ) return;
// you can create any tagName, even customTag like <document :ready />
var tempNode = document.createElement( 'document:ready' );
try {
// see if it throws errors until after ondocumentready
tempNode.doScroll( 'left' );
// call ready
ready();
} catch ( err ) {
setTimeout( arguments.callee, 0 );
}
})();
}
return this;
})();
DOMReady.add(function (){
alert( 'DOM is ready!' );
});
function afterload(content){
/in/.test(document.readyState)
? setTimeout(function(){ afterload(content) }, 9)
: content()
}