Marzl: Eventhandler finden

Hallo,

ich habe ein Problem mit jQuery und "üblichem" Javascript (JS). Hier ein Beispiel-Skript.

Vorgesehen ist folgendes Szenario:
Hat der Benutzer JS im Browser aktiviert, soll der jQuery-Code ausgeführt werden. Der onclick-Eventhandler sorgt mit "return false" dafür, dass der Browser dem Link dabei nicht folgt. Hat der Benutzer kein JS aktiviert, wirken weder der jQuery-Code noch der Eventhandler und der Browser folgt einfach dem Link.

Das Problem ist nun aber:
Lädt der Benutzer die Seite mit deaktiviertem JS und aktiviert dies nachdem die Seite geladen ist, so ist der jQuery-Code nicht geladen, der onclick-Eventhandler kommt nun aber zum Tragen und blockiert das Folgen des Links.

Mein bisheriger Lösungsansatz (Gedankenspiel):
Ist JS aktiviert, bindet jQuery entsprechende Handler. Diese sollten sich irgendwie finden lassen. Nur wie? Ich dachte an eine Funktion a la document.getEventHandler(). Diese sollte dann entweder die gebundenen Handler liefern oder null/false/undefined. Je nach Rückgabewert kann ich dann ableiten, ob JS aktiv war oder nicht.

Gibt es da eine passende Funktion (oder Kombination mehrerer Funktionen), die das möglich machen?

