「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() { ... }); のようなフックを調べてみてください。 | |||
// (このフック名は一例であり、正確ではない可能性があります) | |||
} ); | } ); | ||
} ); | } ); | ||