onclick=variable
NeoN
- javascript
0 Kai3450 NeoN0 Gunnar Bittersmann
0 Der Martin
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???
[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
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.
[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
[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:?
@@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'
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.
- Der Fehler war: statt browser=ProcessA; hatte ich browser = ProcessA(); stehen gehabt.
Also die funktion aufgerufen anstatt die Referenz zu übergeben.
- 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.
[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:?
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 ... ;-)
@@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'
@@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'
@@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'
[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
@@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'
[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
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
@@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'
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
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
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.
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.