Gruß
Marzl

  1. Moin!

    Das Problem ist nun aber:
    Lädt der Benutzer die Seite mit deaktiviertem JS und aktiviert dies nachdem die Seite geladen ist, so ist der jQuery-Code nicht geladen, der onclick-Eventhandler kommt nun aber zum Tragen und blockiert das Folgen des Links.

    Wie wäre es, dem onclick-Eventhandler einfach aufzugeben auch dem Link zu folgen? Der sollte sich doch aus document.getElementById(strId).href auslesen lassen.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

  2. Gibt es da eine passende Funktion (oder Kombination mehrerer Funktionen), die das möglich machen?

    Ich hatte dasselbe Problem vor kurzem: http://forum.de.selfhtml.org/archiv/2010/8/t199681/

    Es ist nicht möglich sämtliche Event-Listener und -Handler zu lesen, die auf einem (oder irgendwelchen) Elementen liegen - das musst du leider manuell machen.

    Mit jQuery lassen sich aber zumindest relativ einfach alle Elemente mit bestimmten attributen Selektieren.

    $('[onclick], [onmouseover]') selektiert z.B. alle Elemente mit onclick- und onmouseover-Attributen die du dann z.B. lesen, verwerten oder entfernen kannst.

  3. [latex]Mae  govannen![/latex]

    Das Problem ist nun aber:
    Lädt der Benutzer die Seite mit deaktiviertem JS und aktiviert dies nachdem die Seite geladen ist, so ist der jQuery-Code nicht geladen, der onclick-Eventhandler kommt nun aber zum Tragen und blockiert das Folgen des Links.

    Dann verzichte auf das onclick-Atribut und erledige auch diesen Teil in deinem Script.

    In Javascript gibt es dazu z.B. preventDefault() bzw. returnValue (IE). jQuery wird da bestimmt auch eine fertige Lösung haben.

    Cü,

    Kai

    --
    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
    in Richtung "Mess up the Web".(suit)
    Foren-Stylesheet
    1. In Javascript gibt es dazu z.B. preventDefault() bzw. returnValue (IE). jQuery wird da bestimmt auch eine fertige Lösung haben.

      ja, preventDefault :p

      1. Hallo,

        danke für die schnellen Antworten, aber das wird alles nicht funktionieren.

        Der Grund:
        Die Seite wird - wie erwähnt - OHNE aktiviertes JS geladen, wodurch alle <script>-Tags wirkungslos sind (so, als ob sie von vorn herein nicht da wären). Siehe hier.

        Die Überprüfung muss daher aus onclick="" heraus machbar sein.

        Gruß
        Marzl

        1. [latex]Mae  govannen![/latex]

          danke für die schnellen Antworten, aber das wird alles nicht funktionieren.

          Der Grund:
          Die Seite wird - wie erwähnt - OHNE aktiviertes JS geladen, wodurch alle <script>-Tags wirkungslos sind (so, als ob sie von vorn herein nicht da wären). Siehe hier.

          Genau. Wenn du return false erst per script setzt, ist es bei nachträglich eingeschalteten JS nicht gesetzt und kann  das click-event demzufolge nicht blockieren. Also wird dann dem Link gefolgt und die Aktion nicht unterdrückt. Das ist das gleiche Verhalten wie bei "JS aus".

          Cü,

          Kai

          --
          Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
          in Richtung "Mess up the Web".(suit)
          Foren-Stylesheet
          1. Hallo,

            ja, der Groschen ist gefallen. Mein Fehler. :-)

            Ich hatte in meinem Gedankenspiel zwei Dinge gemischt. onclick="" darf da natürlich nicht stehen. Und steht es doch da, dann darf es nicht "return false" sondern "return blabla()" heißen.

            Na gut, Problem gelöst. Danke für die Erleuchtung.

            Gruß
            Marzl

      2. [latex]Mae  govannen![/latex]

        In Javascript gibt es dazu z.B. preventDefault() bzw. returnValue (IE). jQuery wird da bestimmt auch eine fertige Lösung haben.

        ja, preventDefault :p

        Das wäre dann die ganz normale Event-Methode und nichts jQuery-spezifisches?
        Das würde aber - siehe molily - Probleme mit IE geben.

        Ich meinte eine Methode die folgenden Code (c&p von molilys site) umsetzt:

          
           // Existiert die Methode preventDefault? Dann rufe sie auf.  
           if (eventObjekt.preventDefault) {  
              eventObjekt.preventDefault();  
           } else {  
              // Andernfalls setze returnValue für den Internet Explorer  
              eventObjekt.returnValue = false;  
           }
        

        Aber üblicherweise sollte ohnehin return false; in der Funktion ausreichen.

        Cü,

        Kai

        --
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken
        in Richtung "Mess up the Web".(suit)
        Foren-Stylesheet
        1. Das wäre dann die ganz normale Event-Methode und nichts jQuery-spezifisches?

          Doch.

          Das würde aber - siehe molily - Probleme mit IE geben.

          Ich meinte eine Methode die folgenden Code (c&p von molilys site) umsetzt:

          // Existiert die Methode preventDefault? Dann rufe sie auf.
             if (eventObjekt.preventDefault) {
                eventObjekt.preventDefault();
             } else {
                // Andernfalls setze returnValue für den Internet Explorer
                eventObjekt.returnValue = false;
             }

            
          Im Grunde tut jQuery dasselbe - das ist ja (unter anderem) der Sinn eines Frameworks, dass man sich um solche Dinge nicht kümmern muss.
          
    2. Dann verzichte auf das onclick-Atribut und erledige auch diesen Teil in deinem Script.

      Der ist auch nicht notwendig.

      In Javascript gibt es dazu z.B. preventDefault() bzw. returnValue (IE). jQuery wird da bestimmt auch eine fertige Lösung haben.

      In dem Fall sollte ein einfaches return false in der Eventfunktion reichen.

      Struppi.

  4. Hi,

    Lädt der Benutzer die Seite mit deaktiviertem JS und aktiviert dies nachdem die Seite geladen ist, so ist der jQuery-Code nicht geladen, der onclick-Eventhandler kommt nun aber zum Tragen und blockiert das Folgen des Links.

    was bringt Deine Nutzerschaft dazu, JavaScript nach dem Laden der Seite zu aktivieren?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Moin!

      was bringt Deine Nutzerschaft dazu, JavaScript nach dem Laden der Seite zu aktivieren?

      Ist doch logisch:

      <noscript>  
      <script type="text/javascript">
      

      document.getElementsByTagName('body')[0].javascript.activ=true;

      </script>  
      </noscript>
      

      *feixendwegduck*

      fastix

      1. Hi,

        Ist doch logisch:

        *das* findest Du logisch?! Also, von Dir hätte ich nichts dermaßen Dämliches erwartet. Wie um alles in der Welt soll sowas denn funktionieren?

        <noscript>

        <script type="text/javascript">

        
        > `document.getElementsByTagName('body')[0].javascript.activ=true;`{:.language-javascript}  
        > ~~~html
        
        </script>  
        
        > </noscript>
        
        

        Wo doch jeder weiß, dass man "active" mit "e" am Schluss schreibt. Also wirklich, so ein Lapsus von Dir, tststs!

        *feixendwegduck*

        <Loriot> Ach. Ach was. </Loriot>

        Cheatah ;-)

        --
        X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes