「MediaWiki:Common.js」修訂間的差異

出自宅犬維基
跳至導覽 跳至搜尋
(取消由Cyesuta對話)所作出的修訂 724166)
 
行 1: 行 1:
/*
+
/* Any JavaScript here will be loaded for all users on every page load. */
所有用戶在加載任何頁面時,這裡的JavaScript都會加載
 
  
== 辅助处理 ==
+
// <syntax type="javascript">
*/
 
//功能設定
 
if(!window.JSConfig){var JSConfig={};}
 
JSConfig.isEdit0=true; //設置是否顯示編輯首段按鈕
 
JSConfig.editSectionLink='right';//設置編輯按鈕是否在右側
 
JSConfig.collapseText=wgULS('隱藏▲','隱藏▲');//指示折疊收縮的默認文字
 
JSConfig.expandText=wgULS('顯示▼','顯示▼');//指示折疊展開的默認文字
 
JSConfig.autoCollapse=2;  //文章少於 autoCollapse 個折疊塊時,不自動折疊
 
  
// 移動元素
+
    /**
function elementMoveto(node, refNode, pos){//默认位置为refNode前
+
        Toggles the display of elements on a page
if(node && refNode){
+
        Author/contact: Austin Che http://openwetware.org/wiki/User:Austin_J._Che
var parent=refNode.parentNode;
+
        See http://openwetware.org/wiki/OpenWetWare:Toggle for examples and documentation
if (pos && pos=='after') {refNode=refNode.nextSibling;}
+
    */
try {
 
if(refNode){
 
parent.insertBefore(node, refNode);
 
}else{
 
parent.appendChild(node);
 
}
 
} catch (DOMException) {};
 
}
 
}
 
//创建元素
 
function createElement(tag,children,props){
 
var element = document.createElement(tag);
 
if(!(children instanceof Array)){children=[children];}
 
for(var i=0;i<children.length;i++){
 
var child=children[i];
 
if(typeof child=='string'){child=document.createTextNode(child);}
 
if(child){element.appendChild(child);}
 
}
 
if(typeof props=='object'){
 
for(var k in props){
 
switch(k){
 
case 'styles':
 
var styles=props.styles;
 
for(var s in styles){element.style[s]=styles[s];}
 
break;
 
case 'events':
 
var events=props.events;
 
for(var e in events){ addHandler(element,e,events[e]); }
 
break;
 
case 'class':
 
element.className=props[k];break;
 
default:
 
element.setAttribute(k,props[k]);
 
}
 
}
 
}
 
return element;
 
}
 
 
 
 
 
//JS、CSS导入模块
 
importedURLs = {}; //用以保證腳本和樣式只载入一次
 
function importScript( page ) {
 
var src= /^https?:\/\//.test(page) ? page : getWikiPath(page,{'ctype':'text/javascript'});
 
if( importedURLs[src] ) { return; }
 
importedURLs[src] = true;
 
var scriptElem = createElement( 'script',null,{'src':src,'type':'text/javascript'} );
 
document.getElementsByTagName( 'head' )[0].appendChild( scriptElem );
 
}
 
function importStylesheet( page ) {
 
var sheet= /^https?:\/\//.test(page) ? page : getWikiPath(page,{'ctype':'text/css'});
 
if( importedURLs[sheet] ) { return; }
 
importedURLs[sheet] = true;
 
var styleElem = createElement( 'style', ['@import "'+sheet+'";'], {'type':'text/css'} );
 
document.getElementsByTagName( 'head' )[0].appendChild( styleElem );
 
}
 
 
 
//引入[[Special:Gadgets]]要求的腳本和樣式
 
if(window.requireScripts instanceof Array){
 
for(var i=0;i<requireScripts.length;i++){
 
importScript(requireScripts[i]);
 
}
 
}
 
if(window.requireStylesheets instanceof Array){
 
for(var i=0;i<requireStylesheets.length;i++){
 
importStylesheet(requireStylesheets[i]);
 
}
 
}
 
 
 
/* 测试元素中是否含有指定的样式 **************************************
 
* Description: 使用正则式与缓存来提高性能
 
* Maintainers: User:fdcn @zh.wikipedia
 
*              [[en:User:Mike Dillon]], [[en:User:R. Koot]], [[en:User:SG]] @en.wikipedia
 
*/
 
