跳转到内容

MediaWiki:Gadget-NavFrame.js

维基百科,自由的百科全书

这是本页的一个历史版本,由AnYiLin留言 | 贡献2021年3月22日 (一) 12:01 (from en:Special:PermanentLink/961296730编辑。这可能和当前版本存在着巨大的差异。

注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/**
 * Dynamic Navigation Bars (experimental)
 *
 * Description: See [[Wikipedia:NavFrame]].
 * Maintainers: UNMAINTAINED
 */

var collapseCaption = wgULS('隐藏', '隱藏');
var expandCaption = wgULS('显示', '顯示');

var navigationBarHide = collapseCaption + '▲';
var navigationBarShow = expandCaption + '▼';

/**
 * Shows and hides content and picture (if available) of navigation bars.
 *
 * @param {number} indexNavigationBar The index of navigation bar to be toggled
 * @param {jQuery.Event} event Event object
 * @return {boolean}
 */
function toggleNavigationBar(indexNavigationBar, event) {
	var navToggle = document.getElementById('NavToggle' + indexNavigationBar);
	var navFrame = document.getElementById('NavFrame' + indexNavigationBar);
	var navChild;

	if (!navFrame || !navToggle) {
		return false;
	}

	// If shown now
	if (navToggle.firstChild.data === navigationBarHide) {
		for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) {
			if ($(navChild).hasClass('NavContent')) {
				navChild.style.display = 'none';
			}
		}
		navToggle.firstChild.data = navigationBarShow;

		// If hidden now
	} else if (navToggle.firstChild.data === navigationBarShow) {
		for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) {
			if ($(navChild).hasClass('NavContent')) {
				navChild.style.display = 'block';
			}
		}
		navToggle.firstChild.data = navigationBarHide;
	}

	event.preventDefault();
}

/**
 * Adds show/hide-button to navigation bars.
 *
 * @param {jQuery} $content
 */
function createNavigationBarToggleButton($content) {
	var j,
	navChild,
	navToggle,
	navToggleText,
	isCollapsed,
	indexNavigationBar = 0;
	// Iterate over all < div >-elements
	var $divs = $content.find('div.NavFrame:not(.mw-collapsible)');
	$divs.each(function (i, navFrame) {
		indexNavigationBar++;
		navToggle = document.createElement('a');
		navToggle.className = 'NavToggle';
		navToggle.setAttribute('id', 'NavToggle' + indexNavigationBar);
		navToggle.setAttribute('href', '#');
		$(navToggle).on('click', $.proxy(toggleNavigationBar, null, indexNavigationBar));

		isCollapsed = $(navFrame).hasClass('collapsed');
		/**
		 * Check if any children are already hidden.  This loop is here for backwards compatibility:
		 * the old way of making NavFrames start out collapsed was to manually add style="display:none"
		 * to all the NavPic/NavContent elements.  Since this was bad for accessibility (no way to make
		 * the content visible without JavaScript support), the new recommended way is to add the class
		 * "collapsed" to the NavFrame itself, just like with collapsible tables.
		 */
		for (navChild = navFrame.firstChild; navChild !== null && !isCollapsed; navChild = navChild.nextSibling) {
			if ($(navChild).hasClass('NavPic') || $(navChild).hasClass('NavContent')) {
				if (navChild.style.display === 'none') {
					isCollapsed = true;
				}
			}
		}
		if (isCollapsed) {
			for (navChild = navFrame.firstChild; navChild !== null; navChild = navChild.nextSibling) {
				if ($(navChild).hasClass('NavPic') || $(navChild).hasClass('NavContent')) {
					navChild.style.display = 'none';
				}
			}
		}
		navToggleText = document.createTextNode(isCollapsed ? navigationBarShow : navigationBarHide);
		navToggle.appendChild(navToggleText);

		// Find the NavHead and attach the toggle link (Must be this complicated because Moz's firstChild handling is borked)
		for (j = 0; j < navFrame.childNodes.length; j++) {
			if ($(navFrame.childNodes[j]).hasClass('NavHead')) {
				navToggle.style.color = navFrame.childNodes[j].style.color;
				navFrame.childNodes[j].appendChild(navToggle);
			}
		}
		navFrame.setAttribute('id', 'NavFrame' + indexNavigationBar);
	});
}

mw.hook('wikipage.content').add(createNavigationBarToggleButton);