미디어위키:Common.js: 두 판 사이의 차이

편집 요약 없음
태그: 수동 되돌리기
편집 요약 없음
6번째 줄: 6번째 줄:


         classList.forEach(function (cls) {
         classList.forEach(function (cls) {
             if (cls.indexOf('mw-customtoggle-') === 0) {
             if (cls.indexOf('mw-customtoggle-') !== 0) {
                 var targetId = 'mw-customcollapsible-' + cls.replace('mw-customtoggle-', '');
                 return;
                var $target = $('#' + targetId);
            }
 
            var suffix = cls.replace('mw-customtoggle-', '');
            var targetId = 'mw-customcollapsible-' + suffix;
 
            /*
            * #id를 사용하지 않는 이유:
            * 현재 문서에 같은 id가 2개 존재하므로
            * 실제 접히는 영역을 정확히 찾아야 함.
            */
            var $targets = $content.find('[id="' + targetId + '"]');
 
            // 실제 내용이 들어 있는 collapsible 영역 선택
            var $target = $targets.filter(function () {
                return $(this).find('table').length > 0 ||
                      $(this).hasClass('mw-collapsed') ||
                      $(this).css('display') === 'none';
            }).first();
 
            if (!$target.length) {
                return;
            }


                if ($target.length) {
            $toggle
                    $toggle.off('click.smoothSlide').on('click.smoothSlide', function (e) {
                .off('click.smoothSlide')
                        var $contentTarget = $target.find('.mw-collapsible-content');
                .on('click.smoothSlide', function (e) {
                        var $animTarget = $contentTarget.length ? $contentTarget : $target;
                    /*
                    * MediaWiki 기본 mw-collapsible 핸들러와
                    * slideToggle이 동시에 실행되는 것을 방지
                    */
                    e.preventDefault();
                    e.stopImmediatePropagation();


                         // 너비 고정 후 슬라이드 실행
                    var $contentTarget = $target.children('.mw-collapsible-content');
                         $animTarget.stop(true, true).slideToggle(200, function () {
                    var $animTarget = $contentTarget.length
                            // 애니메이션 완료 후 잔여 inline style 제거
                         ? $contentTarget
                         : $target;
 
                    var isOpening = !$animTarget.is(':visible');
 
                    $animTarget
                        .stop(true, true)
                        .slideToggle(200, function () {
                             if ($(this).is(':visible')) {
                             if ($(this).is(':visible')) {
                                 $(this).css('display', '');
                                /*
                                * slideToggle이 남기는 height, padding 등의
                                * 임시 스타일 정리.
                                *
                                * display는 현재 구조에서는 지우지 않는 편이 안전함.
                                */
                                 $(this).css({
                                    height: '',
                                    overflow: '',
                                    paddingTop: '',
                                    paddingBottom: '',
                                    marginTop: '',
                                    marginBottom: ''
                                });
                             }
                             }
                         });
                         });
                     });
 
                 }
                    // 접근성 상태도 같이 갱신
            }
                    $('[class~="' + cls + '"]').attr(
                        'aria-expanded',
                        isOpening ? 'true' : 'false'
                     );
                 });
         });
         });
     });
     });
});
});

2026년 8월 20일 (목) 14:55 판

/* MediaWiki:Common.js */
mw.hook('wikipage.content').add(function ($content) {
    $content.find('[class*="mw-customtoggle-"]').each(function () {
        var $toggle = $(this);
        var classList = ($toggle.attr('class') || '').split(/\s+/);

        classList.forEach(function (cls) {
            if (cls.indexOf('mw-customtoggle-') !== 0) {
                return;
            }

            var suffix = cls.replace('mw-customtoggle-', '');
            var targetId = 'mw-customcollapsible-' + suffix;

            /*
             * #id를 사용하지 않는 이유:
             * 현재 문서에 같은 id가 2개 존재하므로
             * 실제 접히는 영역을 정확히 찾아야 함.
             */
            var $targets = $content.find('[id="' + targetId + '"]');

            // 실제 내용이 들어 있는 collapsible 영역 선택
            var $target = $targets.filter(function () {
                return $(this).find('table').length > 0 ||
                       $(this).hasClass('mw-collapsed') ||
                       $(this).css('display') === 'none';
            }).first();

            if (!$target.length) {
                return;
            }

            $toggle
                .off('click.smoothSlide')
                .on('click.smoothSlide', function (e) {
                    /*
                     * MediaWiki 기본 mw-collapsible 핸들러와
                     * slideToggle이 동시에 실행되는 것을 방지
                     */
                    e.preventDefault();
                    e.stopImmediatePropagation();

                    var $contentTarget = $target.children('.mw-collapsible-content');
                    var $animTarget = $contentTarget.length
                        ? $contentTarget
                        : $target;

                    var isOpening = !$animTarget.is(':visible');

                    $animTarget
                        .stop(true, true)
                        .slideToggle(200, function () {
                            if ($(this).is(':visible')) {
                                /*
                                 * slideToggle이 남기는 height, padding 등의
                                 * 임시 스타일 정리.
                                 *
                                 * display는 현재 구조에서는 지우지 않는 편이 안전함.
                                 */
                                $(this).css({
                                    height: '',
                                    overflow: '',
                                    paddingTop: '',
                                    paddingBottom: '',
                                    marginTop: '',
                                    marginBottom: ''
                                });
                            }
                        });

                    // 접근성 상태도 같이 갱신
                    $('[class~="' + cls + '"]').attr(
                        'aria-expanded',
                        isOpening ? 'true' : 'false'
                    );
                });
        });
    });
});