From c774f33aa12fcec8978defbb5972527891091eed Mon Sep 17 00:00:00 2001 From: Ilmari Karonen Date: Sat, 16 Dec 2006 19:58:25 +0000 Subject: [PATCH] (bug 7925) Change Special:Allmessages message name filter javascript to be a bit more responsive and easier on the CPU. The main improvement is actually a delay; the new code won't start filtering until you stop typing for half a second. Tested on Firefox, Opera and Konqueror; needs testing on IE at least. --- RELEASE-NOTES | 2 + includes/DefaultSettings.php | 2 +- skins/common/wikibits.js | 129 ++++++++++++++++++----------------- 3 files changed, 69 insertions(+), 64 deletions(-) diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 292635838e..1e22e998f1 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -326,6 +326,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN to the localised one, parameters/subpages are omitted * (bug 8164) Special:Booksources should use GET for form submission * Rewrite Special:Booksources to clean up interface and remove redundant code +* (bug 7925) Change Special:Allmessages message name filter javascript to be + a bit more responsive and easier on the CPU. == Languages updated == diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index a260d33db8..80c175b7ed 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -1038,7 +1038,7 @@ $wgCacheEpoch = '20030516000000'; * to ensure that client-side caches don't keep obsolete copies of global * styles. */ -$wgStyleVersion = '33'; +$wgStyleVersion = '34'; # Server-side caching: diff --git a/skins/common/wikibits.js b/skins/common/wikibits.js index ef4ebc6f07..9f9a9f03a7 100644 --- a/skins/common/wikibits.js +++ b/skins/common/wikibits.js @@ -724,86 +724,90 @@ function scrollEditBox() { hookEvent("load", scrollEditBox); +var allmessages_nodelist = false; +var allmessages_modified = false; +var allmessages_timeout = false; +var allmessages_running = false; + +function allmessagesmodified() { + allmessages_modified = !allmessages_modified; + allmessagesfilter(); +} + function allmessagesfilter() { + if ( allmessages_timeout ) + window.clearTimeout( allmessages_timeout ); + + if ( !allmessages_running ) + allmessages_timeout = window.setTimeout( 'allmessagesfilter_do();', 500 ); +} + +function allmessagesfilter_do() { + if ( !allmessages_nodelist ) + return; + var text = document.getElementById('allmessagesinput').value; - var k = document.getElementById('allmessagestable'); - if (!k) { return; } + var nodef = allmessages_modified; - var items = k.getElementsByTagName('span'); + allmessages_running = true; - var i, j; - if ( text.length > allmessages_prev.length ) { - for (i = items.length-1, j = 0; i >= 0; i--) { - j = allmessagesforeach(items, i, j, text); - } - } else { - for (i = 0, j = 0; i < items.length; i++) { - j = allmessagesforeach(items, i, j, text); - } + for ( var name in allmessages_nodelist ) { + var nodes = allmessages_nodelist[name]; + var display = ( name.indexOf( text ) == -1 ? 'none' : '' ); + + for ( var i = 0; i < nodes.length; i++) + nodes[i].style.display = + ( nodes[i].className == "def" && nodef + ? 'none' : display ); } - allmessages_prev = text; + + if ( text != document.getElementById('allmessagesinput').value || + nodef != allmessages_modified ) + allmessagesfilter_do(); // repeat + + allmessages_running = false; } -function allmessagesforeach(items, i, j, text) { - var hItem = items[i].getAttribute('id'); - if (hItem.substring(0,17) == 'sp-allmessages-i-') { - var itemA, itemB, s, k; - if (items[i].firstChild && items[i].firstChild.nodeName == '#text' && items[i].firstChild.nodeValue.indexOf(text) != -1) { - itemA = document.getElementById( hItem.replace('i', 'r1') ); - itemB = document.getElementById( hItem.replace('i', 'r2') ); - if ( itemA.style.display !== '' ) { - s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", '')"; - k = window.setTimeout(s,j++*5); - } - } else { - itemA = document.getElementById( hItem.replace('i', 'r1') ); - itemB = document.getElementById( hItem.replace('i', 'r2') ); - if ( itemA.style.display != 'none' ) { - s = "allmessageshider(\"" + hItem.replace('i', 'r1') + "\", \"" + hItem.replace('i', 'r2') + "\", 'none')"; - k = window.setTimeout(s,j++*5); - } - } +function allmessagesfilter_init() { + if ( allmessages_nodelist ) + return; + + var nodelist = new Array(); + var templist = new Array(); + + var table = document.getElementById('allmessagestable'); + if ( !table ) return; + + var rows = document.getElementsByTagName('tr'); + for ( var i = 0; i < rows.length; i++ ) { + var id = rows[i].getAttribute('id') + if ( id && id.substring(0,16) != 'sp-allmessages-r' ) continue; + templist[ id ] = rows[i]; } - return j; -} + var spans = table.getElementsByTagName('span'); + for ( var i = 0; i < spans.length; i++ ) { + var id = spans[i].getAttribute('id') + if ( id && id.substring(0,17) != 'sp-allmessages-i-' ) continue; + if ( !spans[i].firstChild || spans[i].firstChild.nodeType != 3 ) continue; -function allmessageshider(idA, idB, cstyle) { - var itemA = document.getElementById( idA ); - var itemB = document.getElementById( idB ); - if (itemA) { itemA.style.display = cstyle; } - if (itemB) { itemB.style.display = cstyle; } -} + var nodes = new Array(); + var row1 = templist[ id.replace('i', 'r1') ]; + var row2 = templist[ id.replace('i', 'r2') ]; -function allmessagesmodified() { - allmessages_modified = !allmessages_modified; - var k = document.getElementById('allmessagestable'); - if (!k) { return; } - var items = k.getElementsByTagName('tr'); - for (var i = 0, j = 0; i< items.length; i++) { - var s; - if (!allmessages_modified ) { - if ( items[i].style.display !== '' ) { - s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, '')"; - k = window.setTimeout(s,j++*5); - } - } else if (items[i].getAttribute('class') == 'def' && allmessages_modified) { - if ( items[i].style.display != 'none' ) { - s = "allmessageshider(\"" + items[i].getAttribute('id') + "\", null, 'none')"; - k = window.setTimeout(s,j++*5); - } - } + if ( row1 ) nodes[nodes.length] = row1; + if ( row2 ) nodes[nodes.length] = row2; + nodelist[ spans[i].firstChild.nodeValue ] = nodes; } -} -function allmessagesshow() { var k = document.getElementById('allmessagesfilter'); if (k) { k.style.display = ''; } - allmessages_prev = ''; - allmessages_modified = false; + allmessages_nodelist = nodelist; } +hookEvent( "load", allmessagesfilter_init ); + /* Written by Jonathan Snook, http://www.snook.ca/jonathan Add-ons by Robert Nyman, http://www.robertnyman.com @@ -885,5 +889,4 @@ function runOnloadHook() { // so the below should be redundant. It's there just in case. hookEvent("load", runOnloadHook); -hookEvent("load", allmessagesshow); hookEvent("load", mwSetupToolbar); -- 2.20.1