if( x = return_false() ){passiert!} kann mir das einer erklären
TobiasBuschi
- javascript
hallo allerseits
ich bin daran, ein Context-Menue zu erstellen und stosse jetzt auf das Problem dass, obwohl die Bedingung nicht zutrifft der Code im "if" ausgeführt wird.
Mozilla oder Konqueror habe ich es bis jetzt ausprobiert, beide haben das selbe Problem.
Im "if" lasse ich mir mit einem alert() den Wert anzeigen, der gleizeitig das Kriterium für das "if" ist. (Zeile 238)
seht selbst auf:
test.relationpage.ch
Um den Effekt sehen zu können, muss man auf einem "div" die Ctrl-Taste gedrückt halten und die linke Maustaste drücken, oder im Mozilla einfach die rechte Maustaste drücken.
hi,
Um den Effekt sehen zu können, muss man auf einem "div" die Ctrl-Taste gedrückt halten und die linke Maustaste drücken, oder im Mozilla einfach die rechte Maustaste drücken.
Das mag vielleicht mit Linux funktionieren, da bin ich im Moment nicht. In Firefox unter Windows passiert gar nichts. In Opera auch nicht. Der IE zeigt wenigstens ein "alert"-Fensterchen an, egal, ob man nun "strg" gedrückt hält oder nicht.
Du hast eine Menge Code in die Seite gepackt. Vielleicht solltest du kurz angeben, was du damit erreichen möchtest und warum das Javascript sein muß.
Grüße aus Berlin
Christoph S.
Das mag vielleicht mit Linux funktionieren, da bin ich im Moment nicht. In Firefox unter Windows passiert gar nichts. In Opera auch nicht. Der IE zeigt wenigstens ein "alert"-Fensterchen an, egal, ob man nun "strg" gedrückt hält oder nicht.
javascript aktiviert??
Firefox 1.0
Windows XP
Eigentlich sollte ein Context-Menue aufgebaut werden bis eine Fehlermeldung kommt. Bei mir gehts.
Du hast eine Menge Code in die Seite gepackt. Vielleicht solltest du kurz angeben, was du damit erreichen möchtest und warum das Javascript sein muß.
Ich erstelle mit diesem Code ein Context-Menue, das beliebig viele Untermenues haben kann.
Mit mouseover kann man bei beliebigen Containern Menue-Punkte hinzufügen.
Wird die Maustaste gedrückt, wird das HTML fürs Menue geboren, positioniert und jenachdem sichtbar gemacht.
Der Fehler passiert beim generieren vom diesem HTML: Ein Menue wird generiert indem die Menuepunkte durchlaufen werden, hat ein Menuepunkte Untermenues, wird dieses mit der selben Funktion generiert, hat diese Untermenue Einträge wird dem ursprünglichen Menuepunkt dieses Untermenue-Objekt zurückgegeben, damit der Menuepunkt weiss wer sein Kind-Menue ist. Und dort passiert der Fehler.
Du siehs, das Ganze ist ziehmlich komplex und nicht auf die Schnelle zu verstehen.
Hi,
Eigentlich sollte ein Context-Menue aufgebaut werden bis eine Fehlermeldung kommt. Bei mir gehts.
tja, ich bekomme ein Alert mit "false" und anschließend - wie gewünscht - mein eigenes Kontext-Menü über Deinem...;-)
freundliche Grüße
Ingo
tja, ich bekomme ein Alert mit "false" und anschließend - wie gewünscht - mein eigenes Kontext-Menü über Deinem...;-)
Aber mein eigenes siehst du?
Hi,
Aber mein eigenes siehst du?
nicht wirklich, da mein Kontextmenü ja drüber plaziert wird, aber etwas schaut's noch vor.
freundliche Grüße
Ingo
nicht wirklich, da mein Kontextmenü ja drüber plaziert wird, aber etwas schaut's noch vor.
Ach so, das sind die Auswirkungen von meinem beschriebenen Problem, sonst würdest du dein Context-Menue nicht mehr sehen.
Ich bin eigentlich auch kein Fan von solchen einschränkenden Javascript-Lösungen, nur ist das wirklich unheimlich nützlich, und gehört nur zur Administration von meinem CMS.
mfg Tobias
Hi,
Ach so, das sind die Auswirkungen von meinem beschriebenen Problem, sonst würdest du dein Context-Menue nicht mehr sehen.
Das glaube ich nicht. Wenn mein Kontextmenü nicht mehr angezeigt würde, wäre es ein Bug im Firefox, den Du gefunden und ausgenutzt hättest.
Ich bin eigentlich auch kein Fan von solchen einschränkenden Javascript-Lösungen, nur ist das wirklich unheimlich nützlich, und gehört nur zur Administration von meinem CMS.
Dann müßtest Du Nutzer mit Firefox nur darauf hinweeisen, daß Sie die Deaktivierung ihres Kontextmenüs zulassen müssen.
freundliche Grüße
Ingo
Das glaube ich nicht. Wenn mein Kontextmenü nicht mehr angezeigt würde, wäre es ein Bug im Firefox, den Du gefunden und ausgenutzt hättest.
Das ist "offiziell"
document.oncontextmenu=false;
somit erscheint kein Context-Menue auch das Firefox eigene nicht.
hi,
Das ist "offiziell"
document.oncontextmenu=false;
somit erscheint kein Context-Menue auch das Firefox eigene nicht.
du weißt, dass man im firefox sowas als user gezielt unterbinden kann?
gruß,
wahsaga
document.oncontextmenu=false;
somit erscheint kein Context-Menue auch das Firefox eigene nicht.
du weißt, dass man im firefox sowas als user gezielt unterbinden kann?
JETZT weiß er es.
Vielleicht.
Aber er wehrt sich noch ein wenig, diese Wahrheit zu akzeptieren... ;)
*scnr*
Martin
hi,
JETZT weiß er es.
Vielleicht.
Aber er wehrt sich noch ein wenig, diese Wahrheit zu akzeptieren... ;)
keiner von uns konnte sich doch von anfang an mit der matrix abfinden.
gruß,
wahsaga
JETZT weiß er es.
Vielleicht.
Aber er wehrt sich noch ein wenig, diese Wahrheit zu akzeptieren... ;)
Das stimmt nicht! :)
Nein, ich finde es sogar gut, man hat ja immernoch die möglichkeit Ctrl+linke Maustaste zu drücken, dann erscheint das firefox eigene sowieso nicht.
manchmal habe ich den Drang aus der Matrix auszubrechen, aber ihr wisst ja wie die Wirklichkeit ist :o)
Hallo,
manchmal habe ich den Drang aus der Matrix auszubrechen, aber ihr wisst ja wie die Wirklichkeit ist :o)
Hast Du nun Dein "Problem" schon gelöst?
Verschiebe doch einfach die Wertzuweisung vor das if und prüfe dann im if die Variable:
...
td2.rp_child = entry.eval( (cm_x + rp_contextMenueData["divWidth"]-7), (cm_y+counter*20+14) );
if( td2.rp_child ){
alert(td2.rp_child)
...
Dann passiert was anderes obwohl es ja eigentlich das gleiche ist ;-)). Ob es das ist, was Du willst? Jedenfalls wird td2.rp_child nie was Anderes als false.
Mein Erklärungsversuch für die eigentlich nicht zu erklärende Reaktion (x=false; if(x)...; vs. if (x=false)...;) :
Du überbeanspruchst den Kinderkram JavaScript, indem Du eine Methode (eval()) eines selbst erzeugten Objektes (entry) rekursiv (in sich selbst) aufrufst. Drei Dinge auf einmal ... ;-)).
Schreibe einen eigenen Client für Dein CMS, wenn es wirklich so nutzerfreundlich sein soll. Browser sind zum Browsen gedacht. Siehe hierzu auch die Diskussion über eigene Kontextmenüs im Browser.
viele Grüße
Axel
Dann passiert was anderes obwohl es ja eigentlich das gleiche ist ;-)). Ob es das ist, was Du willst? Jedenfalls wird td2.rp_child nie was Anderes als false.
Mein Erklärungsversuch für die eigentlich nicht zu erklärende Reaktion (x=false; if(x)...; vs. if (x=false)...;) :
Du überbeanspruchst den Kinderkram JavaScript, indem Du eine Methode (eval()) eines selbst erzeugten Objektes (entry) rekursiv (in sich selbst) aufrufst. Drei Dinge auf einmal ... ;-)).
Habe ich auch gesehen, das ist doch ein programmiertechnischer Skandal :-)
Schreibe einen eigenen Client für Dein CMS, wenn es wirklich so nutzerfreundlich sein soll. Browser sind zum Browsen gedacht. Siehe hierzu auch die Diskussion über eigene Kontextmenüs im Browser.
Eigentlich läuft mein Context-Menue (ausser im IE natürlich) relativ gut, ich wollte es umbauen um schneller zu werden.
Momentan probieren ich eine Classe die vom DIV-Element abgeleitet ist zu erstellen, sowas wie:
function myDiv(){
neueMethode = function(){
machwas;
}
}
myDiv.prototype = document.createElement("DIV");
nur ist dann bei jeder Instant von myDiv das eigentliche DIV das immer das selbe. Weisst du ob sowas geht?
Falls es jemenden interessiert, so wie ich es hier gemacht habe funktioniert das Context-Menue:
file:/relationpageCMS/tests/index.htm
mfg Tobias Buschor
So ists richtig :)
hallo,
So ists richtig :)
Nö. Die Adresse wäre mit http://test.relationpage.ch/tmp/ korrekt angegeben ;-)
mozilla macht es jetzt so, wie du es offenbar gewünscht hast, aber Opera nicht. Man nimmt ja für Kontextmenü die rechte Maustaste. Bei Opera erscheint dein Kontextmenü aber bei gedrückter "Strg"-Taste bereits mit der linken Maustaste, während die rechte das normale Kontextmenü aufruft.
Grüße aus Berlin
Christoph S.
Bei Opera erscheint dein Kontextmenü aber bei gedrückter "Strg"-Taste bereits mit der linken Maustaste, während die rechte das normale Kontextmenü aufruft.
Opera unterstützt dies ganz einfach nicht.
mfg
Tobias Buschor
Hi,
Falls es jemenden interessiert, so wie ich es hier gemacht habe funktioniert das Context-Menue:
file:/relationpageCMS/tests/index.htm
nö. Unter http://test.relationpage.ch/tmp/ lukt im Firefox gerade mal
Z
A
Q
1
2
3
4
5
6
7
hinter meinem eigenen Kontextmenü hervor. Nutzbar ist das nicht unbedingt...
Warum nimmst Du nicht einfach einen Linksklick dazu?
freundliche Grüße
Ingo
Hallo,
Momentan probieren ich eine Classe die vom DIV-Element abgeleitet ist zu erstellen, sowas wie:
function myDiv(){
neueMethode = function(){
machwas;
}
}
myDiv.prototype = document.createElement("DIV");
Das ist, glaube ich, der falsche Ansatz. Du willst das HTMLDivElement http://www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/html.html#ID-22445964 erweitern.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>HTMLDivElement erweitern</title>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript">
<!--
function appendH1(text) {
var h1 = document.createElement("H1");
h1.appendChild(document.createTextNode(text));
this.appendChild(h1);
}
document.createElement("DIV").constructor.prototype.appendH1 = appendH1;
//Wahlweise sollte im Moz. auch das funktionieren:
//document.createElement("DIV").__proto__.appendH1 = appendH1;
//HTMLDivElement.prototype.appendH1 = appendH1;
//http://www.mozilla.org/docs/dom/mozilla/protodoc.html
//-->
</script>
</head>
<body>
<script type="text/javascript">
<!--
var body = document.getElementsByTagName("BODY")[0]
var d1 = document.createElement("DIV");
var d2 = document.createElement("DIV");
body.appendChild(d1);
body.appendChild(d2);
d1.appendH1("Test d1");
d2.appendH1("Test d2");
//-->
</script>
</body>
</html>
viele Grüße
Axel
Herzlichen Dank,
Sehr lehrreich deine Unterstützung.
mfg
Tobias Buschor
Hi,
ich weiß nicht ob das der Fehler ist, aber dürfte ich dich darauf aufmerksam machen, dass Zeilen wie
if (td2.rp_child = entry.eval( (cm_x + rp_contextMenueData["divWidth"]-7), (cm_y+counter*20+14) ))
mit einer Wahrscheinlichkeit von extrem nahe an 1 true ergeben!? Du hast da eine Zuweisung, wenn mich meine Kenntnisse nicht täuschen dürfte die eigentlich immer true ergeben außer die Zuweisung schlägt aus irgend einem Grund fehl (weiß nicht genau, was bei NULL-Werten ist). Solltest du aber einen Vergleich meinen hätte da ein == hingehört. Eigentlich denke ich aber mal, dass du dir der Tatsache bewusst bist, an anderen Stellen stimmts ja...
MfG
Rouven
mit einer Wahrscheinlichkeit von extrem nahe an 1 true ergeben!? Du hast da eine Zuweisung, wenn mich meine Kenntnisse nicht täuschen dürfte die eigentlich immer true ergeben außer die Zuweisung schlägt aus irgend einem Grund fehl (weiß nicht genau, was bei NULL-Werten ist). Solltest du aber einen Vergleich meinen hätte da ein == hingehört. Eigentlich denke ich aber mal, dass du dir der Tatsache bewusst bist, an anderen Stellen stimmts ja...
Ich mache absichtlich eine Zuweisung. Die Bedingung darf trotzdem nicht zutreffen, da der ausgewertete Wert nicht true ergibt.
Hallo,
ich weiß nicht, ob dir die Syntax und Semantik einer Zuweisung vollständig klar ist...
Du hast da eine Zuweisung, wenn mich meine Kenntnisse nicht täuschen dürfte die eigentlich immer true ergeben außer die Zuweisung schlägt aus irgend einem Grund fehl
Nein, das ist falsch.
Die Zuweisung ergibt, wenn man sie als Ausdruck irgendwo einsetzt, immer den Wert, der auch zugewiesen wird. Ist außerdem ein Klassiker unter den Fehlern in C-Code:
if (a=4)
{ ...
}
Wahrscheinlich hat der Programmierer hier einen Vergleich gemeint, tatsächlich aber eine Zuweisung formuliert. Der Wert der Zuweisungsoperation ist immer 4, ergo nicht Null, also trifft die Bedingung zu.
Ähnlich, nur komplizierter, ist das im Beispiel von Tobias. Der Wert des Ausdrucks ist hier der Wert des eval()-Terms. Und der kann - je nach sonstigen Umgebungsbedingungen - durchaus auch mal Null sein.
So long,
Martin