var hasClass = (function () {
 
var reCache = {};
 
return function (element, className) {
 
return (reCache[className] ? reCache[className] : (reCache[className] = new RegExp("(?:\\s|^)" + className + "(?:\\s|$)"))).test(element.className);
 
};
 
})();
 
  
/*
+
// indexed array of toggler ids to array of associated toggle operations
 +
// each operation is a two element array, the first being the type, the second a class name or array of elements
 +
// operation types are strings like "_reset" or "" for the default toggle operation
 +
var togglers = new Array();   
 +
var allClasses = new Object(); // associative map of class names to page elements
  
== IE兼容性修正 ==
+
function toggler(id)
*/
+
{
if (navigator.appName == "Microsoft Internet Explorer" && document.compatMode == "CSS1Compat"){
+
    var toBeToggled = togglers[id];
(function(){
+
    if (!toBeToggled)
var oldWidth;
+
        return;
var docEl = document.documentElement;
 
  
function fixIEScroll(){
+
    // if some element is in list more than once, it will be toggled multiple times
if (!oldWidth || docEl.clientWidth > oldWidth){
+
    for (var i = 0; i < toBeToggled.length; i++)
doFixIEScroll();
+
    {
}else{
+
        // get array of elements to operate on
setTimeout(doFixIEScroll, 1);
+
        var toggles = toBeToggled[i][1];
}
+
        if (typeof(toggles) == "string")
oldWidth = docEl.clientWidth;
+
        {
}
+
            if (toggles.charAt(0) == '-')
 +
            {
 +
                // treat as an element ID, not as class
 +
                toggles = document.getElementById(toggles.substring(1));
 +
                if (toggles)
 +
                    toggles = new Array(toggles);
 +
            }
 +
            else
 +
                toggles = allClasses[toggles];
 +
        }
 +
        if (!toggles || !toggles.length)
 +
            continue;
  
function doFixIEScroll() {
+
        var op = toBeToggled[i][0]; // what the operation will be
docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
 
}
 
  
document.attachEvent("onreadystatechange", fixIEScroll);
+
        switch (op)
attachEvent("onresize", fixIEScroll);
+
        {
})();
+
            case "_reset":
 +
                for (var j = 0; j < toggles.length; j++)
 +
                    toggles[j].style.display = toggles[j]._toggle_original_display;
 +
                break;
 +
            case "_show":
 +
                for (var j = 0; j < toggles.length; j++)
 +
                    toggles[j].style.display = '';
 +
                break;
 +
            case "_hide":
 +
                for (var j = 0; j < toggles.length; j++)
 +
                    toggles[j].style.display = 'none';
 +
                break;
 +
            case "":
 +
            default:
 +
                // Toggle
 +
                for (var j = 0; j < toggles.length; j++)
 +
                    toggles[j].style.display = ((toggles[j].style.display == 'none') ? '' : 'none');
 +
                break;
 +
        }
 +
    }
 
}
 
}
  
/*
+
function createTogglerLink(toggler, id)
 
+
{
 
+
    var toggle = document.createElement("a");
== 段落編輯連結 ==
+
    toggle.className = 'toggler-link';
*/
+
    toggle.setAttribute('id', 'toggler' + id);
//JSConfig.isEdit0 設置是否出現「編輯首段」按鈕
+
    toggle.setAttribute('href', 'javascript:toggler("' + id + '");');
//對不需要編輯首段的頁面,還可在頁面中加 Template:NoEdit 模板來禁用。
+
    var child = toggler.firstChild;
//JSConfig.editSectionLink 設置「編輯」按鈕的位置
+
    toggler.removeChild(child);
