NeoN: onclick=variable

Hi,

Scheint sehr einfach zu sein, will aber nicht:

  
var browser = "";  
if(navigator.appName == "Microsoft Internet Explorer")  
{  
   browser = "ProcessA()"  
}  
else  
{  
   browser = "ProcessB()";  
}  
  
function ProcessA(){ //do something}  
function ProcessB(){ //do somethin else}  

  
 <button onclick=browser>Los!</button>  

onlick=browser geht nicht
onclick="browser" geht auch nicht

was ist hier verkehrt???

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

    Scheint sehr einfach zu sein, will aber nicht:

    was ist hier verkehrt???

    Einiges. Z.B. das hier:

    if(navigator.appName == "Microsoft Internet Explorer")

      
    Niemals nach Browsern selektieren, immer nach den Methoden/Eigenschaften, die der Browser kennt. [-> Fallunterscheidungen in JavaScript](http://aktuell.de.selfhtml.org/artikel/javascript/objektabfragen/)  
      
      
    
    > ~~~html
      
    
    >  <button onclick=browser>Los!</button>  
    > 
    
    

    onlick=browser geht nicht
    onclick="browser" geht auch nicht

      
     <button onclick=Process>Los!</button>  
    
    

    und die Abfrage (nach features) innerhalb dieser Funktion machen.

    Cü,

    Kai

    --
    Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
    Foren-Stylesheet Site Selfzeug JS-Lookup
    SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
    1. Niemals nach Browsern selektieren, immer nach den Methoden/Eigenschaften, die der Browser kennt. -> Fallunterscheidungen in JavaScript

      Das verstehe ich nicht. Ich will nur wissen, ob es IE ist oder nicht. Ob es IE 6,7,8 Englisch , Deutsch oder Java Enabled interessiert mich gar nicht.

      Meine Frage bleibt jedoch unbeantwortet: Was muss ich bei onclick= setzen, damit ProcessA() oder ProcessB() je nachdem ausgeführt wird??? In anderen Sprachen wäre es ein Funktionszeiger oder ein Delegate.

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

        Das verstehe ich nicht. Ich will nur wissen, ob es IE ist oder nicht. Ob es IE 6,7,8 Englisch , Deutsch oder Java Enabled interessiert mich gar nicht.

        Dann ist conditional compliation aus der Antwort von Gunnar die beste Methode.

        Meine Frage bleibt jedoch unbeantwortet: Was muss ich bei onclick= setzen, damit ProcessA() oder ProcessB() je nachdem ausgeführt wird??? In anderen Sprachen wäre es ein Funktionszeiger oder ein Delegate.

        Du darfst bei der Zuweisung nicht mit Zeichenketten arbeiten.
        Du darfst aber auch nicht, wenn du die Anführungszeichen wegläßt, die Funktion durch die Klammern () ausführen, damit weist du der Variable browser nur den Rückgabewert von ProcessA oder ProcessB zu.

        Du willst vielmehr mit der Referenz auf die jeweilige Funktion arbeiten. Also einfach der Funktionsname ohne Anführungszeichen, Klammern oder ähnliches.

        Das wäre demzufolge z.B. browser = ProcessA.

        demzufolge:

        <script type="text/javascript">  
        var browser;  
        if (/*@cc_on !*/false) { // Alle Browser außer IE sehen hier false und springen in den else-Zweig  
                                 // IE verarbeitet den "Kommentarinhalt" und sieht !false also true  
          browser = ProcessA;  
        }  
        else {  
          browser = ProcessB;  
        }  
          
        function ProcessA(){alert("a")};  
        function ProcessB(){alert("b")};  
          
        </script>  
        <button onclick="browser()">Los!</button>  
        
        

        Cü,

        Kai

        --
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
        1. [latex]Mae  govannen![/latex]

          <script type="text/javascript">

          var browser;
          if (/@cc_on !/false) {

            
          Da ist ein @ verlorengegangen. (Sch...  Überschreibmodus)  
            
          `if (/*@cc_on !@*/false) {`{:.language-javascript}  
            
          Cü,  
            
          Kai
          
          -- 
          Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". ([suit](https://forum.selfhtml.org/?t=197497&m=1324775))  
          [Foren-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet) [Site](http://knrs.de/) [Selfzeug](http://selfhtml.knrs.de/) [JS-Lookup](http://js.knrs.de/lookup/)  
          SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
          
        2. @@Kai345:

          nuqneH

          if (/*@cc_on !*/false) { // Alle Browser außer IE sehen hier false und springen in den else-Zweig
                                   // IE verarbeitet den "Kommentarinhalt" und sieht !false also true
            browser = ProcessA;
          }
          else {
            browser = ProcessB;
          }

          Ärgs!! Das sieht mehr nach Gehacke als nach Programmierung aus. Außerdem wird die JavaScript-Engine mit einer unnötigen if-Abfrage belastet.

          Besser so:

          /*@cc_on  
             /*@if (@_jscript)  
                browser = ProcessA;  
             @else @*/  
                browser = ProcessB;  
             /*@end  
          @*/
          

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
          1. Thanks an alle!

            1. Der Fehler war: statt browser=ProcessA; hatte ich browser = ProcessA(); stehen gehabt.
            2. Die Browser-Überprüfung mit cocoa funzt auch perfekt.

              1. Der Fehler war: statt browser=ProcessA; hatte ich browser = ProcessA(); stehen gehabt.

              Also die funktion aufgerufen anstatt die Referenz zu übergeben.

              1. Die Browser-Überprüfung mit cocoa funzt auch perfekt.

              Eine Browserüberprüfung ist in 99% der Fälle unnötig, i.d.R. reicht die Featureprüfung

              Struppi.

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

            Ärgs!! Das sieht mehr nach Gehacke als nach Programmierung aus. Außerdem wird die JavaScript-Engine mit einer unnötigen if-Abfrage belastet.

            Mir ist die eine winzige "Belastung" (In Zeiten von Müll wie jQuery, Prototype, Dojo und wie sie alle heißen ist das Herummäkeln an einer einzigen If-Abfrage schon fast ein witz) lieber als die untenstehenden Nachteile.

            Zumal coco meiner Meinung nach maximal null bis ein Mal in einem Javascript auftreten sollte, schon allein die Existenz schlechter JS-minifizierer ist ein Grund dagegen. Daher teste ich dann doch möglichst lieber auf IE-eigene Features...

            Besser so:

            /*@cc_on

            /@if (@_jscript)
                  browser = ProcessA;
               @else @
            /
                  browser = ProcessB;
               /@end
            @
            /

              
            Klar, geht auch.  
              
            Hat auch einige Nachteile:  
            - Aus Sicht der Javascript-Syntaxregeln unerlaubte Verschachtelung von Kommentaren.  
            - Keine Syntax-Hervorhebung, da alles als Kommentar angesehen wird, daher fehlerträchtig,  
               da man Vertipper nicht unbeding bemerkt.  
            - mehr Schreibaufwand  
            - eine seltsame Syntax, bei der man akute @-itis bekommt  
            - Wird schneller unübersichtlich, da die Logik im Kommentar sitzt  
            - Alles, was ich gerade vergessen habe ;)  
              
            Cü,  
              
            Kai
            
            -- 
            Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". ([suit](https://forum.selfhtml.org/?t=197497&m=1324775))  
            [Foren-Stylesheet](http://selfhtml.knrs.de/#h_stylesheet) [Site](http://knrs.de/) [Selfzeug](http://selfhtml.knrs.de/) [JS-Lookup](http://js.knrs.de/lookup/)  
            SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
            
            1. Mahlzeit Kai345,

              • eine seltsame Syntax, bei der man akute @-itis bekommt

              An der leidet Gunnar doch sowieso ... *SCNR*

              MfG,
              EKKi

              PS: Wobei - jetzt wird mir das auch klar: er will die Krankheit dadurch offenbar effektiver verteilen als bisher ... ;-)

              --
              sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
            2. @@Kai345:

              nuqneH

              Hat auch einige Nachteile:

              • Aus Sicht der Javascript-Syntaxregeln unerlaubte Verschachtelung von Kommentaren.

              Nope. '/*' ist innerhalb eines mehrzeiligen Kommentars erlaubt. [ECMA-262], §7.4, p. 16

              Allerdings muss es auch nicht sein:

              /*@cc_on  
                 @if (@_jscript)  
                    browser = ProcessA;  
                 @else @*/  
                    browser = ProcessB;  
                 /*@end  
              @*/
              
              • Keine Syntax-Hervorhebung, da alles als Kommentar angesehen wird, daher fehlerträchtig, da man Vertipper nicht unbeding bemerkt.

              Geschmackssache. Es SIND ja auch Kommentare. So sieht man dafür deutlich, welcher Code für normale Browser gilt und welcher für IEs.

              • mehr Schreibaufwand

              ?? Och, komm.

              • eine seltsame Syntax, bei der man akute @-itis bekommt

              Geschmackssache. Ich finde '/*@cc_on !*/false' weitaus seltsamer und fehlerträchtiger.

              • Wird schneller unübersichtlich, da die Logik im Kommentar sitzt

              Dazu ist conditional compilation ja da. Bei deiner Variante sitzt die Logik in der Kombination aus Kommentar und nicht Auskommentiertem. Für mich iast _das_ unübersichtlich.

              • Alles, was ich gerade vergessen habe ;)

              Jaja, wie Otto zu sagen pflegte: Ich könnte 100 Gründe nennen, wenn ich nur welche wüsste.

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
              1. @@Gunnar Bittersmann:

                nuqneH

                Jaja, wie Otto zu sagen pflegte: Ich könnte 100 Gründe nennen, wenn ich nur welche wüsste.

                Oops, eine Größenordnung daneben. 1000.

                Qapla'

                --
                Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
                (Mark Twain)
            3. @@Kai345:

              nuqneH

              Zumal coco meiner Meinung nach maximal null bis ein Mal in einem Javascript auftreten sollte, schon allein die Existenz schlechter JS-minifizierer ist ein Grund dagegen.

              Ja, das könnte ein Problem sein.

              Allerdings zwingt die Existenz schlechter JS-Minifizierer ja nicht zu deren Verwendung. Vernünftige JS-Minifizierer kommen mit conditional compilation klar.

              Qapla'

              --
              Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
              (Mark Twain)
              1. [latex]Mae  govannen![/latex]

                Zumal coco meiner Meinung nach maximal null bis ein Mal in einem Javascript auftreten sollte, schon allein die Existenz schlechter JS-minifizierer ist ein Grund dagegen.

                Ja, das könnte ein Problem sein.

                Allerdings zwingt die Existenz schlechter JS-Minifizierer ja nicht zu deren Verwendung. Vernünftige JS-Minifizierer kommen mit conditional compilation klar.

                Klar. Aber jemand ohne dieses spezielle Wissen, der ein Programm mit coco erstellt hat und den erstbesten Minifizierer benutzt, fällt dann erst mal übel auf die Nase. Und ob er in der Lage ist, die plötzlich auftretenden Fehler auf einen schlechten Minifizierer zurückzuführen, ist fraglich. Meist wird dann der Fehler in der nicht minifizierten Arbeitsversion gesucht, wo er natürlich nicht auftreten wird.
                Ist halt ein Fallstrick, den ich nicht unerwähnt lassen wollte.

                Cü,

                Kai

                --
                Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
                Foren-Stylesheet Site Selfzeug JS-Lookup
                SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
    2. @@Kai345:

      nuqneH

      if(navigator.appName == "Microsoft Internet Explorer")

      Niemals nach Browsern selektieren, immer nach den Methoden/Eigenschaften, die der Browser kennt. -> Fallunterscheidungen in JavaScript

      Hm, sicher? Warum?

      Wenn man doch wirklich IE selektiern möchte (warum eigentlich?), dann allerdings aber nicht per navigator.appName, sondern per conditional compilation.

      <button onclick=Process>Los!</button>

      Du meintest '<button onclick="[code lang=javascript]Process();">Los!</button>[/code]'.

      Nicht verwechseln mit 'myButton.onclick = Process;'!

      15:30.

      Qapla'

      --
      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
      (Mark Twain)
      1. [latex]Mae  govannen![/latex]

        if(navigator.appName == "Microsoft Internet Explorer")

        Niemals nach Browsern selektieren, immer nach den Methoden/Eigenschaften, die der Browser kennt. -> Fallunterscheidungen in JavaScript

        Hm, sicher? Warum?

        Wenn man doch wirklich IE selektiern möchte (warum eigentlich?), dann allerdings aber nicht per navigator.appName, sondern per conditional compilation.

        Tja, ich bin einfach vom verbreitetsten Anwendungsfall "verschiedene Methoden/Eigenschaften innerhalb der jeweiligen Funktionen, um das gleiche Ziel zu erreichen"  ausgegangen.

        Da die Funktionen ProcessA und ProcessB bezüglich der bisherigen Beschreibung unbekannt sind, kann ich natürlich nicht hundertprozentig ausschließen, daß man auch mit coco ans Ziel kommt. Aber notwendig ist es eigentlich eher selten.

        <button onclick=Process>Los!</button>

        Du meintest '<button onclick="[code lang=javascript]Process();">Los!</button>[/code]'.

        Nicht verwechseln mit 'myButton.onclick = Process;'!

        Seufz. Ich wußte, daß es sich rächen wird, daß ich niemals mit onxxx-Attributen arbeite.

        15:30.

        Kein McEnroe heute? Vielleicht diesmal der Erfinder der kubischen Raunschiffe? ;)

        Cü,

        Kai

        --
        Dank Hixies Idiotenbande geschieht grade eben wieder ein Umdenken in Richtung "Mess up the Web". (suit)
        Foren-Stylesheet Site Selfzeug JS-Lookup
        SelfCode: sh:( fo:| ch:? rl:( br:< n4:( ie:{ mo:| va:) js:| de:> zu:) fl:( ss:| ls:?
      2. Hallo,

        if(navigator.appName == "Microsoft Internet Explorer")

        Niemals nach Browsern selektieren, immer nach den Methoden/Eigenschaften, die der Browser kennt. »»

        Hm, sicher? Warum?

        Das ist schon lange bekannt, eine uralte Geschichte.

        Gruß, Don P

        1. @@Don P:

          nuqneH

          Das ist schon lange bekannt, eine uralte Geschichte.

          Ja, immer wieder gern gelesen.

          Aber dennoch: Wenn es darum geht, den IE sicher zu erkennen, ist es nicht ratsam, irgendwelche proprietären Methoden/Eigenschaften abzufragen, die andere Browser eventuell auch kennen könnten. Mit conditional compilation ist man auf der sicheren Seite.

          Die Frage, ob hier tatsächtlich IE erkannt werden soll, blieb unbeantwortet.

          Also @NeoN: Was willst du mit der Browserweiche eigentlich bezwecken? Warum soll IE eine andere Funktion ausführen?

          Qapla'

          --
          Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
          (Mark Twain)
  2. Hallo,

    Scheint sehr einfach zu sein

    wahrscheinlich - aber du verrätst uns nicht, was du eigentlich willst.

    var browser = "";

    Okay, browser ist nun ein String der Länge 0.

    browser = "ProcessA()"

    browser bleibt ein String.

    browser = "ProcessB()";

    Hier auch.

    <button onclick=browser>Los!</button>

    Hier fehlen Anführungszeichen (ja, wenn man nicht XHTML verwendet, darf man sie weglassen, empfehlenswert ist das aber nicht).
    Abgesehen davon weist du hier dem onclick-Eventhandler den String "browser" zu. Das ergibt keinen Sinn. Was meinst du wirklich?

    onlick=browser geht nicht
    onclick="browser" geht auch nicht

    Beides ist äquivalent (außer in XHTML, da sind die Anführungszeichen Pflicht).

    So long,
     Martin

    --
    Husten kann böse Folgen haben.
    Besonders im Kleiderschrank.
    1. Grüße,
      glcih vorweg - klammer gehören da auch nciht hin.
      nur für den fall dass du bei dem fehelr shcon angekommen bist
      MFG
      bleicher

      --
      __________________________-

      FirefoxMyth
    2. Ich könnte mir schwer vorstellen, dass du nicht weißt, was ich meine. Aber ok, ich fasse es kurz zusammen:

      Wenn der User das HTML File mit IE startet, soll durch klick auf den Button die Funktion "ProcessA() ausgeführt werden.Startet der User das HTM File mit einem anderen Browser, soll die Funktion ProcessB() ausgeführt werden. Das ist so ziemlich alles. Der onclick-Eventhandler steht damit erst zur Laufezit fest. Dafür haben andere Sprachen Funktionszeiger oder Delegates. Was hat Java Script da zu bieten???

      Das mit var browser = ""; war so eine Idee von mir. Das kann weg.

      1. Der onclick-Eventhandler steht damit erst zur Laufezit fest. Dafür haben andere Sprachen Funktionszeiger oder Delegates. Was hat Java Script da zu bieten???

        Funktionszeiger.

        var fkt_zeiger = alert;  
        fkt_zeiger('Hallo');  
        
        

        Struppi.