JavaScript-jquery 将 $ 作为参数 传入 jQuery(),导致提示 页面的某个脚本正忙的问题。
代码例如:
<script type="text/javascript">
jQuery($);
</script>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
代码例如:
<script type="text/javascript">
jQuery($);
</script>
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
jQuery($);这个$是jQuery里的,还是你执行jQuery.noConflict();另外定义了呢?
如果是jQuery,那jQuery($);应该是僵死程序或者称为死循环!jQuery($)和jQuery(jQuery);一样的。
我看的是最新版1.7.0的源码,为了这个回答这个题才去看JQuery的核心代码。
大致解析是这样的:
在jQuery的初始化方法里会判断jQuery()里的参数类型是什么,当传的是一个$里,由于jQuery在内部里设置了window.jQuery = window.$ = jQuery;所以$也就是jQuery,它们是同一个对象,那么当jQuery($)时实际上传的是jQuery(jQuery); OK,咱们看看它的解析流程:
在200行的地方有如下代码:
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
此时的selector对象就是我们传的$,由于$的类型是一个function,那么它会执行rootjQuery.ready( selector )
接下来看看ready方法:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
ready()里的jQuery.bindReady()方法对应如下代码,这个方法里有一个window.attachEvent( "onload", jQuery.ready );这个是关键,就是当页面加载完成时调用jQuery.ready()方法,接着我们继续往下看
问题出在这一句:
// Add the callback
readyList.add( fn );
当我们传进来的$,就是现在这个fn,ready()方法会把我们传进来的$加入到 readyList这个回调函数列表里,这样每运行一次ready()就会把我们的$加入到一次ready()方法里,所以就造成了死循环了。
bindReady: function() {
if ( readyList ) {
return;
}
readyList = jQuery.Callbacks( "once memory" );
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
return setTimeout( jQuery.ready, 1 );
}
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", 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", DOMContentLoaded );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );
// 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 ) {
doScrollCheck();
}
}
},
入口方法
init: function( selector, context ) {
。。。。。
else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );**//由于$是func,调用ready方法**
}
ready方法
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// If the DOM is already ready
if ( jQuery.isReady ) {
// Execute the function immediately
fn.call( document, jQuery );**//又调用jQuery($)了**
// Otherwise, remember the function for later
} else if ( readyList ) {
// Add the function to the wait list
readyList.push( fn );
}
return this;
},
在ready里面造成死循环