「MediaWiki:Mobile.js」の版間の差分
表示
ページの作成:「→ここにある全てのJavaScriptはモバイル版サイトの利用者に影響します: // MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述 mw.loader.using( ['jquery', 'mediawiki.util'], function () { $( function () { // mw.hook を使用して、ページのコンテンツがレンダリングされた後、 // または動的に更新された後に実行されるようにします。 mw.hook(…」 |
編集の要約なし タグ: モバイル編集 モバイルウェブ編集 |
||
| 1行目: | 1行目: | ||
/* ここにある全てのJavaScriptはモバイル版サイトの利用者に影響します */ | /* ここにある全てのJavaScriptはモバイル版サイトの利用者に影響します */ | ||
// MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述 | |||
// MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述 | // MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述 | ||
mw.loader.using( ['jquery', 'mediawiki.util'], function () { | mw.loader.using( ['jquery', 'mediawiki.util'], function () { | ||
$( function () { | $( function () { // このスコープは $(document).ready とほぼ同様 | ||
// mw.hook | 'use strict'; | ||
// | |||
// デバッグメッセージをコンソールに出力するフラグ | |||
var enableDebugMessages = true; | |||
function logDebug(message, element) { | |||
if (enableDebugMessages && window.console && typeof window.console.log === 'function') { | |||
if (element) { | |||
console.log('[MobileExpandSections] ' + message, element); | |||
} else { | |||
console.log('[MobileExpandSections] ' + message); | |||
} | |||
} | |||
} | |||
logDebug('Script loaded. Attempting to expand sections.'); | |||
function expandAllSectionsInContext( $context ) { | |||
logDebug('expandAllSectionsInContext called for context:', $context[0]); | |||
// セレクタの候補: | |||
// 1. MinervaNeueの標準的なセクションのヘッダー | |||
// 2. MediaWiki標準の折りたたみ要素のトグル | |||
// 3. MinervaNeueでセクション全体を囲む要素で、折りたたまれているもの | |||
var selectorsToClick = [ | |||
'.collapsible-block.mw-collapsed .section-heading', // クリック対象はヘッダー | |||
'.mw-collapsible.mw-collapsed .mw-collapsible-toggle' // クリック対象はトグル | |||
]; | |||
var $elementsToClick = $(); | |||
selectorsToClick.forEach(function(selector) { | |||
var $found = $context.find(selector); | |||
if ($found.length > 0) { | |||
logDebug('Found ' + $found.length + ' elements to click with selector: ' + selector); | |||
$elementsToClick = $elementsToClick.add($found); | |||
} | |||
}); | |||
if ($elementsToClick.length > 0) { | |||
$elementsToClick.each( function ( index ) { | |||
var $this = $( this ); | |||
logDebug('Triggering click on element ' + ( index + 1 ) + ':', $this[0]); | |||
$this.trigger( 'click' ); // Minervaのイベントハンドラを発火させる | |||
// 念のため、展開されたか確認 (非同期の場合もあるので確実ではない) | |||
// var $parentCollapsible = $this.closest('.collapsible-block, .mw-collapsible'); | |||
// setTimeout(function() { | |||
// if ($parentCollapsible.hasClass('mw-collapsed')) { | |||
// logDebug('Element ' + (index + 1) + ' might still be collapsed.', $parentCollapsible[0]); | |||
// } else { | |||
// logDebug('Element ' + (index + 1) + ' seems expanded.', $parentCollapsible[0]); | |||
// } | |||
// }, 150); | |||
}); | |||
} else { | |||
logDebug('No elements found to click for expansion in this context.'); | |||
// クリック対象が見つからない場合、mw-collapsedクラスを直接操作してみる (最終手段に近い) | |||
var $directlyCollapsible = $context.find('.collapsible-block.mw-collapsed, .mw-collapsible.mw-collapsed'); | |||
if ($directlyCollapsible.length > 0) { | |||
logDebug('Found ' + $directlyCollapsible.length + ' elements with .mw-collapsed. Attempting direct class manipulation.'); | |||
$directlyCollapsible.each(function() { | |||
var $block = $(this); | |||
var $header = $block.find('.section-heading, .mw-collapsible-toggle').first(); | |||
logDebug('Directly expanding block by removing .mw-collapsed:', $block[0]); | |||
$block.removeClass('mw-collapsed'); | |||
if ($header.length) { | |||
$header.attr('aria-expanded', 'true'); | |||
} | |||
// Minervaの場合、コンテンツブロックの表示も制御している可能性 | |||
$block.find('.content_block').css('display', 'block'); | |||
}); | |||
} else { | |||
logDebug('No .mw-collapsed elements found for direct class manipulation either.'); | |||
} | |||
} | |||
} | |||
// 初回ページ読み込み時に関数実行 | |||
// 少し遅延させて、他のスクリプトやMinerva自身の初期化処理が終わるのを待つ | |||
setTimeout(function() { | |||
logDebug('Initial execution on document ready (after 500ms delay).'); | |||
// ページ全体のコンテンツを対象とする | |||
expandAllSectionsInContext( $( document.body ) ); | |||
}, 500); // 500ミリ秒の遅延。必要に応じて調整してください。 | |||
// mw.hook を使用して、動的にコンテンツが更新された場合にも対応 | |||
// (例: Live Preview, VisualEditorからの切り替え、ページネーションなど) | |||
mw.hook( 'wikipage.content' ).add( function ( $content ) { | mw.hook( 'wikipage.content' ).add( function ( $content ) { | ||
logDebug('wikipage.content hook triggered for content:', $content[0]); | |||
// | // $content は更新されたDOM要素のjQueryオブジェクト | ||
// | // こちらも少し遅延させる | ||
setTimeout(function() { | |||
expandAllSectionsInContext( $content ); | |||
}, 100); | |||
}); | |||
// MinervaNeueがAjaxでページ遷移を行う場合、追加のフックが必要なことがあります。 | |||
// mw.hook('minerva.pageLoaded').add(function() { ... }); のようなフックを調べてみてください。 | |||
// (このフック名は一例であり、正確ではない可能性があります) | |||
} ); | } ); | ||
} ); | } ); | ||
2025年5月17日 (土) 14:01時点における最新版
/* ここにある全てのJavaScriptはモバイル版サイトの利用者に影響します */
// MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述
// MediaWiki:Mobile.js または User:ご自身のユーザー名/mobile.js に記述
mw.loader.using( ['jquery', 'mediawiki.util'], function () {
$( function () { // このスコープは $(document).ready とほぼ同様
'use strict';
// デバッグメッセージをコンソールに出力するフラグ
var enableDebugMessages = true;
function logDebug(message, element) {
if (enableDebugMessages && window.console && typeof window.console.log === 'function') {
if (element) {
console.log('[MobileExpandSections] ' + message, element);
} else {
console.log('[MobileExpandSections] ' + message);
}
}
}
logDebug('Script loaded. Attempting to expand sections.');
function expandAllSectionsInContext( $context ) {
logDebug('expandAllSectionsInContext called for context:', $context[0]);
// セレクタの候補:
// 1. MinervaNeueの標準的なセクションのヘッダー
// 2. MediaWiki標準の折りたたみ要素のトグル
// 3. MinervaNeueでセクション全体を囲む要素で、折りたたまれているもの
var selectorsToClick = [
'.collapsible-block.mw-collapsed .section-heading', // クリック対象はヘッダー
'.mw-collapsible.mw-collapsed .mw-collapsible-toggle' // クリック対象はトグル
];
var $elementsToClick = $();
selectorsToClick.forEach(function(selector) {
var $found = $context.find(selector);
if ($found.length > 0) {
logDebug('Found ' + $found.length + ' elements to click with selector: ' + selector);
$elementsToClick = $elementsToClick.add($found);
}
});
if ($elementsToClick.length > 0) {
$elementsToClick.each( function ( index ) {
var $this = $( this );
logDebug('Triggering click on element ' + ( index + 1 ) + ':', $this[0]);
$this.trigger( 'click' ); // Minervaのイベントハンドラを発火させる
// 念のため、展開されたか確認 (非同期の場合もあるので確実ではない)
// var $parentCollapsible = $this.closest('.collapsible-block, .mw-collapsible');
// setTimeout(function() {
// if ($parentCollapsible.hasClass('mw-collapsed')) {
// logDebug('Element ' + (index + 1) + ' might still be collapsed.', $parentCollapsible[0]);
// } else {
// logDebug('Element ' + (index + 1) + ' seems expanded.', $parentCollapsible[0]);
// }
// }, 150);
});
} else {
logDebug('No elements found to click for expansion in this context.');
// クリック対象が見つからない場合、mw-collapsedクラスを直接操作してみる (最終手段に近い)
var $directlyCollapsible = $context.find('.collapsible-block.mw-collapsed, .mw-collapsible.mw-collapsed');
if ($directlyCollapsible.length > 0) {
logDebug('Found ' + $directlyCollapsible.length + ' elements with .mw-collapsed. Attempting direct class manipulation.');
$directlyCollapsible.each(function() {
var $block = $(this);
var $header = $block.find('.section-heading, .mw-collapsible-toggle').first();
logDebug('Directly expanding block by removing .mw-collapsed:', $block[0]);
$block.removeClass('mw-collapsed');
if ($header.length) {
$header.attr('aria-expanded', 'true');
}
// Minervaの場合、コンテンツブロックの表示も制御している可能性
$block.find('.content_block').css('display', 'block');
});
} else {
logDebug('No .mw-collapsed elements found for direct class manipulation either.');
}
}
}
// 初回ページ読み込み時に関数実行
// 少し遅延させて、他のスクリプトやMinerva自身の初期化処理が終わるのを待つ
setTimeout(function() {
logDebug('Initial execution on document ready (after 500ms delay).');
// ページ全体のコンテンツを対象とする
expandAllSectionsInContext( $( document.body ) );
}, 500); // 500ミリ秒の遅延。必要に応じて調整してください。
// mw.hook を使用して、動的にコンテンツが更新された場合にも対応
// (例: Live Preview, VisualEditorからの切り替え、ページネーションなど)
mw.hook( 'wikipage.content' ).add( function ( $content ) {
logDebug('wikipage.content hook triggered for content:', $content[0]);
// $content は更新されたDOM要素のjQueryオブジェクト
// こちらも少し遅延させる
setTimeout(function() {
expandAllSectionsInContext( $content );
}, 100);
});
// MinervaNeueがAjaxでページ遷移を行う場合、追加のフックが必要なことがあります。
// mw.hook('minerva.pageLoaded').add(function() { ... }); のようなフックを調べてみてください。
// (このフック名は一例であり、正確ではない可能性があります)
} );
} );