מדיה ויקי:Gadget-autocomplete.js
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
- אופרה: ללחוץ על Ctrl-F5.
/*
Autocomplete for links and templates
Written by [[משתמש:ערן]]
*/
mw.loader.using('jquery.ui.autocomplete',function(){
var mode="none";
var templateNSName="תבנית:";
function findLinks(res){
var pos=$( "#wpTextbox1" ).textSelection('getCaretPosition')-1;
var txt=$( "#wpTextbox1" ).val();
var lastbegin=txt.lastIndexOf("[[",pos);
var lastend=txt.lastIndexOf("]]",pos);
var isLink=lastbegin>lastend;
if(isLink) {
fillLinksList(res,txt.substr(lastbegin+2,pos-lastbegin));
mode='link';
}
else{
lastbegin=txt.lastIndexOf("{{",pos);
lastend=txt.lastIndexOf("}}",pos);
var isTemplate=lastbegin>lastend;
if(isTemplate){
fillLinksList(res,templateNSName+txt.substr(lastbegin+2,pos-lastbegin));
mode='template';
}
else{
res([]);
mode="none";
}
}
}
function fillLinksList(res,txt){
if(txt.length<=1) res([]);
else $.getJSON(mw.util.wikiScript('api'),{action:'opensearch',search:txt,format:'json'},function(data){if(data[1]) res(data[1]);});
}
function addAutocompleteLink(item){
switch(mode){
case "none": return;
case "template":item=item.substr(templateNSName.length);break;
}
if(mode=="none") return;
var pos=$( "#wpTextbox1" ).textSelection('getCaretPosition')-1;
var txt=$( "#wpTextbox1" ).val();
var lastbegin=txt.lastIndexOf((mode=="link"?"[[":"{{"),pos);
var newTxt=txt.substr(0,lastbegin)+(mode=="link"?"[[":"{{")+item+(mode=="link"?"]]":"}}")+txt.substr(pos+1);
$( "#wpTextbox1" ).val(newTxt);
$( "#wpTextbox1" ).textSelection('setSelection',{start:lastbegin+item.length+4});
}
$( "#wpTextbox1" ).autocomplete( {
source: function( request, response ) {
findLinks(response);
fixArrowsBug(this);
},
focus:function(){return false;},
select:function(e,ui){
addAutocompleteLink(ui.item.value);return false;
},
open:function(){
$(".ui-autocomplete").css('width','400px');
$(".ui-autocomplete").position({
my: "left top",
at: "left top",
of: "#editform"
});
}
});
var fixed=false;
//this is hack to prevent known serious bug in autocomplete.js that prevent default of the up and down key which may drive you crazy....
function fixArrowsBug(self){
if(fixed) return;
fixed=true;
$( "#wpTextbox1" ).unbind("keydown.autocomplete");
$( "#wpTextbox1" ).bind("keydown.autocomplete",
function(event ) {
var keyCode = $.ui.keyCode;
switch( event.keyCode ) {
case keyCode.PAGE_UP:
self._move( "previousPage", event );
break;
case keyCode.PAGE_DOWN:
self._move( "nextPage", event );
break;
case keyCode.UP:
if (!self.menu.element.is(":visible")) return;
self._move( "previous", event );
// prevent moving cursor to beginning of text field in some browsers
event.preventDefault();
break;
case keyCode.DOWN:
if (!self.menu.element.is(":visible")) return;
self._move( "next", event );
// prevent moving cursor to end of text field in some browsers
event.preventDefault();
break;
case keyCode.ENTER:
case keyCode.NUMPAD_ENTER:
// when menu is open or has focus
if ( self.menu.active ) {
event.preventDefault();
}
//passthrough - ENTER and TAB both select the current element
case keyCode.TAB:
if ( !self.menu.active ) {
return;
}
self.menu.select( event );
break;
case keyCode.ESCAPE:
self.element.val( self.term );
self.close( event );
break;
case keyCode.LEFT:
case keyCode.RIGHT:
case keyCode.SHIFT:
case keyCode.CONTROL:
case keyCode.ALT:
case keyCode.COMMAND:
case keyCode.COMMAND_RIGHT:
case keyCode.INSERT:
case keyCode.CAPS_LOCK:
case keyCode.END:
case keyCode.HOME:
// ignore metakeys (shift, ctrl, alt)
break;
default:
// keypress is triggered before the input value is changed
clearTimeout( self.searching );
self.searching = setTimeout(function() {
self.search( null, event );
}, self.options.delay );
break;
}});
}
});