if (wgIsArticle && wgAction == "view") {
+
    toggle.appendChild(child);
//增加編輯首段按鈕
+
    toggler.insertBefore(toggle, toggler.firstChild);
addOnloadHook(function(){
 
if(!JSConfig.isEdit0||(document.getElementById&&document.getElementById('no-edit-0'))){return;}
 
var caEdit=document.getElementById&&document.getElementById('ca-edit');
 
if (!caEdit){return;}
 
var linkAttributes={
 
'href':caEdit.firstChild.href + '&section=0',
 
'title':wgULS('編輯正文所有標題之前的文字(通常稱為首段或導言)','編輯正文所有標題之前的文字(通常稱首段或導言)'),
 
'accesskey':'0'
 
}
 
 
 
//增加0按鈕標籤
 
var caEdit0 = createElement(
 
'li',
 
[createElement('A',['0'],linkAttributes)],
 
{id:'ca-edit-0'}
 
);
 
caEdit.className = 'istalk';
 
elementMoveto(caEdit0,caEdit,"after");
 
 
 
//增加條目標題下的「編輯首段」按鈕
 
var editsection0= createElement(
 
'span',
 
['[',createElement('A',[wgULS('編輯首段','編輯首段')],linkAttributes),']'],
 
{'class':'editsection'}
 
);
 
var siteSub=document.getElementById&&document.getElementById('siteSub');
 
elementMoveto( editsection0 , siteSub.firstChild );
 
});
 
 
//設置編輯按鈕位置是否浮動
 
addOnloadHook(function(){
 
if (JSConfig.editSectionLink=='right') { return; }
 
var editLinks=getElementsByClassName(document.getElementById('bodyContent'),"span","editsection");
 
for(var i = 0; i < editLinks.length; i++) {
 
editLinks[i].style.cssFloat = editLinks[i].style.float = 'none';
 
editLinks[i].style.textAlign = "left" ;
 
editLinks[i].parentNode.appendChild(editLinks[i]);
 
}
 
});
 
 
}
 
}
  
/*
+
function toggleInit()
 +
{
 +
    var togglerElems = new Array();
 +
    var toggleGroup = new Array();
  
 +
    // initialize/clear any old information
 +
    togglers = new Array();   
 +
    allClasses = new Object();
 +
       
 +
    // make list of all document classes
 +
    var elems = document.getElementsByTagName("*");
 +
    var numelems = elems.length;
 +
    for (var i = 0; i < elems.length; i++)
 +
    {
 +
        var elem = elems[i];
 +
        if (!elem.className)
 +
            continue;
  
== 增加折疊功能 ==
+
        elem._toggle_original_display = elem.style.display;
*/
+
        var togglerID = -1;
/** 折疊 div table *****************************
+
        var elemClasses = elem.className.split(' '); // get list of classes
*  Description: 實現div.NavFrame和table.collapsible的可折疊性。
+
        for (var j = 0; j < elemClasses.length; j++)
*  JSConfig的collapseText、expandText、autoCollapse屬性定義默認文字和默認最少自動折疊塊
+
        {
*  Maintainers: User:fdcn
+
            var elemClass = elemClasses[j];
*/
+
            if (! allClasses[elemClass])
