MediaWiki:Common.js — различия между версиями

Материал из GlassCannon Wiki — энциклопедия игр Blizzard
Перейти к: навигация, поиск
Строка 1: Строка 1:
/**
 
* Часто те или иные манипуляции со страницей нужно выполнить как можно раньше, но нет гарантии, что
 
* к моменту выполнения кода нужный участок DOM готов, а событие полной загрузки страницы происходит
 
* слишком поздно. В этой функции проверяется наличие элемента $testElement и в случае успеха
 
* функция-колбэк выполняется, иначе же её выполнение поручается другой функции. Если элемент
 
* в $testElement имеет содержимое, правильнее указать следующий за ним элемент, чтобы быть
 
* уверенным, что он загрузился до конца. Имейте в виду, что разные скины часто используют разные
 
* названия классов и идентификаторов.
 
*/
 
function runAsEarlyAsPossible( callback, $testElement, func ) {
 
func = func || $;
 
$testElement = $testElement || $( '#footer' );
 
 
if ( $testElement.length ) {
 
callback();
 
} else {
 
func( callback );
 
}
 
}
 
 
/**
 
* Выполнение скриптов из пространства MediaWiki, указанных в URL
 
* См. также https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL
 
*/
 
var withJS = location.href.match( /[&?]withjs=((mediawiki:)?([^&#]+))/i );
 
if ( withJS ) {
 
importScript_( 'MediaWiki:' + withJS[3] );
 
}
 
 
/**
 
* Код, который нужно выполнить как можно раньше. Он выполняется, если загружен подвал страницы,
 
* иначе же ждёт наступления события wikipage.content (см. выше определение runAsEarlyAsPossible
 
* и ниже про wikipage.content).
 
*/
 
runAsEarlyAsPossible( function () {
 
/**
 
* {{выполнить скрипт}}
 
*/
 
var $execJS = $( '.executeJS' );
 
if ( $execJS.length ) {
 
$execJS.each( function () {
 
        $.each( $( this ).data( 'scriptnames' ).split( ' ' ), function ( i, sc ) {
 
            sc = $.trim( sc.replace( /[^\w ]/g, '' ) );
 
            if ( sc ) {
 
                importScript( 'MediaWiki:Script/' + sc + '.js' );
 
            }
 
        } );
 
    } );
 
}
 
 
runAsEarlyAsPossible( function () {
 
if ( $( '.tochidden-wrapper' ).length ) {
 
mw.loader.using( [ 'mediawiki.cookie' ], function () {
 
if ( mw.cookie.get( 'hidetoc' ) === null ) {
 
$.when( mw.loader.using( [ 'mediawiki.toc' ] ), $.ready ).then( TOChidden );
 
}
 
} );
 
}
 
}, $( '#toc' ), mw.hook( 'wikipage.content' ).add );
 
 
 
/**
 
/**
 
  * Код, выполняемый по событию wikipage.content (его обработчики выполняются раньше колбэков для $,
 
  * Код, выполняемый по событию wikipage.content (его обработчики выполняются раньше колбэков для $,
Строка 67: Строка 7:
 
  */
 
  */
 
mw.hook( 'wikipage.content' ).add( function () {
 
mw.hook( 'wikipage.content' ).add( function () {
/**
 
* Отключение обтекания раздела примечаний, если в нём есть колонки
 
*/
 
$( '.references-small.columns' ).each( function () {
 
$( this ).after( '<div class="temporaryDiv"></div>' ).next().prevUntil( 'h1, h2, h3, h4, h5, h6' )
 
.last().prev().css( 'clear', 'both' );
 
} );
 
 
// Этот элемент нужен на случай, если примечания — последний элемент (потребность в next()
 
// возникает из-за невключительности prevUntil() jQuery)
 
$( '.temporaryDiv' ).remove();
 
 
 
/**
 
/**
 
* Imagemap Highlight
 
* Imagemap Highlight

Версия 02:02, 9 июня 2021

/**
 * Код, выполняемый по событию wikipage.content (его обработчики выполняются раньше колбэков для $,
 * хотя в глубине это одно и то же событие, просто колбэк, инициирующий wikipage.content, становится
 * в очередь раньше). Так как wikipage.content инициируется после обновления страницы в результате
 * Ajax-запросов (например, гаджетом быстрого предпросмотра), не добавляйте сюда коды, которые
 * должны гарантированно выполниться один раз на странице.
 */
mw.hook( 'wikipage.content' ).add( function () {
	/**
	 * Imagemap Highlight
	 */
	// На странице есть как минимум один элемент .imageMapHighlighter, а браузер поддерживает <canvas>
	if ( $( '.imageMapHighlighter' ).length && $( '<canvas>' )[ 0 ].getContext ) {
		importScript( 'MediaWiki:Imagemap-Highlight.js' );
	}

});