コンテンツにスキップ

「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 ) {
             // MinervaNeueスキンで、初期状態で折りたたまれているセクションのヘッダーを探します。
             logDebug('wikipage.content hook triggered for content:', $content[0]);
             // 具体的には、 'mw-collapsed' クラスを持つ 'collapsible-block' 要素内の
             // $content は更新されたDOM要素のjQueryオブジェクト
             // 'section-heading' クラスを持つ要素がクリック対象です。
             // こちらも少し遅延させる
             var $collapsedSectionHeadings = $content.find( '.collapsible-block.mw-collapsed .section-heading' );
             setTimeout(function() {
                expandAllSectionsInContext( $content );
            }, 100);
        });
 
        // MinervaNeueがAjaxでページ遷移を行う場合、追加のフックが必要なことがあります。
        // mw.hook('minerva.pageLoaded').add(function() { ... }); のようなフックを調べてみてください。
        // (このフック名は一例であり、正確ではない可能性があります)


            $collapsedSectionHeadings.each( function () {
                // ヘッダーをクリックしてセクションを展開します。
                // これにより、MinervaNeueの組み込みJavaScriptが
                // 展開処理(クラスの変更、aria属性の更新など)を適切に行います。
                $( this ).trigger( 'click' );
            } );
        } );
     } );
     } );
} );
} );

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

    } );
} );