willie.de: Eventhandler mit 'return' nachträglich einfügen

Hallö ins Forum,

ich hab mich wegen meines [?t=123968&m=798278@title=M$IE-Problems] nun doch für JS entschieden. Da ein Verweis ist, der angeklickt (oder auch fokussiert) wird, muss ich im Verweis notieren
<a onClick="return meine_func();">
, um dann eine geänderte URL zurückzugeben.

Ich möchte jetzt den Eventhandler - damit er in normalen Browsern nicht stört - nachträglich einfügen. Normalerweise mach ich das über
document.getElementById("id").onclick=function() {...}
Das funktioniert gut bei Formularen. Wie krieg ich das mit einem 'return' für den Verweis hin? Hab Null Idee.

Danke für Unterstützung und
Grüße aus Leipzig
willie

--
sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
Selfcode Decoder
  1. hi,

    document.getElementById("id").onclick=function() {...}
    Das funktioniert gut bei Formularen. Wie krieg ich das mit einem 'return' für den Verweis hin? Hab Null Idee.

    Hast du probiert, diese Funktion mittels return einen Rückgabewert liefern zu lassen?

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallö wahsaga,

      Hast du probiert, diese Funktion mittels return einen Rückgabewert liefern zu lassen?

      Ja, aber nur ein 'true'. Zur Zeit siehts so aus (alles ausschließlich für M$IE):

      function ch_link() {  
      ftp_pw=prompt("Geben Sie Ihr FTP-Passwort ein!", "");  
      document.all.ftp.href="ftp://benutzername:"+ftp_pw+"@domain.tld";  
      return true;  
      }
      

      Und im Verweis mit id="ftp" steht
      onClick="return ch_link();" onKeypress="return ch_link();"

      Ich muss doch den Klick bzw. die Eingabe mit dem 'return' abfangen. Oder?!

      Danke für Unterstützung und
      Grüße aus Leipzig
      willie

      --
      sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
      Selfcode Decoder
      1. Hast du probiert, diese Funktion mittels return einen Rückgabewert liefern zu lassen?

        kommt drauf an was du willst.

        Ja, aber nur ein 'true'. Zur Zeit siehts so aus (alles ausschließlich für M$IE):

        Absolut nicht nötig dich auf den IE zu beschränken.

        function ch_link() {

        ftp_pw=prompt("Geben Sie Ihr FTP-Passwort ein!", "");
        document.all.ftp.href="ftp://benutzername:"+ftp_pw+"@domain.tld";
        return true;
        }

        
        >   
        > Und im Verweis mit id="ftp" steht  
        > `onClick="return ch_link();" onKeypress="return ch_link();"`{:.language-JavaScript}  
          
        onclick reicht hier aus.  
        `onclick="return ch_link(this);"`{:.language-JavaScript}  
          
        und dann  
        ~~~javascript
        function ch_link(link)  
        {  
        var ftp_pw=prompt("Geben Sie Ihr FTP-Passwort ein!", "");  
        ink.href="ftp://benutzername:"+ftp_pw+"@domain.tld";  
        return true;  
        }
        

        Ich muss doch den Klick bzw. die Eingabe mit dem 'return' abfangen. Oder?!

        nein, nur wenn er nicht ausgeführt werden soll.

        Struppi.

        1. Hallö Struppi,

          Absolut nicht nötig dich auf den IE zu beschränken.

          Aber sinnvoll, da ausschließlich der IE das Script benötigt.

          onclick reicht hier aus.

          Okay.

          onclick="return ch_link(this);"

          Genau das will ich aber hinterher, per JavaScript, einfügen.

          Ich muss doch den Klick bzw. die Eingabe mit dem 'return' abfangen. Oder?!
          nein, nur wenn er nicht ausgeführt werden soll.

          Er soll nicht sofort, sondern mit neuem Verweisziel ausgeführt werden.

          Danke für Unterstützung und
          Grüße aus Leipzig
          willie

          --
          sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
          Selfcode Decoder
          1. Hallo Willie,

            wenns eh nur für den IE bestimmt ist, dann nimmer doch innerHTML

            Gruß aus Berlin!
            eddi

            --
            Wer Rechtschreibfehler findet, darf sie behalten.
            1. Hallö XaraX,

              wenns eh nur für den IE bestimmt ist, dann nimmer doch innerHTML

              Du meinst, ich sollte dem umschließenden Element für den IE einen entsprechenden Inhalt (mit onClick im Verweis) zuweisen?!

              Vor allem hält mich von dieser Lösung ab: "Die Eigenschaft innerHTML sollten Sie immer erst abhängig von Aktionen wie Verweisklicks" - da wäre ich wieder bei Ausgangsproblem - "oder mit einem Seite setTimeout() von einigen Sekunden davor (anwenden)." Was mache ich, wenn die Besucher schneller sind als mein Timeout?

              Danke für Unterstützung und
              Grüße aus Leipzig
              willie

              --
              sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
              Selfcode Decoder
          2. Ich muss doch den Klick bzw. die Eingabe mit dem 'return' abfangen. Oder?!
            nein, nur wenn er nicht ausgeführt werden soll.
            Er soll nicht sofort, sondern mit neuem Verweisziel ausgeführt werden.

            wenn du einfach gesagt hättest was du willst, dann wäre uns das rumraten erspart geblieben.

            Wenn ich dich richtig verstehe, soll nur der IE nach dem ersten klick auf einen Link das Ziel ändern und erst beim zweiten Klick die Seite aufrufen?

            Struppi.

            1. Hallö nochmal,

              Wenn ich dich richtig verstehe, soll nur der IE nach dem ersten klick auf einen Link das Ziel ändern und erst beim zweiten Klick die Seite aufrufen?

              Jupp. Genau so.

              In meinem Eingangsposting hatte ich den Link zum Originalproblem falsch gesetzt, es ging um diesen Beitrag. Vielleicht wird da klarer, wieso ich nur den IE bedienen will.

              Wie schon gesagt: ich möchte einen Eventhandler nachträglich einfügen (das wäre kein Problem). Dieser soll aber die Funktion mit 'return' aufrufen. Bisher hab ich dafür keine Lösung.

              Mein Behelf sieht grad so aus:

              • ich definiere eine leere Funktion für normale Browser, damit später kein JS-Fehler auftritt
                  function ch_link() { }
              • für den IE füge ich innerhalb
                  <!--[if IE]><script src="/msie.js" type="text/javascript"></script><![endif]-->
                  eine Funktion hinzu:
                  ~~~JavaScript function ch_link() {
                  ftp_pw=prompt("Geben Sie Ihr FTP-Passwort ein!", "");
                  if(ftp_pw==undefined || ftp_pw=="" || ftp_pw==null ) {
                  alert("Sie müssen Ihr FTP-Passwort eingeben!\n\rVersuchen Sie es noch einmal!");
                  return false;
                  }
                  else {
                  document.all.ftp.href="ftp://benutzername:"+ftp_pw+"@domain.tld";
                  return true;
                  }}
              - der Verweis mit id="ftp" bekommt  
                `onClick="return ch_link();" onSubmit="return ch_link();"`{:.language-JavaScript}  
                
              Meine Probleme:  
              - ich möchte die beiden Eventhandler nachträglich hinzufügen, um normale Browser bzw. Anwender nicht mit JS zu belasten  
              - ich weiß gar nicht, ob 'onSubmit' der richtige Handler (vielleicht onKeypress etc.) für die Bedienung per Tastatur ist  
              - ich verstehe nicht ganz, welchen Wert das prompt beim Abbrechen oder bei keiner Eingabe bekommt  
                
              Wie gesagt, wenn es eine bessere Lösung als JS für [mein Problem mit FTP](https://forum.selfhtml.org/?t=124086&m=799104) gibt: Ich danke für alle Tipps!  
                
              Danke für Unterstützung und  
              Grüße aus Leipzig  
              willie
              
              -- 
              sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|  
              [Selfcode Decoder](http://www.peter.in-berlin.de/projekte/selfcode/?code=sh%3A%28+fo%3A%7C+ch%3A%3F+rl%3A%28+br%3A%3E+n4%3A%28+ie%3A%25+mo%3A%7D+va%3A%7D+de%3A%3E+zu%3A%7D+fl%3A%28+ss%3A%7C+ls%3A%23+js%3A%7C)
              
              1. In meinem Eingangsposting hatte ich den Link zum Originalproblem falsch gesetzt, es ging um diesen Beitrag. Vielleicht wird da klarer, wieso ich nur den IE bedienen will.

                Ich vermute dass es da bessere Lösung gibt. Aber dazu kann ich dir nichts sagen

                Wie schon gesagt: ich möchte einen Eventhandler nachträglich einfügen (das wäre kein Problem). Dieser soll aber die Funktion mit 'return' aufrufen. Bisher hab ich dafür keine Lösung.

                Was hast du den mit deinem return?

                return springt aus einer Funktion und gibt evtl. einen Wert zurück. In diesem Fall ist es so, gibt deine Funktion false zuürck wird der Link nicht ausgeführt, bei allen anderen Rückgabewerten wird er ausgeführt.

                Die Lösung könnte so aussehen:

                <a href="ftp://user@xxx.ltd" onclick="return pwd(this);">ftp Login</a>
                <script type="text/javascript">
                function pwd(link)
                {
                   if(!document.all) return;
                   var pwd = prompt('Passwort?', '');
                   if(pwd == null) return false;
                   var at = link.href.indexOf('@');
                   link.href = link.href.substring(0, at ) + ':' + pwd + link.href.substring(at);
                   return true;
                }
                </script>

                Struppi.

                1. Hallö nochmal,

                  ich möchte einen Eventhandler nachträglich einfügen.

                  ....................................^

                  <a href="ftp://user@xxx.ltd" onclick="return pwd(this);">ftp Login</a>

                  ................................^
                  Das kann also nicht im Verweis stehen. Ob ich die Funktion mit 'this' oder per id-Zugriff ausführe, ist soweit schnuppe.

                  Danke für Unterstützung und
                  Grüße aus Leipzig
                  willie

                  --
                  sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                  Selfcode Decoder
                  1. ich möchte einen Eventhandler nachträglich einfügen.
                    ....................................^

                    Warum erst dann?

                    <a href="ftp://user@xxx.ltd" onclick="return pwd(this);">ftp Login</a>
                    ................................^
                    Das kann also nicht im Verweis stehen. Ob ich die Funktion mit 'this' oder per id-Zugriff ausführe, ist soweit schnuppe.

                    Klar, aber was ist der Vorteil über die ID?

                    Wenn du aus welchem Grund auch immer erst nach dem laden diesen Link ändern willst, dann z.b. so

                    window.onload = function()
                    {
                    for(var i = 0; i < document.links.length; i++)
                    {
                    if(document.links[i].href.indexOf('ftp') == 0)
                    document.links[i].onclick = pwd;
                    }
                    }

                    Struppi.

                    1. Hallö ins Forum,

                      Warum erst dann?

                      Damit das JS in anderen Brwosern gar nicht erst ausgeführt wird.

                      Klar, aber was ist der Vorteil über die ID?

                      Keiner. Was ist der Vorteil über this?

                      Wenn du aus welchem Grund auch immer erst nach dem laden diesen Link ändern willst, dann z.b. so
                      window.onload = function()
                      {
                      for(var i = 0; i < document.links.length; i++)
                      {
                      if(document.links[i].href.indexOf('ftp') == 0)
                      document.links[i].onclick = pwd;
                      }
                      }

                      Die Funktion soll mit einem 'return pwd' aufgerufen werden. Wie ist die Notation dafür?
                      document.links[i].onclick = return pwd; funktioniert nicht.

                      Danke für Unterstützung und
                      Grüße aus Leipzig
                      willie

                      --
                      sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                      Selfcode Decoder
                      1. hi,

                        Die Funktion soll mit einem 'return pwd' aufgerufen werden.

                        Diese Formulierung ergibt keinen Sinn.

                        Wie ist die Notation dafür?

                        Du möchtest mit deinem dynamisch zugewiesenen Eventhandler das gleiche Ergebnis erzielen, als wenn du onClick="return funktion()" im HTML notiert hättest?

                        Dann gehe bitte auf meine Frage aus der allerersten Antwort ein.

                        gruß,
                        wahsaga

                        --
                        /voodoo.css:
                        #GeorgeWBush { position:absolute; bottom:-6ft; }
                        1. Hallö ins Forum,

                          Du möchtest mit deinem dynamisch zugewiesenen Eventhandler das gleiche Ergebnis erzielen, als wenn du onClick="return funktion()" im HTML notiert hättest?

                          Ja, gerne. das ist seit heute morgen mein Ziel.

                          Dann gehe bitte auf meine Frage aus der allerersten Antwort ein.

                          Ich spar mir jetzt mal, zu zählen, wie oft die &raquo; da stehen müssten:

                          Hast du probiert, diese Funktion mittels return einen Rückgabewert liefern zu lassen?
                          Ja, aber nur ein 'true'.

                          ...danach hatte ich meinen spärlichen Code gepostet. Reichte das nicht als darauf eingehen aus?

                          Was sollte ich denn 'return'en?
                          return document.all.ftp.href oder return ftp_pw ergibt keinen Sinn. Hilf mir doch mal bitte auf die Sprünge!

                          Danke für Unterstützung und
                          Grüße aus Leipzig
                          willie

                          --
                          sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                          Selfcode Decoder
                          1. hi,

                            Hast du probiert, diese Funktion mittels return einen Rückgabewert liefern zu lassen?
                            Ja, aber nur ein 'true'.
                            ...danach hatte ich meinen spärlichen Code gepostet. Reichte das nicht als darauf eingehen aus?

                            Was sollte ich denn 'return'en?

                            Woher soll ich denn Wissen, _von was_ du es abhängig machen möchtest, ob du die weitere Abarbeitung des Klick-Ereignisses an dieser Stelle abbrechen oder fortführen willst?

                            gruß,
                            wahsaga

                            --
                            /voodoo.css:
                            #GeorgeWBush { position:absolute; bottom:-6ft; }
                            1. Hallö wahsaga,

                              Woher soll ich denn Wissen, _von was_ du es abhängig machen möchtest, ob du die weitere Abarbeitung des Klick-Ereignisses an dieser Stelle abbrechen oder fortführen willst?

                              Vielleicht verstehe ich da 'return' falsch. Mein Ziel ist, dass das Klickereignis unterbrochen wird, damit der Verweis geändert werden kann.

                              Die Abarbeitung des Ereignisses kann eigentlich nach Eingabe einer zusätzlichen Angabe durch den Anwender in jedem Fall weitergeführt werden. Eigentlich heißt hier: auch bei keiner/ungültiger Eingabe, das ist eher eine Form- bzw. Komfortangelenheit.

                              Danke für Unterstützung und
                              Grüße aus Leipzig
                              willie

                              --
                              sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                              Selfcode Decoder
                              1. Woher soll ich denn Wissen, _von was_ du es abhängig machen möchtest, ob du die weitere Abarbeitung des Klick-Ereignisses an dieser Stelle abbrechen oder fortführen willst?

                                Vielleicht verstehe ich da 'return' falsch. Mein Ziel ist, dass das Klickereignis unterbrochen wird, damit der Verweis geändert werden kann.

                                eigentlich wurde dir schon alles gesagt und gezeigt, du hast es nur biosher nicht geschafft umzusetzen oder ignorierst das was ich dir schon geschriben habe.

                                return false führt den Verweis auf die die Eigenschaft .href NICHT aus, alle anderen Rückgabewerte schon. Was das mit dem ändern zu tun hat ist mir nicht klar.

                                Die Abarbeitung des Ereignisses kann eigentlich nach Eingabe einer zusätzlichen Angabe durch den Anwender in jedem Fall weitergeführt werden. Eigentlich heißt hier: auch bei keiner/ungültiger Eingabe, das ist eher eine Form- bzw. Komfortangelenheit.

                                Alle Rückgabewerte ausser return false führen den Link aus.

                                Struppi.

                                1. Danke, Struppi!

                                  eigentlich wurde dir schon alles gesagt und gezeigt, du hast es nur biosher nicht geschafft umzusetzen oder ignorierst das was ich dir schon geschriben habe.

                                  Das stimmt. Ehrlich gesagt weiß ich auch nicht, wieso dein letztes Script bei mir anfangs nicht funktioniert hat. Wahrscheinlich hab ich beim Anpassen irgendeinen Fehler in der Groß-/Kleinschreibung des Codes gehabt. (altes Leiden...)

                                  Der Tipp mit 'onLoad' war der entscheidende. (Hätt ich ja auch selbst drauf kommen können.) Jetzt funktioniert alles wie gewünscht.

                                  Noch eine Frage zur Ausführung: Ich hab alles in einem eingebundenen Script und denke, es sollte erst nach dem Laden des Links selbst geladen werden. Ist das korrekt?

                                  Alle Rückgabewerte ausser return false führen den Link aus.

                                  Das ist mir soweit auch klar. Da du dich ja offensichtlich wie ein Hai im JavaScript-Gewässer bewegst ;-) - kannst du mir sagen, wie ich auf die irrige Annahme gekommen war, dass die Funktion für 'onClick' mit 'return' geladen werden muss? (ernsthafte Frage)

                                  Großes DANKE und eine Bitte um Entschuldigung für meine Ignoranz!

                                  Grüße aus Leipzig
                                  willie

                                  --
                                  sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                                  Selfcode Decoder
                                  1. eigentlich wurde dir schon alles gesagt und gezeigt, du hast es nur biosher nicht geschafft umzusetzen oder ignorierst das was ich dir schon geschriben habe.

                                    (was blöde Tippfehler)

                                    Das stimmt. Ehrlich gesagt weiß ich auch nicht, wieso dein letztes Script bei mir anfangs nicht funktioniert hat. Wahrscheinlich hab ich beim Anpassen irgendeinen Fehler in der Groß-/Kleinschreibung des Codes gehabt. (altes Leiden...)

                                    Ich dachte schon ich spinne, erst tippt man sich die Finger wund und dannn ...

                                    Der Tipp mit 'onLoad' war der entscheidende. (Hätt ich ja auch selbst drauf kommen können.) Jetzt funktioniert alles wie gewünscht.

                                    Noch eine Frage zur Ausführung: Ich hab alles in einem eingebundenen Script und denke, es sollte erst nach dem Laden des Links selbst geladen werden. Ist das korrekt?

                                    Ja, onload wird ausgeführt nachdem die Seite geladen (nicht die Links) wurde.

                                    Du kannst, weil du ja ausschließlich den IE haben willst auch das schon in einer Bedingung verpacken:

                                    if(document.all && window.clipboardData)  
                                    {  
                                      
                                    window.onload = function()  
                                    {  
                                       for(var i = 0; i < document.links.length; i++)  
                                       {  
                                           if(document.links[i].href.indexOf('ftp') == 0)  
                                           document.links[i].onclick = pwd;  
                                       }  
                                    }  
                                    }
                                    

                                    Dann kann auch der Test in pwd() entfallen.

                                    Hier eine Liste der Eigenschaften von verschiedenen Browern
                                    http://www.lipfert-malik.de/webdesign/tutorial/bsp/browser_js_test.html
                                    (der gute Mann ist fix und hat schon teilweise den IE 7 dabei)

                                    Alle Rückgabewerte ausser return false führen den Link aus.
                                    Das ist mir soweit auch klar. Da du dich ja offensichtlich wie ein Hai im JavaScript-Gewässer bewegst ;-) - kannst du mir sagen, wie ich auf die irrige Annahme gekommen war, dass die Funktion für 'onClick' mit 'return' geladen werden muss? (ernsthafte Frage)

                                    Ist mir auch unverständlich, ich weiß ja nicht was für einen Background du hast, aber ich kann das auch nicht herleiten.

                                    Großes DANKE und eine Bitte um Entschuldigung für meine Ignoranz!

                                    Bitte

                                    Struppi.

                                    1. Hallö nochmal,

                                      Ich dachte schon ich spinne, erst tippt man sich die Finger wund und dannn ...

                                      Jaja. So ist das mit ignoranten Laien ;-)

                                      Ja, onload wird ausgeführt nachdem die Seite geladen (nicht die Links) wurde.

                                      Oké. Da kann ichs ja auch im Dateikopf laden. Sehr gut.

                                      Nochmals DANKE für Unterstützung und
                                      Grüße aus Leipzig
                                      willie

                                      --
                                      sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                                      Selfcode Decoder
                      2. Warum erst dann?
                        Damit das JS in anderen Brwosern gar nicht erst ausgeführt wird.

                        Das wird doch durch meine Abfrage in meinem Beispiel aus https://forum.selfhtml.org/?t=124121&m=799485 verhindert.

                        Klar, aber was ist der Vorteil über die ID?
                        Keiner. Was ist der Vorteil über this?

                        Das du nicht erst nach der Referenz suchen musst
                        das die Funktion auch ohne ID oder Name funktioniert
                        das es keien Probleme gibt falls du dich mal entscheidest die ID umzubenenen.

                        Wenn du aus welchem Grund auch immer erst nach dem laden diesen Link ändern willst, dann z.b. so
                        window.onload = function()
                        {
                        for(var i = 0; i < document.links.length; i++)
                        {
                        if(document.links[i].href.indexOf('ftp') == 0)
                        document.links[i].onclick = pwd;
                        }
                        }
                        Die Funktion soll mit einem 'return pwd' aufgerufen werden. Wie ist die Notation dafür?
                        document.links[i].onclick = return pwd; funktioniert nicht.

                        Hab ich das geschrieben?
                        Hast du obiges ausprobiert?

                        Struppi.

                        1. Hallö Struppi,

                          nochmal zwei Dinge ganz klar:
                          1. Ich will JavaScript für andere Browser vermeiden.
                          2. Ich möchte keinen Eventhandler im Verweis stehen haben.

                          Es soll nicht irgendeine Abfrage ausgeführt werden, nein: Es soll _überhaupt kein JavaScript_ ausgeführt werden.

                          Nebenbei: auch andere Browser kennen Microsofts all-object.

                          Danke für deine Aufmerksamkeit!

                          Grüße aus Leipzig
                          willie

                          --
                          sh:( fo:| ch:? rl:( br:> n4:( ie:% mo:} va:} de:> zu:} fl:( ss:| ls:# js:|
                          Selfcode Decoder