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

出自宅犬維基
跳至導覽 跳至搜尋
(取消由Cyesuta對話)所作出的修訂 724166)
行 1: 行 1:
 
/*
 
/*
 
所有用戶在加載任何頁面時,這裡的JavaScript都會加載
 
所有用戶在加載任何頁面時,這裡的JavaScript都會加載
 +
 +
== 辅助处理 ==
 
*/
 
*/
 +
//功能設定
 +
if(!window.JSConfig){var JSConfig={};}
 +
JSConfig.isEdit0=true; //設置是否顯示編輯首段按鈕
 +
JSConfig.editSectionLink='right';//設置編輯按鈕是否在右側
 +
JSConfig.collapseText=wgULS('隱藏▲','隱藏▲');//指示折疊收縮的默認文字
 +
JSConfig.expandText=wgULS('顯示▼','顯示▼');//指示折疊展開的默認文字
 +
JSConfig.autoCollapse=2;  //文章少於 autoCollapse 個折疊塊時,不自動折疊
  
mw.loader.using(['mediawiki.Uri'], function() {
+
// 移動元素
    /* Search Engine variant hack */
+
function elementMoveto(node, refNode, pos){//默认位置为refNode前
    var ref, loc;
+
if(node && refNode){
    try {
+
var parent=refNode.parentNode;
        ref = new mw.Uri( document.referrer );
+
if (pos && pos=='after') {refNode=refNode.nextSibling;}
        loc = new mw.Uri( location.href );
+
try {
    } catch ( e ) {
+
if(refNode){
        return;
+
parent.insertBefore(node, refNode);
    }
+
}else{
    if (/\.google\./.test(ref.host) && /\/zh(-[^/]+)?\//.test(loc.path)) {
+
parent.appendChild(node);
        loc.path = loc.path.replace(/\/zh(-[^/]+)?\//, "/wiki/");
+
}
        location = loc.toString();
+
} 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;
 +
}
  
mw.loader.using(['mediawiki.util', 'ext.gadget.site-lib'], function () {
 
  (function ($, mw) {
 
    /* Cookies */
 
    window.setCookie = function (cookieName, cookieValue, expiryDay) {
 
      $.cookie(cookieName, cookieValue, {
 
        expires: expiryDay,
 
        path: '/'
 
      });
 
    };
 
  
    window.getCookie = function (cookieName) {
+
//JS、CSS导入模块
      return $.cookie(cookieName);
+
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 );
 +
}
  
    window.deleteCookie = function (cookieName) {
+
//引入[[Special:Gadgets]]要求的腳本和樣式
      $.cookie(cookieName, null);
+
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]);
 +
}
 +
}
  
    /* 當需要時載入對應的 scripts */
+
/* 测试元素中是否含有指定的样式 **************************************
    if (wgAction == "edit" || wgAction == "submit" || wgCanonicalSpecialPageName == 'Search') { // scripts specific to editing pages
+
* Description: 使用正则式与缓存来提高性能
      importScript('MediaWiki:Common.js/edit.js');
+
* 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);
 +
};
 +
})();
  
    /* 辅助处理 */
+
/*
    /* 1. 功能設定 */
 
    window.JSConfig = window.JSconfig || {};
 
    window.JSConfig.collapseText = wgULS('隐藏▲', '隱藏▲'); // 指示折叠收缩的默认文字
 
    window.JSConfig.expandText = wgULS('显示▼', '顯示▼'); // 指示折叠展开的默认文字
 
    window.JSConfig.autoCollapse = 2; // 文章少于 autoCollapse 个折叠块时,不自动折叠
 
    //window.JSConfig.SpecialSearchEnhancedDisabled=false; // 是否禁止增加其它搜索引擎
 
  
    /* 2. 用jQuery实现的getElementsByClassName(需不需要返回DOM对象?) */
+
== IE兼容性修正 ==
    window.getElementsByClassName = function (elm, tag, className) {
+
*/
      return $(tag + '.' + className, elm);
+
if (navigator.appName == "Microsoft Internet Explorer" && document.compatMode == "CSS1Compat"){
    };
+
(function(){
 +
var oldWidth;
 +
var docEl = document.documentElement;
  
    /* 3. 遍历 */
+
function fixIEScroll(){
    window.applyEach = function (callback, array) {
+
if (!oldWidth || docEl.clientWidth > oldWidth){
      var i = 0,
+
doFixIEScroll();
        j = array.length;
+
}else{
      while (i < j) {
+
setTimeout(doFixIEScroll, 1);
        callback(array[i++]);
+
}
      }
+
oldWidth = docEl.clientWidth;
    };
+
}
  
    /* 4. 移動元素 */
+
function doFixIEScroll() {
    window.elementMoveto = function (node, refNode, pos) { // 默认位置为refNode前
+
docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
      if (node && refNode) {
+
}
        if (pos && pos == 'after') {
 
          $(refNode).after(node);
 
        } else {
 
          $(refNode).before(node);
 
        }
 
      }
 
    };
 
  
    /* 5. 创建元素 */
+
document.attachEvent("onreadystatechange", fixIEScroll);
    window.createElement = function (tag, children, props) {
+
attachEvent("onresize", fixIEScroll);
      var element = document.createElement(tag);
+
})();
      if (!(children instanceof Array)) {
+
}
        children = [children];
 
      }
 
      applyEach(function (child) {
 
        if (typeof child == 'string') {
 
          child = document.createTextNode(child);
 
        }
 
        if (child) {
 
          element.appendChild(child);
 
        }
 
      }, children);
 
      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;
 
    };
 
  
    // wiki URL
+
/*
    window.wgProjectURL = {
 
      en: '//en.wikipedia.org',
 
      de: '//de.wikipedia.org',
 
      fr: '//fr.wikipedia.org',
 
      pl: '//pl.wikipedia.org',
 
      ja: '//ja.wikipedia.org',
 
      it: '//it.wikipedia.org',
 
      nl: '//nl.wikipedia.org',
 
      pt: '//pt.wikipedia.org',
 
      es: '//es.wikipedia.org',
 
      sv: '//sv.wikipedia.org',
 
      // 僅列前十名其它語言百科
 
      m: '//meta.wikimedia.org',
 
      b: '//zh.wikibooks.org',
 
      q: '//zh.wikiquote.org',
 
      n: '//zh.wikinews.org',
 
      wikt: '//zh.wiktionary.org',
 
      mw: '//www.mediawiki.org',
 
      commons: '//commons.wikimedia.org'
 
    };
 
  
    /** 将页面名称转换为URL
 
    *
 
    * @param page 页面名称
 
    * @param paras 附加后缀对象,用空对象{}做参数可以取得源码
 
    */
 
    window.getWikiPath = function (page, paras) {
 
      var reg = /^[a-z]+:/;
 
      var pre = page.match(reg);
 
      pre = pre && wgProjectURL[pre[0].replace(/:$/, '').toLowerCase()];
 
      if (pre) {
 
        page = page.replace(reg, '');
 
      } else {
 
        pre = wgServer;
 
      } // 保障没有相对路径,以照顾在线代理。
 
      var url = pre + wgScript + '?title=' + encodeURI(page.replace(' ', '_'));
 
      if (typeof paras == 'object') {
 
        paras.ctype = paras.ctype || 'text';
 
        paras.dontcountme = paras.dontcountme || 's';
 
        paras.action = paras.action || 'raw';
 
        for (var k in paras) {
 
          url += '&' + k + '=' + paras[k];
 
        }
 
      }
 
      return url;
 
    };
 
  
    /* 引入[[Special:Gadgets]]要求的腳本和樣式 */
+
== 段落編輯連結 ==
    if (window.requireScripts instanceof Array) {
+
*/
      applyEach(importScript, requireScripts);
+
//JSConfig.isEdit0 設置是否出現「編輯首段」按鈕
    }
+
//對不需要編輯首段的頁面,還可在頁面中加 Template:NoEdit 模板來禁用。
    if (window.requireStylesheets instanceof Array) {
+
//JSConfig.editSectionLink 設置「編輯」按鈕的位置
      applyEach(importStylesheet, requireStylesheets);
+
if (wgIsArticle && wgAction == "view") {
    }
+
//增加編輯首段按鈕
    window.requireScripts = [];
+
addOnloadHook(function(){
    window.requireScripts.push = function (script) {
+
if(!JSConfig.isEdit0||(document.getElementById&&document.getElementById('no-edit-0'))){return;}
      importScript(script);
+
var caEdit=document.getElementById&&document.getElementById('ca-edit');
    };
+
if (!caEdit){return;}
    window.requireStylesheets = [];
+
var linkAttributes={
    window.requireStylesheets.push = function (style) {
+
'href':caEdit.firstChild.href + '&section=0',
      importStylesheet(style);
+
'title':wgULS('編輯正文所有標題之前的文字(通常稱為首段或導言)','編輯正文所有標題之前的文字(通常稱首段或導言)'),
    };
+
'accesskey':'0'
 +
}
  
    /* 测试元素中是否含有指定的样式 */
+
//增加0按鈕標籤
    window.hasClass = function (elem, cls) {
+
var caEdit0 = createElement(
      return $(elem).hasClass(cls);
+
'li',
    };
+
[createElement('A',['0'],linkAttributes)],
 +
{id:'ca-edit-0'}
 +
);
 +
caEdit.className = 'istalk';
 +
elementMoveto(caEdit0,caEdit,"after");
  
    /** IE兼容性修正
+
//增加條目標題下的「編輯首段」按鈕
    *
+
var editsection0= createElement(
    *  Description: Fixes IE horizontal scrollbar bug
+
'span',
    *  Maintainers: [[User:fdcn]]
+
['[',createElement('A',[wgULS('編輯首段','編輯首段')],linkAttributes),']'],
    */
+
{'class':'editsection'}
    if ($.browser.msie) {
+
);
      var oldWidth;
+
var siteSub=document.getElementById&&document.getElementById('siteSub');
      var docEl = document.documentElement;
+
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 fixIEScroll() {
+
/*
        if (!oldWidth || docEl.clientWidth > oldWidth) {
 
          doFixIEScroll();
 
        } else {
 
          setTimeout(doFixIEScroll, 1);
 
        }
 
        oldWidth = docEl.clientWidth;
 
      }
 
  
      function doFixIEScroll() {
 
        docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
 
      }
 
  
      document.attachEvent("onreadystatechange", fixIEScroll);
+
== 增加折疊功能 ==
      attachEvent("onresize", fixIEScroll);
+
*/
 +
/** 折疊 div table *****************************
 +
*  Description: 實現div.NavFrame和table.collapsible的可折疊性。
 +
*  JSConfig的collapseText、expandText、autoCollapse屬性定義默認文字和默認最少自動折疊塊
 +
*  Maintainers: User:fdcn
 +
*/
 +
addOnloadHook(function(){
 +
function toggleState(item){
 +
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);
 +
}
  
      /* Import scripts specific to Internet Explorer 6 */
+
function cancelBubble(e){
      if (navigator.appVersion.substr(22, 1) == "6") {
+
e=e||window.event;
        importScript("MediaWiki:Common.js/IE60Fixes.js")
+
if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}
      }
+
}
    }
+
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}
  
    /* Fixes for Windows XP font rendering */
+
var links=head.getElementsByTagName("A");
    if (navigator.appVersion.search(/windows nt 5/i) != -1) {
+
for(var i=0,l;l=links[i];i++){ addClickHandler(l,cancelBubble); }
        mw.util.addCSS('.IPA {font-family: "Lucida Sans Unicode", "Arial Unicode MS";} ' +  
+
                      '.Unicode {font-family: "Arial Unicode MS", "Lucida Sans Unicode";}');
+
head.insertBefore( button, head.childNodes[0] );
    }
+
head.style.cursor = "pointer";
 +
addClickHandler( head, function(){toggleState(item);} );
 +
return item;
 +
}
 +
 +
// 折疊div
 +
function toggleNavigationBar(item)
 +
{
 +
var cls=item.state?'none':'block';
 +
for (
 +
var NavChild = item.frame.firstChild;
 +
NavChild != null;
 +
NavChild = NavChild.nextSibling
 +
){
 +
if (NavChild.className == 'NavPic' || NavChild.className == 'NavContent') {
 +
NavChild.style.display = cls;
 +
}
 +
}
 +
}
 +
 +
// 折疊表格
 +
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");
    $(function () {
+
for ( var i = 0,table; table= tables[i]; i++ ) {
      $('#p-lang li').each(function () {
+
var head = table.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
        if ($('#' + this.className + '-fa').length) {
+
items.push(createToggleButton(head,table,collapseTable));
          this.className += " FA"
+
}
          this.title = wgULS("此条目在此语言版本中为特色条目", "此條目在此語言版本中為特色條目");
 
        } else if ($('#' + this.className + '-ga').length) {
 
          this.className += " GA"
 
          this.title = wgULS("此条目在此语言版本中为优良条目", "此條目在此語言版本中為優良條目");
 
        }
 
      });
 
    });
 
  
    /** 增加摺疊功能
+
var count=items.length;
    *
+
for ( var i = 0;  i<count; i++ ) {
    * 实现div.NavFrame和table.collapsible的可折叠性。
+
item=items[i];
    * JSConfig的collapseText、expandText、autoCollapse属性定义默认文字和默认最少自动折叠块
+
if ( hasClass( item.frame, "collapsed" ) || ( count >= JSConfig.autoCollapse && hasClass( item.frame, "autocollapse" ) ) ) {
    * Maintainers: User:fdcn
+
toggleState(item);
    */
+
}
    function cancelBubble(e) {
+
}
      e = e || window.event;
+
});
      if (e.stopPropagation) {
 
        e.stopPropagation();
 
      } else {
 
        e.cancelBubble = true;
 
      }
 
    }
 
  
    function createToggleButton(head) {
+
//修正折疊後定位變化
      var parent = head;
+
hookEvent("load",function(){if(location.hash){location.href=location.hash;}});
      if (head.tagName.toLowerCase() == 'tr') { // 对表格特别处理
 
        if (head.getElementsByTagName("th").length) {
 
          parent = head.cells[parent.cells.length - 1];
 
        } else {
 
          return;
 
        }
 
      }
 
      var textS, textH, button = getElementsByClassName(head, "span", "NavToggle")[0];
 
      if (button) {
 
        parent = button.parentNode;
 
      } else {
 
        textS = createElement("span", [JSConfig.expandText], {
 
          'class': 'toggleShow'
 
        });
 
        textH = createElement("span", [JSConfig.collapseText], {
 
          'class': 'toggleHide'
 
        });
 
        button = createElement("span", [textS, textH], {
 
          'class': 'NavToggle collapseButton'
 
        });
 
      }
 
      button.style.visibility = "visible";
 
      head.className += " uncollapse toggleHotspot";
 
      parent.insertBefore(button, parent.childNodes[0]);
 
    }
 
    window.wgCollapse = function (head, container, defaultCollapse) {
 
      if (head) {
 
        createToggleButton(head);
 
      }
 
      var self = this;
 
      this.state = 0;
 
      this.container = container;
 
      applyEach(function (h) {
 
        if (h.nodeType == 1 && !hasClass(h, "uncollapse") && !hasClass(h, "toggleShow") && !hasClass(h, "toggleHide")) {
 
          h.className += " toggleHide";
 
        }
 
      }, defaultCollapse); // 预设的隐藏元素
 
  
 +
/*
  
      function getArray(clsname) {
 
        var r = [],
 
          i = 0,
 
          e, ea = getElementsByClassName(container, "*", clsname);
 
        while (e = ea[i++]) {
 
          var parent = e.parentNode;
 
          while (!hasClass(parent, 'NavFrame') && !hasClass(parent, 'collapsible')) {
 
            parent = parent.parentNode;
 
          }
 
          if (parent == container) {
 
            r.push(e);
 
          }
 
        }
 
        return r;
 
      }
 
      var toggleA = getArray("toggleShow");
 
      var toggleB = getArray("toggleHide");
 
      var hotspots = getArray("toggleHotspot");
 
  
      function _toggle(list, state) {
 
        var i = 0,
 
          e;
 
        while (e = list[i++]) {
 
          e.style.display = state ? e.showStyle || '' : 'none';
 
        }
 
      }
 
      this.toggle = function (state) {
 
        self.state = (typeof state == 'undefined') ? 1 - self.state : state;
 
        _toggle(toggleA, self.state);
 
        _toggle(toggleB, 1 - self.state);
 
      }
 
      var i = 0,
 
        h;
 
      while (h = hotspots[i++]) {
 
        applyEach(function (link) {
 
          addClickHandler(link, cancelBubble);
 
        }, h.getElementsByTagName("A"));
 
        h.style.cursor = "pointer";
 
        $(h).attr('tabindex', '0').keydown(function (event) {
 
          if (event.which == 13) { // Enter
 
            self.toggle();
 
          }
 
        });
 
        addClickHandler(h, function () {
 
          self.toggle();
 
        });
 
      }
 
    };
 
  
    $(function () {
+
== 取消修訂編輯摘要修正 ==
      if (!window.disableCollapse) {
+
*/
        // init
+
/**
        var items = [];
+
  fix edit summary prompt for undo
        applyEach(function (NavFrame) {
+
  this code fixes the fact that the undo function combined with the "no edit summary prompter" causes problems if leaving the edit summary unchanged
          var i = 0,
+
  this was added by [[:en:User:Deskana]], code by [[:en:User:Tra]]
            child = NavFrame.childNodes,
+
*/
            head;
+
addOnloadHook(function () {
          while (head = child[i++]) {
+
var autoSummary=document.getElementsByName('wpAutoSummary')[0];
            if (head.className && hasClass(head, "NavHead")) {
+
if (document.location.search.indexOf("undo=") != -1 && autoSummary)
              break;
+
{
            }
+
autoSummary.value='';
          }
+
}
          items.push(new wgCollapse(head, NavFrame, NavFrame.childNodes));
+
})
        }, getElementsByClassName(document, "div", "NavFrame"));
 
        applyEach(function (table) {
 
          var rows = table.rows;
 
          items.push(new wgCollapse(rows[0], table, rows));
 
        }, getElementsByClassName(document, "table", "collapsible"));
 
        var item, i = 0,
 
          count = items.length;
 
        while (item = items[i++]) {
 
          item.toggle(
 
          hasClass(item.container, "collapsed") || (count >= JSConfig.autoCollapse && hasClass(item.container, "autocollapse")));
 
        }
 
      }
 
    });
 
    // 修正摺疊後定位變化
 
    hookEvent("load", function () {
 
      if (location.hash) {
 
        location.href = location.hash;
 
      }
 
    });
 
 
 
    /* 取消討論頁的[+]按鈕 */
 
    $(function () {
 
      if ($('#no-newsection').length) {
 
        $('#ca-addsection').css('display', 'none');
 
      }
 
    });
 
 
 
    /* 避免在主條目中出現捲軸框 */
 
    if (!wgCanonicalNamespace) $(function () {
 
      var disableDivOverflowScroll = function (obj) {
 
        var targetdiv;
 
        for (var i = obj.childNodes.length; i-- > 0;) {
 
          if (obj.childNodes[i] && ("" + obj.childNodes[i].tagName).toLowerCase() == "div") {
 
            targetdiv = obj.childNodes[i];
 
            if (("" + targetdiv.className).indexOf("noprint") == -1 && ("" + targetdiv.className).indexOf("thumb") == -1) {
 
              if ( !! (targetdiv.style.overflow) || !! (targetdiv.style.overflowY)) with(targetdiv.style) {
 
                overflowY = "visible";
 
                padding = "";
 
                border = "";
 
                height = "";
 
              }
 
              disableDivOverflowScroll(targetdiv);
 
            }
 
          }
 
        }
 
      }
 
      disableDivOverflowScroll(document.getElementsByTagName("body")[0]);
 
    });
 
 
 
    /** metaBox
 
    *
 
    * Funcionament de la Plantilla:Metacaixa
 
    * Implementat per: Usuari:Peleguer.
 
    * Actualitzat per Joanjoc seguint les indicacions d'en Martorell
 
    */
 
    function MetaCaixaInit() {
 
      // S'executa al carregar-se la pàgina, si hi ha metacaixes,
 
      // s'assignen els esdeveniments als botons
 
      //alert("MetaCaixaInit");
 
      var i = 0 // Inicialitzem comptador de caixes
 
      for (i = 0; i <= 9; i++) {
 
        var vMc = document.getElementById("mc" + i);
 
        if (!vMc) break;
 
        //alert("MetaCaixaInit, trobada Metacaixa mc"+i);
 
        var j = 1 // Inicialitzem comptador de botons dins de la caixa
 
        var vPsIni = 0 // Pestanya visible inicial
 
        for (j = 1; j <= 9; j++) {
 
          var vBt = document.getElementById("mc" + i + "bt" + j);
 
          if (!vBt) break;
 
          //alert("MetaCaixaInit, trobat botó mc"+i+"bt"+j);
 
          vBt.onclick = MetaCaixaMostraPestanya; // A cada botó assignem l'esdeveniment onclick
 
          //alert (vBt.className);
 
          if (vBt.className == "mcBotoSel") vPsIni = j; // Si tenim un botó seleccionat, en guardem l'index
 
        }
 
        //alert ("mc="+i+", ps="+j+", psini="+vPsIni );
 
        if (vPsIni == 0) { // Si no tenim cap botó seleccionat, n'agafem un aleatòriament
 
          vPsIni = 1 + Math.floor((j - 1) * Math.random());
 
          //alert ("Activant Pestanya a l'atzar; _mc"+i+"bt"+vPsIni +"_");
 
          document.getElementById("mc" + i + "ps" + vPsIni).style.display = "block";
 
          document.getElementById("mc" + i + "ps" + vPsIni).style.visibility = "visible";
 
          document.getElementById("mc" + i + "bt" + vPsIni).className = "mcBotoSel";
 
        }
 
      }
 
    }
 
 
 
    function MetaCaixaMostraPestanya() {
 
      // S'executa al clicar una pestanya,
 
      // aquella es fa visible i les altres s'oculten
 
      var vMcNom = this.id.substr(0, 3); // A partir del nom del botó, deduïm el nom de la caixa
 
      var vIndex = this.id.substr(5, 1); // I l'index
 
      var i = 1
 
      for (i = 1; i <= 9; i++) { // busquem totes les pestanyes d'aquella caixa
 
        //alert(vMcNom+"ps"+i);
 
        var vPsElem = document.getElementById(vMcNom + "ps" + i);
 
        if (!vPsElem) break;
 
        if (vIndex == i) { // Si és la pestanya bona la mostrem i canviem la classe de botó
 
          vPsElem.style.display = "block";
 
          vPsElem.style.visibility = "visible";
 
          document.getElementById(vMcNom + "bt" + i).className = "mcBotoSel";
 
        } else { // Sinó, l'ocultem i canviem la classe de botó
 
          vPsElem.style.display = "none";
 
          vPsElem.style.visibility = "hidden";
 
          document.getElementById(vMcNom + "bt" + i).className = "mcBoto";
 
        }
 
      }
 
      return false; // evitem la recàrrega de la pàgina
 
    }
 
    addOnloadHook(MetaCaixaInit);
 
 
 
    /* 智能讨论页编辑(新建) */
 
    $(function () {
 
      var catalk = $('#ca-talk');
 
      if (catalk.hasClass('new') && wgNamespaceNumber != 2) {
 
        var a = $('a:first', catalk);
 
        a.attr('href', a.attr('href') + '&section=new');
 
      }
 
    });
 
 
 
    /** Magic editintros
 
    *
 
    * Description: Adds editintros on disambiguation pages and BLP pages.
 
    * Maintainers: [[:en:User:RockMFR]], [[User:PhiLiP]]
 
    */
 
    var addEditIntro = function (name) {
 
      $('#ca-edit, .editsection').each(function () {
 
        $('a', this).attr('href',
 
        $('a', this).attr('href') + '&editintro=' + mw.util.wikiUrlencode(name));
 
      });
 
    };
 
 
 
    if (wgNamespaceNumber == 0) {
 
      $(function () {
 
        var uei = $('#useeditintro, .useeditintro');
 
        if (uei.length) {
 
          addEditIntro(uei.eq(-1).attr('title'));
 
          uei.attr('title', '');
 
        }
 
      });
 
    }
 
 
 
    /* Top icon: [[Template:Topicon]] */
 
    $(function () {
 
      // what's the problem on modern?
 
      $('<div />').css('float', 'right').append($('.topicon').css({
 
        'float': 'right',
 
        'position': 'static'
 
      }).show()).insertBefore('#firstHeading span[dir=auto]');
 
    });
 
 
 
    /* 引用錯誤標籤名字解碼 */
 
    $(function () {
 
      $('.anchordecodeme').each(function () {
 
        $(this).text(decodeURIComponent($(this).text().replace(/\.([0-9A-F]{2})/g, '%$1')));
 
      });
 
    });
 
 
 
    /** &withCSS= and &withJS= URL parameters
 
    * Allow to try custom scripts from MediaWiki space
 
    * without editing personal .css or .js files
 
    */
 
    {
 
      var extraCSS = mw.util.getParamValue("withCSS");
 
      if ( extraCSS && extraCSS.match(/^MediaWiki:[^&<>=%]*\.css$/i) ) {
 
        importStylesheet(extraCSS);
 
      }
 
      var extraJS = mw.util.getParamValue("withJS");
 
      if ( extraJS && extraJS.match(/^MediaWiki:[^&<>=%]*\.js$/i) ) {
 
        importScript(extraJS);
 
      }
 
      var extraModule = mw.util.getParamValue("withModule");
 
      if ( extraModule ) {
 
        mw.loader.load(extraModule.split('|'));
 
      }
 
    }
 
 
 
    /* 页面历史加&hilight=高亮 */
 
    {
 
      var hilight = mw.util.getParamValue('hilight');
 
      if (wgAction === 'history' && hilight) {
 
          $.each(hilight.split(','), function (_, v) {
 
            $('input[name=oldid][value=' + v + ']').parent().addClass('not-patrolled');
 
          });
 
      }
 
    }
 
 
 
    /* Main page hacks */
 
    if ( mw.config.get( 'wgIsMainPage' ) && mw.config.get( 'wgAction' ) == 'view' ) {
 
        /* 维基百科语言列表 */
 
        $( function () {
 
            mw.util.addPortletLink(
 
                'p-lang',
 
                mw.util.wikiGetlink( 'Wikipedia:维基百科语言列表' ),
 
                wgULS( '维基百科语言列表', '維基百科語言列表' ),
 
                'interwiki-completelist',
 
                wgULS( '维基百科的完整各语言列表', '維基百科的完整各語言列表' )
 
            );
 
        } );
 
        /* Remove red links */
 
        $( 'a.new' ).contents().unwrap();
 
    }
 
  })(jQuery, mediaWiki);
 
});
 
  
/* Check for any client-side simplified/traditional Chinese conversion */
+
/*
/* This routine must be placed here to make sure the field is inserted in time */
 
