Index: trunk/phase3/resources/mediawiki/mediawiki.util.js =================================================================== --- trunk/phase3/resources/mediawiki/mediawiki.util.js (revision 109783) +++ trunk/phase3/resources/mediawiki/mediawiki.util.js (working copy) @@ -277,6 +277,21 @@ */ $content: null, + /* + * @var jQuery.Callback + * A jQuery.Callbacks object that fires every time $content is updated + * + * @example Bind a custom callback function + * mw.util.callback.add( function () { + * console.log( 'There are ' + mw.util.$content.find( 'a' ).length + ' links in the text.' ); + * }); + * + * @example Fire the callback functions after changing the content + * mw.util.$content.html( 'new content' ); + * mw.util.callback.fire(); + */ + callback: jQuery.Callbacks( 'memory' ), + /** * Add a link to a portlet menu on the page, such as: * Index: trunk/phase3/resources/mediawiki.page/mediawiki.page.ready.js =================================================================== --- trunk/phase3/resources/mediawiki.page/mediawiki.page.ready.js (revision 109783) +++ trunk/phase3/resources/mediawiki.page/mediawiki.page.ready.js (working copy) @@ -1,27 +1,32 @@ -jQuery( document ).ready( function( $ ) { - - /* Initialize utilities (messageBoxNew, profile, tooltip access keys, TOC etc.) */ - mw.util.init(); - - /* Emulate placeholder if not supported by browser */ - if ( !( 'placeholder' in document.createElement( 'input' ) ) ) { - $( 'input[placeholder]' ).placeholder(); - } - - /* Enable makeCollapsible */ - $( '.mw-collapsible' ).makeCollapsible(); - - /* Lazy load jquery.tablesorter */ - if ( $( 'table.sortable' ).length ) { - mw.loader.using( 'jquery.tablesorter', function() { - $( 'table.sortable' ).tablesorter(); - }); - } - - /* Enable CheckboxShiftClick */ - $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick(); - - /* Add accesskey hints to the tooltips */ - mw.util.updateTooltipAccessKeys(); - -} ); +( function ( $, mw ) { + mw.util.callback.add( function () { + /* Enable makeCollapsible */ + $( '.mw-collapsible' ).makeCollapsible(); + + /* Lazy load jquery.tablesorter */ + if ( $( 'table.sortable' ).length ) { + mw.loader.using( 'jquery.tablesorter', function() { + $( 'table.sortable' ).tablesorter(); + }); + } + }); + + $( document ).ready( function () { + /* Initialize utilities (messageBoxNew, profile, tooltip access keys, TOC etc.) */ + mw.util.init(); + + /* Emulate placeholder if not supported by browser */ + if ( !( 'placeholder' in document.createElement( 'input' ) ) ) { + $( 'input[placeholder]' ).placeholder(); + } + + /* Enable CheckboxShiftClick */ + $( 'input[type=checkbox]:not(.noshiftselect)' ).checkboxShiftClick(); + + /* Add accesskey hints to the tooltips */ + mw.util.updateTooltipAccessKeys(); + + /* Fire the callbacks for the first time */ + mw.util.callback.fire(); + }); +} )( jQuery, mediaWiki ); Index: trunk/phase3/resources/Resources.php =================================================================== --- trunk/phase3/resources/Resources.php (revision 109783) +++ trunk/phase3/resources/Resources.php (working copy) @@ -852,7 +852,7 @@ 'scripts' => 'common/preview.js', 'remoteBasePath' => $GLOBALS['wgStylePath'], 'localBasePath' => $GLOBALS['wgStyleDirectory'], - 'dependencies' => 'mediawiki.legacy.wikibits', + 'dependencies' => array( 'mediawiki.legacy.wikibits', 'mediawiki.util' ), ), 'mediawiki.legacy.protect' => array( 'scripts' => 'common/protect.js', Index: trunk/phase3/skins/common/preview.js =================================================================== --- trunk/phase3/skins/common/preview.js (revision 109783) +++ trunk/phase3/skins/common/preview.js (working copy) @@ -49,6 +49,7 @@ loadSpinner.remove(); $( mw ).trigger( 'LivePreviewDone', [copyElements] ); + mw.util.callback.fire(); } ); };