Skip to main content

Bug Tracker

Side navigation

#5209 closed bug (duplicate)

Opened September 13, 2009 06:09AM UTC

Closed September 14, 2009 05:18PM UTC

$().ready() assumes nothing is added to $.readyList during processing of $.readyList

Reported by: brianfreud Owned by:
Priority: major Milestone: 1.4
Component: core Version: 1.3.2
Keywords: patch Cc:
Blocked by: Blocking:
Description

If you have several $() functions, and want to control their load order, there's not currently any way to do it. $.ready() runs $.each() on $.readyList, and $.each assumes that the array is static. If, then, a function in $() tries to control its own position in $.readyList, or for whatever reason, you were to add a new $() closure within a $() function, neither would currently run.

Example:

$(function ($) {

if (jQuery.readyList.length > 1) { // Ensure that this loads *after* everything else also running at document ready.

jQuery.readyList.push(arguments.callee);

} else {

alert('I'm running last.');

}(jQuery));

Currently, 'I'm running last.' will never alert. This $() function gets only a single chance to run, on the first time $.each() passes over it.

Fix:

Change the following in $.ready (lines 3028 - 3037):

			// If there are functions bound, to execute
			if ( jQuery.readyList ) {
				// Execute all of them
				jQuery.each( jQuery.readyList, function(){
					this.call( document, jQuery );
				});

				// Reset the list of functions
				jQuery.readyList = null;
			}

to this:

			// If there are functions bound, to execute
			if ( jQuery.readyList ) {
				// Execute all of them
                                var readyList = jQuery.readyList;
				while( readyList.length) {
					readyList[0].call( document, jQuery );
					readyList.splice(0,1);
				};
			}
Attachments (0)
Change History (1)

Changed September 14, 2009 05:18PM UTC by flesler comment:1

resolution: → duplicate
status: newclosed

This is already fixed in trunk, I'm closing as duplicate.