$('#antispam-container').append(
 
    $('<input type="text" />').attr({
 
        id: 'wpAntiConv',
 
        value: '\u6c49\u6f22'
 
    })
 
);
 

於 2013年6月13日 (四) 11:10 的修訂

/*
所有用戶在加載任何頁面時,這裡的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前
	if(node && refNode){
		var parent=refNode.parentNode;
		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);
	};
})();

/*

== IE兼容性修正 ==
*/
if (navigator.appName == "Microsoft Internet Explorer" && document.compatMode == "CSS1Compat"){
(function(){
	var oldWidth;
	var docEl = document.documentElement;

	function fixIEScroll(){
		if (!oldWidth || docEl.clientWidth > oldWidth){
			doFixIEScroll();
		}else{
			setTimeout(doFixIEScroll, 1);
		}
		oldWidth = docEl.clientWidth;
	}

	function doFixIEScroll() {
		docEl.style.overflowX = (docEl.scrollWidth - docEl.clientWidth < 4) ? "hidden" : "";
	}

	document.attachEvent("onreadystatechange", fixIEScroll);
	attachEvent("onresize", fixIEScroll);
})();
}

/*


== 段落編輯連結 ==
*/
//JSConfig.isEdit0 設置是否出現「編輯首段」按鈕
//對不需要編輯首段的頁面,還可在頁面中加 Template:NoEdit 模板來禁用。
//JSConfig.editSectionLink 設置「編輯」按鈕的位置
if (wgIsArticle && wgAction == "view") {
	//增加編輯首段按鈕
	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]);
		}
	});
}