addOnloadHook(function(){
+
                allClasses[elemClass] = new Array();
function toggleState(item){
+
            allClasses[elemClass].push(elem);
var oldState=item.state;
 
item.state=1-oldState;
 
if(item.text[0]){
 
item.text[oldState].style.display = 'inline';
 
item.text[item.state].style.display='none';
 
}
 
item.action(item);
 
}
 
  
function cancelBubble(e){
+
            // all the special classes begin with _toggle
e=e||window.event;
+
            if (elemClass.substring(0, 7) != "_toggle")
if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}
+
                continue;
}
 
function createToggleButton(head,frame,toggle){
 
var textS,textH;
 
var button=getElementsByClassName(head,"span","NavToggle")[0];
 
if(button){
 
textS=getElementsByClassName(button,"span","NavToggleShow")[0]
 
textH=getElementsByClassName(button,"span","NavToggleHide")[0];
 
}else {
 
textS=createElement("span",[JSConfig.expandText]);
 
textH=createElement('span',[JSConfig.collapseText]);
 
button=createElement("span",[textS,textH],{'class':"NavToggle",styles:{'width':"3.8em"}});
 
}
 
if(textS){textS.style.display='none';}
 
button.style.display='inline';
 
var item={'state':0, 'text':[textS,textH],'frame':frame,'action':toggle}
 
  
var links=head.getElementsByTagName("A");
+
            if (elemClass == "_togglegroup")
for(var i=0,l;l=links[i];i++){ addClickHandler(l,cancelBubble); }
+
                toggleGroup = new Array();
+
            else if (elemClass == "_toggle")
head.insertBefore( button, head.childNodes[0] );
+
                toggleGroup.push(elem);
head.style.cursor = "pointer";
+
            else if (elemClass.substring(0, 12) == "_toggle_init")
addClickHandler( head, function(){toggleState(item);} );
+
            {
return item;
+
                // set initial value for display (ignore the original CSS set value)
}
+
                // understands _toggle_initshow and _toggle_inithide
+
                var disp = elemClass.substring(12);
// 折疊div
+
                if (disp == "show")
function toggleNavigationBar(item)
+
                    elem.style.display = '';
{
+
                else if (disp == "hide")
var cls=item.state?'none':'block';
+
                    elem.style.display = 'none';
for (
+
                elem._toggle_original_display = disp;
var NavChild = item.frame.firstChild;
+
            }
NavChild != null;
+
            else if (elemClass.substring(0, 8) == "_toggler")
NavChild = NavChild.nextSibling
+
            {
){
+
                if (togglerID == -1)
if (NavChild.className == 'NavPic' || NavChild.className == 'NavContent') {
+
                {
NavChild.style.display = cls;
+
                    togglerID = togglers.length;
}
+
                    togglers[togglerID] = new Array();
}
+
                    togglerElems[togglerID] = elem;
}
+
                }
 
// 折疊表格
 
function collapseTable( item )
 
{
 
var rows = item.frame.getElementsByTagName( "tr" );
 
var display = item.state? 'none':rows[0].style.display;
 
for (var i=1,row; row=rows[i]; i++) { row.style.display = display; }
 
}
 
 
//init
 
var item,items=[];
 
var NavFrames=getElementsByClassName(document,"div","NavFrame");
 
for(var i=0,NavFrame;NavFrame = NavFrames[i];i++) {
 
var heads=getElementsByClassName(NavFrame,"div","NavHead");
 
for(var ih=0,head; head = heads[ih]; ih++ ) {
 
if (head.parentNode != NavFrame) {continue;}
 
items.push(createToggleButton(head,NavFrame,toggleNavigationBar));
 
break;
 
}
 
}
 
  
var tables = getElementsByClassName(document,"table","collapsible");
+
                // all classes are of form _toggler_op-CLASS
for ( var i = 0,table; table= tables[i]; i++ ) {
+
                // figure out what class we're toggling
var head = table.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
+
                // if none is specified, then we use the current toggle group
items.push(createToggleButton(head,table,collapseTable));
+
                var toBeToggled;
}
+
                var hyphen = elemClass.indexOf('-');
 +
                if (hyphen != -1)
 +
                    toBeToggled = elemClass.substring(hyphen+1);
 +
                else
 +
                {
 +
                    toBeToggled = toggleGroup;
 +
                    hyphen = elemClass.length;
 +
                }
  
var count=items.length;
+
                var op = elemClass.substring(8, hyphen);
for ( var i = 0;  i<count; i++ ) {
+
                togglers[togglerID].push(new Array(op, toBeToggled));
item=items[i];
+
            }
if ( hasClass( item.frame, "collapsed" ) || ( count >= JSConfig.autoCollapse && hasClass( item.frame, "autocollapse" ) ) ) {
+
        }
toggleState(item);
+
    }
}
 
}
 
});
 
  
//修正折疊後定位變化
+
    // add javascript links to all toggler elements
hookEvent("load",function(){if(location.hash){location.href=location.hash;}});
+
    for (var i = 0; i < togglerElems.length; i++)
 +
        createTogglerLink(togglerElems[i], i);
 +
}
  
/*
 
  
 +
function owwsitesearch(f){
 +
    f.q.value='site:http://openwetware.org/wiki/'+
 +
        f.base.value+'++'+f.qfront.value
 +
}
  
  
== 取消修訂編輯摘要修正 ==
+
addOnloadHook(toggleInit);
*/
 
/**
 
  fix edit summary prompt for undo
 
  this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the edit summary unchanged
 
  this was added by [[:en:User:Deskana]], code by [[:en:User:Tra]]
 
*/
 
addOnloadHook(function () {
 
var autoSummary=document.getElementsByName('wpAutoSummary')[0];
 
if (document.location.search.indexOf("undo=") != -1 && autoSummary)
 
{
 
autoSummary.value='';
 
}
 
})
 
  
/*
+
// </syntax>

於 2013年6月13日 (四) 11:12 的最新修訂

/* Any JavaScript here will be loaded for all users on every page load. */

// <syntax type="javascript">

    /** 
        Toggles the display of elements on a page 
        Author/contact: Austin Che http://openwetware.org/wiki/User:Austin_J._Che
        See http://openwetware.org/wiki/OpenWetWare:Toggle for examples and documentation
     */

// indexed array of toggler ids to array of associated toggle operations
// each operation is a two element array, the first being the type, the second a class name or array of elements
// operation types are strings like "_reset" or "" for the default toggle operation
var togglers = new Array();     
var allClasses = new Object(); // associative map of class names to page elements

