MediaWiki:Gadget-autocomplete-core.js
注意:在保存之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:前往菜单 → 设置(Mac为Opera → Preferences),然后隐私和安全 → 清除浏览数据 → 缓存的图片和文件。
//<nowiki> $(function() { var editbox, prefix, api = new mw.Api(), autocomplete = false; const regexp1 = /\[\[((?:(?!(\[|]|\|)).)*)$/, regexp2 = /{{((?:(?!({|}|\||:|#)).)*)$/, regexp3 = /{{#invoke:((?:(?!({|}|\|)).)*)$/i, regexp4 = /{{#widget:((?:(?!({|}|\|)).)*)$/i; var getPrefix = function() { var position = editbox.prop('selectionEnd'), left = editbox.val().substring(0, position), result = null; if(result = left.match(regexp1)) { if( /^(.+)#/.test(result[1]) ) { var section = result[1].match(/^(.+)#(.*)/); return ['sec', section[1], section[2]]; } if( /^(.+):/.test(result[1]) ) { return ['*', result[1]]; } if( /^:/.test(result[1]) ) { return ['6|14', result[1]]; } return ['0', result[1]]; } if(result = left.match(regexp2)) { return ['10', result[1]]; } if(result = left.match(regexp3)) { return ['828', result[1]]; } if(result = left.match(regexp4)) { return ['274', result[1]]; } return null; }; var showHints = function() { //console.log('Autocompletion begins.'); autocomplete = true; if(prefix[1]) { updateHints(); } editbox.on('input', function() { prefix = getPrefix(); if(!prefix) { hideHints(); } else { setTimeout(function() { updateHints(); }, 500); } }); }; var hideHints = function() { //console.log('Autocompletion ends.'); autocomplete = false; editbox.off('input'); $('#autocompleteHints').remove(); }; var updateHints = function() { var hints; if( $('#autocompleteHints').length ) { hints = $('#autocompleteHints').eq(0); } else { hints = $('<div id="autocompleteHints" class="ui-widget-content">').insertAfter(editbox); hints.draggable(); hints.on('click', 'li', function(e) { var ele = $(e.target), position = editbox.prop('selectionEnd'), left = editbox.val().substring(0, position), right = editbox.val().substring(position); switch(prefix[0]) { case 'sec': left = left.replace(regexp1,'[[') + prefix[1] + '#' + ele.text() + ']]'; break; case '*': case '0': left = left.replace(regexp1,'[[') + ele.text() + ']]'; break; case '6|14': left = left.replace(regexp1,'[[:') + ele.text() + ']]'; break; case '10': left = left.replace(regexp2,'{{') + ele.text().substring(9) + '}}'; break; case '828': left = left.replace(regexp3,'{{#invoke') + ele.text().substring(2) + '}}'; break; case '274': left = left.replace(regexp4,'{{#') + ele.text() + '}}'; } editbox.val(left + right); editbox.prop('selectionStart', left.length); editbox.prop('selectionEnd', left.length); hideHints(); }); } if(!prefix[1]) { hints.html('<span class="error">' + wgUCS("请输入页面部分标题", "請輸入頁面部分標題") + '</span>'); return; } if(prefix[0] == 'sec') { api.get({action:'parse', page:prefix[1], prop:'sections', formatversion:2}) .then(function(data) { var section = data.parse.sections.map((ele) => ele.anchor), secHints = [], regexp = new RegExp('^' + prefix[2]); section.forEach(function(ele) { if(regexp.test(ele)) { secHints.push(ele); } }); if(secHints.length === 0) { hints.html('<span class="error">' + wgUCS("该页面没有对应章节", "該頁面沒有對應章節") + '</span>'); } else { hints.html('<ul><li>' + secHints.join('</li><li>') + '</li></ul>'); } }, function() { hints.html('<span class="error">' + wgUCS("没有对应页面", "沒有對應頁面") + '</span>'); } ); return; } api.get({action:'query', list:'prefixsearch', pssearch:prefix[1].replace(/^:/, ''), psnamespace:prefix[0], formatversion:2}) .then(function(data) { var titles = data.query.prefixsearch.map( (ele) => '<li>' + ele.title + '</li>' ); if(titles.length) { hints.html('<ul>' + titles.join('') + '</ul>'); } else { hints.html('<span class="error">' + wgUCS("没有对应页面", "沒有對應頁面") + '</span>'); } }); }; $('body').on('keydown', '#wpTextbox1, #Wikiplus-Quickedit', function(e) { editbox = $(this); if(e.keyCode == 9) { prefix = getPrefix(); e.preventDefault(); if(prefix && !autocomplete) { showHints(); } } if(e.keyCode == 27) { e.preventDefault(); if(autocomplete) { hideHints(); } } }); }); //</nowiki>