pArad0x: Tooltip Timeout Unterbrechen

Hallo!

Und zwar folgendes Problem.

Für normal, beendet man einen Timeout ja folgendermaßen:

function down(){  
var an = window.setTimeout('down()',1000);  
window.scrollBy(0,i);  
i++;  
}  
  
function stop() {  
window.clearTimeout(an); 

Soweit ist mir das auch bekannt, und soweit folge ich auch noch.
Und zwar, habe ich folgendes Problem.
Ich habe mir selbst einen Tooltip zusammengebastelt, und den
Code dafür binde ich nun mittels Greasemonkey folgendermaßen in eine Seite ein:

var pos1, div1;  
pos1 = document.getElementById('contentUpLeftColumn');  
if (pos1) {  
div1 = document.createElement('div');  
div1.id = "jssource";  
pos1.parentNode.insertBefore(div1, pos1);  
}  
var newScript = document.createElement("script");  
newScript.type = "text/javascript";  
newScript.src = "http://domain.tld/tooltip.js";  
document.getElementById('jssource').appendChild(newScript);

So weit ist auch alles kein Problem und funktioniert einwandfrei.
Die Funktionen zum Aufrufen des Tooltips, werden an passender Stelle
in einer Schleife hiermit eingebunden:

document.links[i].title = "";  
document.links[i].setAttribute("onMouseOver", "openToolTip('"+linkuserid+"');");  
document.links[i].setAttribute("onMouseOut", "closeToolTip('"+linkuserid+"');stop();");

Die Funktion zum Öffnen des Tooltips sieht nun Folgendermaßen aus:

var countdown;  
  
function openToolTip(id) {  
//document.getElementById('tooltip').style.display = "block";  
var countdown = setTimeout("new Effect.Appear('tooltip');", 1000);  
document.getElementById('tooltip').innerHTML = "INHALT DES TOOLTIPS.. BlaBlabla";  
}

Hier die beiden Funktionen, die beim Schliessen des Tooltips ausgeführt werden:

function closeToolTip(id) {  
document.getElementById('tooltip').style.display = "none";  
document.getElementById('tooltip').innerHTML = "";  
}  
function stop() {  
clearTimeout(countdown);  
}

Mein Problem ist nun, das im Inhalt des Tooltips eine Seite aufgerufen wird, die sehr viel Rechenleistung auf meinem Server beansprucht, da einiges berechnet werden muss, und ausgelesen.
Jedenfalls, kommt es vor, das ca 1000 Links nebeneinander sind die alle den selben Tooltip Aufrufen, und wenn man hier mit der Maus beim normalen surfen darüberfährt, hat man gleich 100 aufrufe gleichzeitig, die ja dann doch noch (wenn auch im Hintergrund) aufgerufen werden.
Oder ist es so, das nur der Letzte Tooltip dann eben, im hintergrund ausgeführt wird.
Naja, jedenfalls, ich hab nun überall im internet gesucht, nach einer Lösung die mir diesen Timeout hier wieder abbricht, aber Leider nichts gefunden.

Währe echt nett, wenn ihr mir hierbei helfen könntet..
Anbei noch ein Link zu 2 TXTs, die den kompletten Source beinhalten!
(Ohne dem Code, der den server, wie gesagt so belastet)

Danke. Christoph

Das Greasemonkey-Script:
greasemonkey.txt

Die Javascript Datei:
tooltip.js

  1. Für normal, beendet man einen Timeout ja folgendermaßen:

    function down(){

    var an = window.setTimeout('down()',1000);
    window.scrollBy(0,i);
    i++;
    }

    function stop() {
    window.clearTimeout(an);

      
    Das funktioniert nicht. Da 'an' nur lokal in der Funktion down bekannt ist, wird stop() einen Fehler erzeugen. Wobei du in deinem Skript die Variabel 'an' (die dort countdown heißt) zweimal deklarierst, einmal global und einmal lokal, daher auch keine Fehlermeldung.  
      
    Aber was dann pasiert, kannst du an dem folgendem Beispiel sehen:  
    ~~~javascript
    var v1 = 1;  
    function test() {  
     varv1 = 0;  
    }  
    alert(v1);
    

    Soweit ist mir das auch bekannt, und soweit folge ich auch noch.
    Und zwar, habe ich folgendes Problem.
    Ich habe mir selbst einen Tooltip zusammengebastelt, und den
    Code dafür binde ich nun mittels Greasemonkey folgendermaßen in eine Seite ein:

    var pos1, div1;

    pos1 = document.getElementById('contentUpLeftColumn');
    if (pos1) {
    div1 = document.createElement('div');
    div1.id = "jssource";
    pos1.parentNode.insertBefore(div1, pos1);
    }
    var newScript = document.createElement("script");
    newScript.type = "text/javascript";
    newScript.src = "http://domain.tld/tooltip.js";
    document.getElementById('jssource').appendChild(newScript);

      
    Die id für das DIV ist hier überflüssig, du kannst auch schreiben:  
    `div1.appendChild(newScript)`{:.language-javascript}  
      
    
    > ~~~javascript
    
    document.links[i].title = "";  
    
    > document.links[i].setAttribute("onMouseOver", "openToolTip('"+linkuserid+"');");  
    > document.links[i].setAttribute("onMouseOut", "closeToolTip('"+linkuserid+"');stop();");
    
    

    Nur als Tipp.

    Events über setAttribute einzubinden ist nicht unbedingt sinnvoll. Es funktioniert nicht im IE (ist in deinem Fall nicht tragisch) und es ist umständlicher.

      
    document.links[i].onmouseover = function(e) {  
    openToolTip( linkuserid );  
    }; 
    

    Wobei das nicht funktioniert, da dann linkuserid immer der letzte Wert in der Schleife ist. Der einfachste weg dies zu umgehen ist es dem Objekt die Eigenschaft zuzuweisen.

    document.links[i]._id = linkuserid;  
    document.links[i].onmouseover = function(e) {  
    openToolTip( this._id);  
    };  
    
    

    Struppi.