/*


== 增加折疊功能 ==
*/
/** 折疊 div table *****************************
 *  Description: 實現div.NavFrame和table.collapsible的可折疊性。
 *  JSConfig的collapseText、expandText、autoCollapse屬性定義默認文字和默認最少自動折疊塊
 *  Maintainers: User:fdcn
 */
addOnloadHook(function(){
	function toggleState(item){
		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){
		e=e||window.event;
		if(e.stopPropagation){e.stopPropagation();}else{e.cancelBubble=true;}
	}
	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");
		for(var i=0,l;l=links[i];i++){ addClickHandler(l,cancelBubble); }
		
		head.insertBefore( button, head.childNodes[0] );
		head.style.cursor = "pointer";
		addClickHandler( head, function(){toggleState(item);} );
		return item;
	}
	
	// 折疊div 
	function toggleNavigationBar(item)
	{
		var cls=item.state?'none':'block';
		for (
			var NavChild = item.frame.firstChild;
			NavChild != null;
			NavChild = NavChild.nextSibling
		){
			if (NavChild.className == 'NavPic' || NavChild.className == 'NavContent') {
				NavChild.style.display = cls;
			}
		}
	}
	
	// 折疊表格
	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");
	for ( var i = 0,table; table= tables[i]; i++ ) {
		var head = table.getElementsByTagName( "tr" )[0].getElementsByTagName( "th" )[0];
		items.push(createToggleButton(head,table,collapseTable));
	}

	var count=items.length;
	for ( var i = 0;  i<count; i++ ) {
		item=items[i];
		if ( hasClass( item.frame, "collapsed" ) || ( count >= JSConfig.autoCollapse && hasClass( item.frame, "autocollapse" ) ) ) {
			toggleState(item);
		}
	}
});

//修正折疊後定位變化
hookEvent("load",function(){if(location.hash){location.href=location.hash;}});

/*



== 取消修訂編輯摘要修正 ==
*/
/**
  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='';
	}
})

/*