function toggler(id)
{
    var toBeToggled = togglers[id];
    if (!toBeToggled)
        return;

    // if some element is in list more than once, it will be toggled multiple times
    for (var i = 0; i < toBeToggled.length; i++)
    {
        // get array of elements to operate on
        var toggles = toBeToggled[i][1];
        if (typeof(toggles) == "string")
        {
            if (toggles.charAt(0) == '-')
            {
                // treat as an element ID, not as class
                toggles = document.getElementById(toggles.substring(1));
                if (toggles)
                    toggles = new Array(toggles);
            }
            else
                toggles = allClasses[toggles];
        }
        if (!toggles || !toggles.length)
            continue;

        var op = toBeToggled[i][0]; // what the operation will be

        switch (op)
        {
            case "_reset":
                for (var j = 0; j < toggles.length; j++)
                    toggles[j].style.display = toggles[j]._toggle_original_display;
                break;
            case "_show":
                for (var j = 0; j < toggles.length; j++)
                    toggles[j].style.display = '';
                break;
            case "_hide":
                for (var j = 0; j < toggles.length; j++)
                    toggles[j].style.display = 'none';
                break;
            case "":
            default:
                // Toggle
                for (var j = 0; j < toggles.length; j++)
                    toggles[j].style.display = ((toggles[j].style.display == 'none') ? '' : 'none');
                break;
        }
    }
}

function createTogglerLink(toggler, id)
{
    var toggle = document.createElement("a");
    toggle.className = 'toggler-link';
    toggle.setAttribute('id', 'toggler' + id);
    toggle.setAttribute('href', 'javascript:toggler("' + id + '");');
    var child = toggler.firstChild;
    toggler.removeChild(child);
    toggle.appendChild(child);
    toggler.insertBefore(toggle, toggler.firstChild);
}

function toggleInit()
{
    var togglerElems = new Array();
    var toggleGroup = new Array();

    // initialize/clear any old information
    togglers = new Array();     
    allClasses = new Object();
        
    // make list of all document classes
    var elems = document.getElementsByTagName("*");
    var numelems = elems.length;
    for (var i = 0; i < elems.length; i++)
    {
        var elem = elems[i];
        if (!elem.className)
            continue;

        elem._toggle_original_display = elem.style.display;
        var togglerID = -1;
        var elemClasses = elem.className.split(' '); // get list of classes
        for (var j = 0; j < elemClasses.length; j++)
        {
            var elemClass = elemClasses[j];
            if (! allClasses[elemClass])
                allClasses[elemClass] = new Array();
            allClasses[elemClass].push(elem);

            // all the special classes begin with _toggle
            if (elemClass.substring(0, 7) != "_toggle")
                continue;

            if (elemClass == "_togglegroup")
                toggleGroup = new Array();
            else if (elemClass == "_toggle")
                toggleGroup.push(elem);
            else if (elemClass.substring(0, 12) == "_toggle_init")
            {
                // set initial value for display (ignore the original CSS set value)
                // understands _toggle_initshow and _toggle_inithide
                var disp = elemClass.substring(12);
                if (disp == "show")
                    elem.style.display = '';
                else if (disp == "hide")
                    elem.style.display = 'none';
                elem._toggle_original_display = disp;
            }
            else if (elemClass.substring(0, 8) == "_toggler")
            {
                if (togglerID == -1)
                {
                    togglerID = togglers.length;
                    togglers[togglerID] = new Array();
                    togglerElems[togglerID] = elem;
                }

                // all classes are of form _toggler_op-CLASS
                // figure out what class we're toggling
                // if none is specified, then we use the current toggle group
                var toBeToggled;
                var hyphen = elemClass.indexOf('-');
                if (hyphen != -1)
                    toBeToggled = elemClass.substring(hyphen+1);
                else
                {
                    toBeToggled = toggleGroup;
                    hyphen = elemClass.length;
                }

                var op = elemClass.substring(8, hyphen);
                togglers[togglerID].push(new Array(op, toBeToggled));
            }
        }
    }

    // add javascript links to all toggler elements
    for (var i = 0; i < togglerElems.length; i++)
        createTogglerLink(togglerElems[i], i);
}


function owwsitesearch(f){
    f.q.value='site:http://openwetware.org/wiki/'+
        f.base.value+'++'+f.qfront.value
}


addOnloadHook(toggleInit);

// </syntax>