caret: String in Befehle umwandeln

Ich will die onmouseover-Eigenschaft für alle divs sperren, während die Animation läuft, die von einem Menüpunt auf den anderen übergeht. Dafür setze ich eine Variable "gesperrt" und möchte per Javascript im onmouseover jedes divs eine Abfrage hinzufügen, welchen Wert die Variable hat.

Ich habe folgendes versucht:

  
var elem = document.getElementsByTagName('DIV');  
for(var i = 0; i < elem.length; i++) {  
if(elem[i].onmouseover) {  
  
<!-- entfernen der Zeilenumbrüche  
mouseoverString=String(elem[i].onmouseover).replace(/\n/g, "");  
  
<!-- Abfrage hinzufügen, "function() {" entfernen  
elem[i].onmouseover=eval("if (gesperrt==0)"+mouseoverString.slice(mouseoverString.indexOf("{"),mouseoverString.length));  
}  

Das Problem ist, dass eval(String(Befehl)) nicht den Befehl selbst, sondern den Rückgabewert des Befehls enthält; elem[i].onmouseover werden also nicht die eigentlichen Befehle, sondern nur unsinnige Rückgabewerte zugeordnet.

Wie kann ich dieses Problem umgehen?

Danke!

  1. Ich habe folgendes versucht:

    var elem = document.getElementsByTagName('DIV');
    for(var i = 0; i < elem.length; i++) {
    if(elem[i].onmouseover) {

    <!-- entfernen der Zeilenumbrüche

    Was sucht der HTML Kommentar hier?

    mouseoverString=String(elem[i].onmouseover).replace(/\n/g, "");

    Du musst im JS nicht auf irgendwelche Texte zugreifen, wenn du einen Event ändern willst. Du kannst das in etwa so machen:
    [code lang=javascript]elem[i].onmouseover = function(e) {
    if(gesperrt) return;
    // .....
    };

      
      
    Struppi.
    
    1. Du musst im JS nicht auf irgendwelche Texte zugreifen, wenn du einen Event ändern willst. Du kannst das in etwa so machen:

        
      
      > elem[i].onmouseover = function(e) {  
      > if(gesperrt) return;  
      > // .....  
      > };  
      > 
      
      

      Das Problem ist, dass ich nicht weiß, durch was ich die Zeile

        
      // .....  
      
      

      ersetzen soll. Es soll dort natürlich die Funktion stehen, die ursprünglich in elem[i].onmouseover stand, aber ich weiß nicht, wie ich sie dort hinein bekomme. Deshalb habe ich das mit den Texten versucht.

      1. Du musst im JS nicht auf irgendwelche Texte zugreifen, wenn du einen Event ändern willst. Du kannst das in etwa so machen:

        elem[i].onmouseover = function(e) {
        if(gesperrt) return;
        // .....
        };

        
        >   
        > Das Problem ist, dass ich nicht weiß, durch was ich die Zeile  
        >   
        > ~~~javascript
          
        
        > // .....  
        > 
        
        

        ersetzen soll. Es soll dort natürlich die Funktion stehen, die ursprünglich in elem[i].onmouseover stand, aber ich weiß nicht, wie ich sie dort hinein bekomme.

        Durch deine ursprüngliche Funktion.
        Vermeide inline Skripte. Hier ein weiterführender Artikerl über das Thema
        http://aktuell.de.selfhtml.org/weblog/javascript-einsatz

        Struppi.

        1. Das Problem ist, dass ich nicht weiß, durch was ich die Zeile
          // .....
          ersetzen soll. Es soll dort natürlich die Funktion stehen, die ursprünglich in elem[i].onmouseover stand, aber ich weiß nicht, wie ich sie dort hinein bekomme.

          Durch deine ursprüngliche Funktion.

          Ich weiß nicht genau, was du mit "deine ursprüngliche Funktion" meinst. Ich habe jetzt folgenden Code versucht:

            
          function mouseoverSperren(){  
           var onmouseoverAlt;  
           var elem = document.getElementsByTagName('DIV');  
           for(var i = 0; i < elem.length; i++) {  
            if(elem[i].onmouseover) {  
             onmouseoverAlt=elem[i].onmouseover;  
             elem[i].onmouseout=function(){  
              if (gesperrt) return;  
              onmouseoverAlt();  
             }  
            }  
           }  
          }  
          
          

          aber das ursprüngliche Problem bleibt bestehen; statt der tatsächlichen alten onmouseover-Funktion steht innnerhalb der Bedingung dann einfach "onmouseoverAlt();", was natürlich nichts bringt.

          Wie bekomme ich für jedes i die alten onmouseover-Funktionen in die abgeänderten neuen hinein?

          1. Ich weiß nicht genau, was du mit "deine ursprüngliche Funktion" meinst. Ich habe jetzt folgenden Code versucht:

            function mouseoverSperren(){
            var onmouseoverAlt;
            var elem = document.getElementsByTagName('DIV');
            for(var i = 0; i < elem.length; i++) {
              if(elem[i].onmouseover) {
               onmouseoverAlt=elem[i].onmouseover;
               elem[i].onmouseout=function(){
                if (gesperrt) return;
                onmouseoverAlt();
               }
              }
            }
            }

            Da sehe ich schon auf den ersten Blick, dass du einen Closure generiert hast, den du so sicher nicht wolltest. Alle onmouseover-Funktionen rufen nun die alte onmouseover-Funktion des letzten Elements auf.  
              
            
            > aber das ursprüngliche Problem bleibt bestehen; statt der tatsächlichen alten onmouseover-Funktion steht innnerhalb der Bedingung dann einfach "onmouseoverAlt();", was natürlich nichts bringt.  
            
            Wo "steht" das? Falls du "function(){if (gesperrt){return;}; onmouseoverAlt();}" meinst, das ist so korrekt. Die alte Funktion wird nicht in die neue hineingefügt, sondern von dieser aufgerufen.
            
            -- 
            Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.  
              
            Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:| 
            
          2. Das Problem ist, dass ich nicht weiß, durch was ich die Zeile
            // .....
            ersetzen soll. Es soll dort natürlich die Funktion stehen, die ursprünglich in elem[i].onmouseover stand, aber ich weiß nicht, wie ich sie dort hinein bekomme.

            Durch deine ursprüngliche Funktion.

            Ich weiß nicht genau, was du mit "deine ursprüngliche Funktion" meinst. Ich habe jetzt folgenden Code versucht:

            Ich meine die Funktion, die du im HTML Code aufrufst.

            Struppi.

            1. Das Problem ist, dass ich nicht weiß, durch was ich die Zeile
              // .....
              ersetzen soll. Es soll dort natürlich die Funktion stehen, die ursprünglich in elem[i].onmouseover stand, aber ich weiß nicht, wie ich sie dort hinein bekomme.

              Durch deine ursprüngliche Funktion.

              Ich weiß nicht genau, was du mit "deine ursprüngliche Funktion" meinst. Ich habe jetzt folgenden Code versucht:

              Ich meine die Funktion, die du im HTML Code aufrufst.

              Struppi.

              Die ursprünglichen Funktionen werden per PHP erzeugt und in den HTML-Code eingefügt. Heißt das nun, ich soll den betreffenden PHP-Code vollständig in die Javascript-Datei auslagern? Geht das überhaupt?

              1. Die ursprünglichen Funktionen werden per PHP erzeugt und in den HTML-Code eingefügt. Heißt das nun, ich soll den betreffenden PHP-Code vollständig in die Javascript-Datei auslagern? Geht das überhaupt?

                ich weiß es nicht, da ich nicht weiß was du da machst. Ich hab dir aber schon den Artikel gezeigt, wo Mathias erkläutert wie man es machen sollte.

                Struppi.

                1. Die ursprünglichen Funktionen werden per PHP erzeugt und in den HTML-Code eingefügt. Heißt das nun, ich soll den betreffenden PHP-Code vollständig in die Javascript-Datei auslagern? Geht das überhaupt?

                  ich weiß es nicht, da ich nicht weiß was du da machst. Ich hab dir aber schon den Artikel gezeigt, wo Mathias erkläutert wie man es machen sollte.

                  Es geht darum, dass bei mouseover über bestimmten Links Bilder eingeblendet werden sollen; um welches Bild es sich dabei jeweils handelt, kann über ein CMS geändert werden und wird von PHP-Code als Inline-Element erzeugt.

                  Ich habe mein ursprüngliches Problem nun gelöst, indem ich nun, wie bereits beschrieben, kein Inline-Element von PHP erzeugen lasse, sondern Javascript-Code. Dadurch ist es nun viel leichter, die onmouseover-Funktionen zu manipulieren.

                  Ich denke, die Art der Lösung ist auch im Sinne des Artikels.

                  Danke für die Hilfe!

          3. Wieso machst du dir so einen Umstand?? Wenn du von Anfang an HTML und JavaScript trennst und schon die ursprünglichen mouseover-Handler per JavaScript setzt, kannst du direkt die Anweisung »if (gesperrt) return;« dort hinein setzen. Der Sinn davon ist folgender: Wenn du nun alle Mouseover sperren willst, dann sollst du eben nicht alle Handler überschreiben müssen, sondern nur die globale Variable gesperrt ändern müssen! Das meinte Struppi mit seinem Tipp.

            for(var i = 0; i < elem.length; i++) {
              if(elem[i].onmouseover) {
               onmouseoverAlt=elem[i].onmouseover;
               elem[i].onmouseout=function(){
                if (gesperrt) return;
                onmouseoverAlt();

            Das ist im Prinzip schon sehr richtig gedacht, du machst hier onmouseoverAlt im neuen mouseout-Handler verfügbar (Closure). onmouseoverAlt wird dabei nicht verdoppelt bzw. kopiert, sondern ein und dieselbe Variable (dieselbe »Speicherstelle«) ist einfach auch in anderen Funktionen verfügbar und bleibt über den Zeitpunkt der Ausführung der ursprünglichen Funktion erhalten.
            onmouseoverAlt hat also immer nur einen Wert, und der wird mit jedem Schleifendurchlauf geändert, sodass am Ende wie gesagt die Funktion drinsteht, die ihr im letzten Schleifendurchlauf zugewiesen wurde.

            Wie bekomme ich für jedes i die alten onmouseover-Funktionen in die abgeänderten neuen hinein?

            Zu den Stichwörtern »Closures und Schleifen« wirst du im Forumsarchiv viele Lösungen finden. Eine ist die, mit einer weiteren Closure zu arbeiten, sprich, mit jedem Schleifendurchlauf eine Funktion mit dem i als Parameter aufzurufen. Darin wird dann immer eine neue Variable namens onmouseoverAlt erzeugt, und diese bleibt dann auch mit dem korrekten Wert (denn der wird darauf nicht mehr geändert) der neuen Handler-Funktion erhalten.
            https://forum.selfhtml.org/?t=178695&m=1178666

            Mathias