Gebruiker:JePe/searchsuggestions.js
Uiterlijk
Opmerking: na het publiceren is het wellicht nodig uw browsercache te legen om de veranderingen te zien.
- Firefox / Safari: houd Shift ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5 of Ctrl-R (⌘-Shift-R op een Mac)
- Google Chrome: druk op Ctrl-Shift-R (⌘-Shift-R op een Mac)
- Edge: houd Ctrl ingedrukt terwijl u:je op Vernieuwen klikt of druk op Ctrl-F5.
// <pre>
// (nl) Wanneer er een aantal letters in de zoekbox in de zijbalk
// getypt worden, haalt dit script de eerste tien titels vanaf
// de betreffende letters uit de MediaWiki API en plaatst
// die onder de zoekbox. Dit gebeurt niet meteen na het intypen
// van een letter, maar na een wachttijd van 750 milliseconden
// na het laatst ingetypte teken.
//
// (en) When some letters will be typed in the searchbox in the
// sidebar, this script gets the first ten titles from that
// letters from the MediaWiki API and places them in the
// searchbox. This happens not directly after a keypress,
// but after a waitingtime of 750 milliseconds after the
// last keypress.
//
// Auteur/author: nl:User:JePe
function processSuggest()
{
if (sugApiReq.readyState != 4) return;
if (sugApiReq.status != 200) return;
var jsonObj = eval("(" + sugApiReq.responseText + ")");
var suggestNode = document.createElement("div");
suggestNode.id = "suggestWords";
suggestNode.style.textAlign = "left";
suggestNode.style.marginTop = ".5em";
suggestNode.style.fontSize = "90%";
var pageList = jsonObj.query.allpages;
var x = 0;
for (i in pageList) {
if (sugNamespace >= 2 && x == 0) {
var suggestHeader = suggestNode.appendChild(document.createElement("div"));
suggestHeader.style.fontWeight = "bold";
suggestHeader.style.paddingLeft = ".5em";
suggestHeader.innerHTML = pageList[i].title.split(":",1) + ":";
}
var suggestLink = suggestNode.appendChild(document.createElement("a"));
suggestLink.style.display = "block";
suggestLink.style.padding = ".1em 0 .3em 0";
suggestLink.style.lineHeight = "1.1em";
suggestLink.onmouseover = function () {this.style.backgroundColor = "#ddeeff";}
suggestLink.onmouseout = function () {this.style.backgroundColor = "transparent";}
if (pageList[i].ns == 0) {
suggestLink.innerHTML = pageList[i].title;
} else {
suggestLink.innerHTML = pageList[i].title.substring(pageList[i].title.indexOf(":")+1,pageList[i].title.length);
}
if (x == 0) { firstWordPrev = suggestLink.innerHTML; x = 1; }
suggestLink.href = wgServer + pageList[i].title.replace(/([\s\S]+)/,wgArticlePath);
suggestLink.title = pageList[i].title;
}
if (jsonObj["query-continue"]) {
var moreLink = suggestNode.appendChild(document.createElement("a"));
moreLink.style.textAlign = "center";
moreLink.style.display = "block";
moreLink.style.fontWeight = "bold";
moreLink.innerHTML = "Meer...";
moreLink.href = "javascript:loadSuggestion('"+jsonObj['query-continue'].allpages.apfrom+"')";
moreLink.title = "Volgende 10 titels";
}
var node = document.getElementById("searchBody");
var suggestNodeOld = document.getElementById("suggestWords");
if (suggestNodeOld) suggestNodeOld.parentNode.removeChild(suggestNodeOld);
node.appendChild(suggestNode);
suggestionLoading = false;
}
function loadSuggestion(title)
{
if (!title) {
var searchWord = sugSearchText.value;
if (searchWord == searchTextPrev || suggestionLoading == true) return;
if (searchWord == "") {
var suggestNodeOld = document.getElementById("suggestWords");
if (suggestNodeOld) suggestNodeOld.parentNode.removeChild(suggestNodeOld);
return; }
searchTextPrev = searchWord;
searchWord = searchWord.charAt(0).toUpperCase() + searchWord.substring(1,searchWord.length);
if (searchWord == firstWordPrev.substring(0,searchWord.length) && searchWord.length >= searchLengthPrev) return;
searchLengthPrev = searchWord.length;
} else {
var searchWord = title;
}
suggestionLoading = true;
if (wgNamespaceNumber <= 0) {
sugNamespace = 0;
} else {
sugNamespace = Math.round((wgNamespaceNumber / 2) - 0.5) * 2;
}
var url = "/w/api.php?action=query&list=allpages&aplimit=10&format=json";
url += "&apnamespace=" + sugNamespace + "&apfrom=" + escape(searchWord);
if (window.XMLHttpRequest) { // native XMLHttpRequest
sugApiReq = new XMLHttpRequest();
sugApiReq.onreadystatechange = processSuggest;
sugApiReq.open("GET", url, true);
sugApiReq.send(null);
} else if (window.ActiveXObject) { // activeX version
sugApiReq = new ActiveXObject("Microsoft.XMLHTTP");
if (sugApiReq) {
sugApiReq.onreadystatechange = processSuggest;
sugApiReq.open("GET", url, true);
sugApiReq.send("");
}
}
}
function suggestWords()
{
sugSearchText = document.getElementById("searchInput");
if (sugSearchText) {
sugSearchText.onkeyup = function () {
// time to wait after the last keypress before a suggestion is loaded
clearTimeout(sugWaitTime);
sugWaitTime = setTimeout("loadSuggestion()",750);
}
}
}
var sugStartTitle = "";
var sugWaitTime;
var suggestionLoading = false;
var sugNamespace;
var searchTextPrev = "";
var searchLengthPrev = 0;
var firstWordPrev = "";
var sugApiReq;
var sugSearchText;
$(suggestWords);
// </pre>