c0de: Bild Flackert bei onmouseover und onmouseout

Hallo.

Ich hab ein kleines Problem, und zwar möchte ich bei onmouseover (über ein div) rechts oben in dem Div etwas anzeigen. bei onmouseout wieder löschen.

Das geht auch so weit, allerdings flackert das bild das ich reinlade wenn ich drüber fahr! bzw es anklicke! so einfach unbrauchbar...

Ich schätze mal es liegt daran das ich das div eigentlich wieder verlasse, zwar in ein untergeordnetes span element aber doch... aber irgentwie is es komisch...

Um es zu verdeutlichen hier das Beispiel:
http://c0de.at/problem/

Der Code ist wie folgt:

<script type="text/javascript">  
  function post_func(id){  
    $("#post_func-"+id).html("<a onclick='tw_delete(\""+ id +"\")' href='#'><img src='delete2.png' height='35'></a>");  
  }  
  function clear_post_func(id){  
    $("#post_func-"+id).html(" ");  
  }  
</script>
 <div class='twitter_box' onmouseover='post_func("1")' onmouseout='clear_post_func("1"); return false;'>  
<span id='post_func-1' style='float:right;'></span>  
</div>

(getestet FF 3.6 & Opera 10.10 & Chrome 4)

Hoffe ihr wisst eine Lösung...
L.g. c0de

  1. Hi,

    Ich schätze mal es liegt daran das ich das div eigentlich wieder verlasse, zwar in ein untergeordnetes span element aber doch...

    Genau - weil mouseout auf dem DIV auch in diesem Fall feuert.

    Hoffe ihr wisst eine Lösung...

    Frage ab, ob das Element, auf das die Maus beim mousout bewegt wird, inner- oder ausserhalb des DIVs liegt.
    http://www.quirksmode.org/js/events_mouse.html

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hey ChrisB

      Frage ab, ob das Element, auf das die Maus beim mousout bewegt wird, inner- oder ausserhalb des DIVs liegt.
      http://www.quirksmode.org/js/events_mouse.html

      Sehr geil! Danke!

      Für die die von google kommen, jQuery bietet da auch ein eigenes Event:
      http://api.jquery.com/event.relatedTarget/

      l.g.

      1. Hey nochmal

        Frage ab, ob das Element, auf das die Maus beim mousout bewegt wird, inner- oder ausserhalb des DIVs liegt.
        http://www.quirksmode.org/js/events_mouse.html

        Es kann sein das es einfach zu spät ist und ich schlafen sollte, aber irgentwie geht das nicht... Sämtliche versuche ergeben bestenfalls ein undefined. Das jQuery event macht gleich überhaupt gar nichts...

        Kannst du mir das vieleicht an meinem Source verdeutlichen?
        Bzw. generell verdeutlichen? (Muss ja nicht jQuery sein)

        Wäre dir echt dankbar!

        L.g.

        1. Hallo c0de,

          ich habe mit der Idee von molily gute Erfahrung gemacht:

          http://molily.de/temp/menu.html

          Mein Mouseout sieht so aus:

          if (window.Node && Node.prototype && !Node.prototype.contains)  
            Node.prototype.contains = function (arg) { return !!(this.compareDocumentPosition(arg) & 16); };  
            
          xxx.onmouseout = function(e) {  
            e = e || window.event;  
            var toElement = e.relatedTarget || e.toElement || false;  
            if (!xxx.contains(toElement)) tu_was();  
            return false;  
          }
          

          Ich setze es bei meinen Schiebereglern ein:

          http://www.j-berkemeier.de/Fouriersynthese.html

          Gruß, Jürgen

          1. Hallo,

            Ich setze es bei meinen Schiebereglern ein:

            http://www.j-berkemeier.de/Fouriersynthese.html

            In FF 3.5.7 unter Win XP:

            Die Schieberegler der Phasen fahren nach unten, wenn man einen Wert manuell eingibt (ins zugehörige Textfeld). Absicht?

            Gruß, Don P

            1. Hallo Don,

              Die Schieberegler der Phasen fahren nach unten, wenn man einen Wert manuell eingibt (ins zugehörige Textfeld). Absicht?

              ja. Die Position der Schieberegler soll zur Zahl im Feld passen und umgekehrt.

              Gruß, Jürgen

              1. Hallo Jürgen,

                Die Schieberegler der Phasen fahren nach unten, wenn man einen Wert manuell eingibt (ins zugehörige Textfeld). Absicht?

                ja. Die Position der Schieberegler soll zur Zahl im Feld passen und umgekehrt.

                Aber für die Phasen funktioniert es nicht: Egal welchen Wert man im Textfeld eingibt, der Regler fährt immer ganz nach unten, passt anscheinend nicht zur Zahl. Vielleicht hast du das übersehen oder ich hab' falsche Werte eingegeben?

                Gruß, Don P

                1. Hallo Don,

                  Aber für die Phasen funktioniert es nicht: Egal welchen Wert man im Textfeld eingibt, der Regler fährt immer ganz nach unten, passt anscheinend nicht zur Zahl. Vielleicht hast du das übersehen oder ich hab' falsche Werte eingegeben?

                  die Amplituden sind auf 0 bis 1 begrenzt, die Phasen auf 0 bis 360. Bei Werten außerhalb dieses Intervalls wird der Schieber nach ganz oben oder ganz unten gestellt und der Grenzwert angezeigt. Welche Werte hast du denn eingegeben und welchen Browser benutzt du?

                  Gruß, Jürgen

                  1. Hallo Jürgen,

                    die Amplituden sind auf 0 bis 1 begrenzt, die Phasen auf 0 bis 360. Bei Werten außerhalb dieses Intervalls wird der Schieber nach ganz oben oder ganz unten gestellt und der Grenzwert angezeigt. Welche Werte hast du denn eingegeben und welchen Browser benutzt du?

                    Achso.. Ich habe die Werte der Gauß- Vrteilung von den Amplituden übernommen, also alle zwischen 0 und 1. Hätte sie wohl erst umrechnen sollen auf 0...360, ist eigentlich logisch. Ich benutze den neuesten Firefox.

                    Gruß, Don P

          2. Lieber JürgenB,

            ich habe mit der Idee von molily[...]
            [code lang=javascript]if (window.Node && Node.prototype && !Node.prototype.contains)
              Node.prototype.contains = function (arg) { return !!(this.compareDocumentPosition(arg) & 16); };

            sehr clever. Matthias ist halt ein ganz ausgefuchster JS-Experte. Schön! Habe das gleich eingebaut.

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. Hallo Felix,

              sehr clever. Matthias ist halt ein ganz ausgefuchster JS-Experte.

              meine erste Anlaufstelle, wenn ich mal nicht mehr weiter weiß.

              Gruß, Jürgen

        2. Liebe(r) c0de,

          ich habe selbst gerade eine Klapp-Navi gebastelt, in der ich auch dieses Problem lösen musste. Dabei habe ich letzten Endes einen "globalen" mousemove-Event benutzt (document.onmousemove), der selbsttätig feststellt, über welchem Element er hovert.

          Dabei prüfe ich, ob das Zielelement (e.target || e.srcElement) innerhalb eines von mir definierten Vorfahrenelements stattfindet, indem ich das DOM von meinem Zielelement aus nach oben abklappere. Das kannst Du sicherlich auch.

          Wenn Du nun über Deinem Bild hoverst, dann würde das Abklappern des DOM ja letzten Endes zu demselben Ergebnis führen (falls Dein Bild oder span ein Nachfahrenelement Deines div ist), sodass eben kein Ausblenden stattfindet.

          Ich habe immer wieder die Erfahrung gemacht, dass man sich leichter tut, wenn man einen globalen Eventlistener definiert (also document.onmouse_irgendwas), als wenn man an viele Elemente einzelne Eventlistener ansetzt, die sich dann gegenseitig bekriegen.

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
          1. Hallo Felix,

            Dabei prüfe ich, ob das Zielelement (e.target || e.srcElement) innerhalb eines von mir definierten Vorfahrenelements stattfindet, indem ich das DOM von meinem Zielelement aus nach oben abklappere. Das kannst Du sicherlich auch.

            dafür gibt es "contains".

            Gruß, Jürgen

            1. Lieber JürgenB,

              [...]indem ich das DOM von meinem Zielelement aus nach oben abklappere[...]

              dafür gibt es "contains".

              <http://de.selfhtml.org/javascript/objekte/all.htm#contains@title=in SELFHTML steht>, dass nicht alle Browser diese Methode unterstützen. Und ein javascript:alert(document.body.contains) in der Adresszeile meines Firefox (Version 3.6) führt auch zu einem "undefined"! Im IE(8) kommt dagegen ein Funktionsobjekt zurück...

              Ergo: Dafür gibt es manchmal "contains" - aber eben nicht immer, sondern nur in ausgewählten Browsern!

              Liebe Grüße,

              Felix Riesterer.

              --
              ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
              1. Hi,

                Ergo: Dafür gibt es manchmal "contains" - aber eben nicht immer, sondern nur in ausgewählten Browsern!

                Ja - aber dann wäre es von der Performance her günstiger, die native contains-Methode zu nutzen, wenn sie vorhanden ist.

                Und für die Browser, in denen sie es nicht ist (AFAIR kennen sie mindestens IE, Opera, Safari; Chrome weiss ich gerade nicht) kann man sie dann per Prototyping für HTMLElementObject nachrüsten. Im Netz finden sich dazu teilweise rekursive Lösungen - dann denen würde ich aber abraten, auch wenn es vielleicht erst mal „schicker“ erscheinen mag. Es iterativ über eine While-Schleife zu machen, vermeidet den Overhead, der bei Rekursion entsteht.

                MfG ChrisB

                --
                “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
                1. Hallo ChrisB,

                  Ja - aber dann wäre es von der Performance her günstiger, die native contains-Methode zu nutzen, wenn sie vorhanden ist.

                  Und für die Browser, in denen sie es nicht ist (AFAIR kennen sie mindestens IE, Opera, Safari; Chrome weiss ich gerade nicht) kann man sie dann per Prototyping für HTMLElementObject nachrüsten. Im Netz finden sich dazu teilweise rekursive Lösungen - dann denen würde ich aber abraten, auch wenn es vielleicht erst mal „schicker“ erscheinen mag. Es iterativ über eine While-Schleife zu machen, vermeidet den Overhead, der bei Rekursion entsteht.

                  du hast https://forum.selfhtml.org/?t=195270&m=1306879 gelesen?

                  Gruß, Jürgen

                  1. Um das noch abzuschliessen...

                    (Sorry hab einen anderen User zum folgepost verwendet... wollt ich eigentlich nicht so geht ja der kontext verloren... nja egal)

                    Ich musste mich jetzt nicht mit so kranken Sachen herumschlagen, auch wenn "JQuery Hover" wie mir geraten wurde auch nicht funktioniert, allerdings funktioniert das hier:

                    $("._box").live('mouseenter', function(){  
                    	$(this).find('p').html('<img src="img/icons/delete2.png">');  
                    });  
                    $("._box").live('mouseleave', function(){  
                    	$(this).find('p').html('mouseout');  
                    });  
                    
                    

                    Das zauberwort ist dabei "mouseleave" das offenbar auch die unterelemente einschliest! Danke für dieses Framework! xD

                    l.g.

              2. Hallo Felix,

                für Browser, die "contains" nicht unterstützen, gibt es ja die Methode von molilys Seite. Ich habe das mit IE7, IE8, FF, Opera, Safari (alle unter WinXP) und Konqueror (Linux) getestet.

                Gruß, Jürgen

        3. Hallo c0de,

          Sämtliche versuche ergeben bestenfalls ein undefined. Das jQuery event macht gleich überhaupt gar nichts...

          Warum arbeitest du nicht einfach mit der hover()-Funktion von jQuery?

          Gruß Gernot

          1. Warum arbeitest du nicht einfach mit der hover()-Funktion von jQuery?

            Ich wollt grad wieder Heulen kommen, das ich wieder nicht mehr als Undefined bekomme, aber das! Das scheint mir die Lösung!
            Danke!!!!