Avatar billede andersbl Nybegynder
02. august 2010 - 11:22 Der er 12 kommentarer og
1 løsning

OnMouseOut virker ikke i autosuggest

Hej Eksperter
Jeg har lavet et javescript, hvor man indtaster noget i et input felt som vha. ajax viser forslag under. De forslag er lavet som link, som når man trykker kommer forlsaget op i inputfeltet. Mit problem er jeg gerne vil have at popboksen med forslag skal forsvinder 3 sek. efter musen ikke er over input eller forslagene.

Hvordan får jeg javascript til at "hide" min popup box når musen ikke er over?

Jeg håbede på det kunne løses ved at sætte en OnMouseOut i <div>, men virker ikke.

<script type="text/javascript">
function showHint(str)
{
if (str.length==0)
  {
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("theResults").innerHTML=xmlhttp.responseText;
    document.getElementById("theResults").style.left = getLeft() + "px";
    document.getElementById("theResults").style.top = (getTop()+document.getElementById("AccountName").offsetHeight) + "px";
    document.getElementById("theResults").style.width = document.getElementById("AccountName").offsetWidth;
    document.getElementById("theResults").style.visibility = "visible";
    }
  }
xmlhttp.open("GET","gethint.jsp?q="+str,true);
xmlhttp.send();
}
function value(value) {
    document.getElementById("AccountName").value = value;
    hideSuggestions();
}
function getLeft() /*:int*/ {
    var oNode = document.getElementById("AccountName");
    var iLeft = 0;

    while(oNode.tagName != "BODY") {
        iLeft += oNode.offsetLeft;
        oNode = oNode.offsetParent;       
    }
   
    return iLeft;
};
function getTop() /*:int*/ {
    var oNode = document.getElementById("AccountName");
    var iTop = 0;
   
    while(oNode.tagName != "BODY") {
        iTop += oNode.offsetTop;
        oNode = oNode.offsetParent;
    }
   
    return iTop;
};
function hideSuggestions() {
    document.getElementById("theResults").style.visibility = "hidden";
};
function hide() {
    setTimeout("hideSuggestions();", 200);
}
function show() {
    document.getElementById("theResults").style.visibility = "visible";
}
</script>


<div id="theResults" style="position:absolute;border:1px black solid;padding:2px;visibility: hidden;background: white"></div>
Avatar billede Slettet bruger
02. august 2010 - 13:42 #1
Hvorfor virker onmouseout ikke - det plejer det da : )
Avatar billede andersbl Nybegynder
02. august 2010 - 16:36 #2
Når musen kommer over et link forsvinder boksen med det samme, selv om du ikke trykker eller noget. Hvis musen ikke er over boksen sker der heller ikke noget.

Jeg har skrevet sådan

<div id="theResults" onMouseOut="hide()" style="position:absolute;border:1px black solid;padding:2px;visibility: hidden;background: white"></div>
Avatar billede Slettet bruger
02. august 2010 - 18:54 #3
Ahh, ja - Dét er irriterende.
- I DOM's sære verden forlader du faktisk den bagvedliggende div når du bevæger dig ind over linket - selvom du stadig ER inden i den..

Jeg plejer at løse dét problem, ved at mouseout'en på bag-diven, fjernes "forsinket" - og denne forsinkede fjerning aflyses ved onmouseover på elementer inden i (altså dine links).

Forsinkelse (på bag-div'en):
onmouseout="startFjernelse()"

fjernDivTimer = null
function startFjernelse()
    {
    fjernDivTimer = settimeout("hide()",1000)
    }

function hide()
    {
    document.getElementById("theResults").style.display = "none"
    fjernDivTimer = null
    }

Og på link'ene onmouseover="cleartimeout(fjernDivTimer);fjernDivTimer=null"
Avatar billede majbom Novice
02. august 2010 - 22:09 #4
kan det ikke løses med en cancelBubble på a-elementet ved onmouseover? eller er det for sent dér?
Avatar billede Slettet bruger
03. august 2010 - 08:01 #5
Tror det ikke.. Det er jo (formelt) to forskellige events (over/out).
- men det VILLE sgu være rart at opdage en alternativ metode...
Avatar billede andersbl Nybegynder
03. august 2010 - 08:10 #6
Jeg tester begge metoder om en timestid
Avatar billede andersbl Nybegynder
03. august 2010 - 09:05 #7
nu har jeg aldrig brugt "cancelBubble"  før men har skrevet sådan og får en fejl i firefox, men det er vist logisk nok da den ikke supporter den funktion.

I explorer er der ingen forskel.
er min syntaks forkert?

<a href="#" onmouseover="window.event.cancelBubble=true" onclick="value('12');">
Avatar billede Slettet bruger
03. august 2010 - 09:34 #8
Jeg bruger en funktion til det:

<span onclick='cancelBubble(event)'>diller daller</span>

function cancelBubble(ev) // Lad ikke en event "her" boble op til en parent's handler
    {
    ev = ev || window.event // iE
    ev.cancelBubble=true
    if (ev.stopPropagation)
        ev.stopPropagation()
    }

Men som sagt, jeg tror ikke det nytter her, da det er to forskellige events.
Avatar billede andersbl Nybegynder
03. august 2010 - 09:40 #9
okay nu har jeg prøvet din måde T4NK3R og virker ikke helt, men vi nærmer os :)

Når jeg har musen over linkene sker der ikke noget(hvilket jo er godt :) ), men selv om musen er over diven så efter 2-6 sek. forsvinder div'et igen?

Når jeg har trykket på et link og det kommer op i input felter virker "onkeyup" funktionen ikke mere. Så man har kun et forsøg.

Sender lige koden som jeg har skrevet den.

=== INPUT FELTET ===
<td>Account:</td>
<td align="left">
<input type="text" id="name" name="name" onkeyup="showHint(this.value)" size="35" style="text-align:right" maxlength="40" style="width:240">
</td>

=== DIV POP-UP ===
<div id="theResults" onmouseout="startFjernelse()" style="position:absolute;border:1px black solid;padding:2px;visibility: hidden;background: white"></div>

=== JAVASCRIPT ===
<script type="text/javascript">
function showHint(str)
{
if (str.length==0)
  {
  return;
  }
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("theResults").innerHTML=xmlhttp.responseText;
    document.getElementById("theResults").style.left = getLeft() + "px";
    document.getElementById("theResults").style.top = (getTop()+document.getElementById("AccountName").offsetHeight) + "px";
    document.getElementById("theResults").style.width = document.getElementById("AccountName").offsetWidth;
    document.getElementById("theResults").style.visibility = "visible";
    }
  }
xmlhttp.open("GET","gethint.jsp?q="+str,true);
xmlhttp.send();
}
function value(value) {
    document.getElementById("AccountName").value = value;
    hideSuggestions();
}
function getLeft() /*:int*/ {
    var oNode = document.getElementById("AccountName");
    var iLeft = 0;

    while(oNode.tagName != "BODY") {
        iLeft += oNode.offsetLeft;
        oNode = oNode.offsetParent;       
    }
   
    return iLeft;
};
function getTop() /*:int*/ {
    var oNode = document.getElementById("AccountName");
    var iTop = 0;
   
    while(oNode.tagName != "BODY") {
        iTop += oNode.offsetTop;
        oNode = oNode.offsetParent;
    }
   
    return iTop;
};
function hideSuggestions() {
    document.getElementById("theResults").style.visibility = "hidden";
};
fjernDivTimer = null
function startFjernelse()
{
//alert(1);
    fjernDivTimer = setTimeout("hide()",1000);
}
function hide() {
//alert(2);
    document.getElementById("theResults").style.display = "none";
    fjernDivTimer = null;
}
function show() {
    document.getElementById("theResults").style.visibility = "visible";
}
</script>

=== LINKS I DIV POP-UP ===
<a href="#" onmouseover="clearTimeout(fjernDivTimer);fjernDivTimer=null;"  onclick="value('12');">tolv</a>
Avatar billede andersbl Nybegynder
03. august 2010 - 09:50 #10
Du har helt ret den har ingen effekt.. Desværre.
Avatar billede Slettet bruger
03. august 2010 - 10:00 #11
Du bruger to forskellige skjule/vise-metoder: display eller visibility - mon ikke det er det bøvler..

Engangsfunktion - har jeg ikke rigtig noget godt bud på..
- det skulle da lige være at xmlhttp er en global variabel (måske overlever noget fra kald til kald) ?

Gør dén lokal med:
  var xmlhttp=new XMLHttpRequest();
hhv.
  var xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");

Men jeg er i tvivl, om det får konsekvenser for onreadystate-callback'en...
Avatar billede andersbl Nybegynder
03. august 2010 - 10:14 #12
Skulle ikke ændre noget med xmlHTTP, nu kører det bare. Har dog tilføjet onmouseover="clearTimeout(fjernDivTimer);fjernDivTimer=null;" til mit div, da den ellers forsvandt når musen kun var over divet..

Må sige jeg har lært meget af denne problemstilling.

Send et svar og du får nogle MEGET velfortjente point. :) STORT TAK
Avatar billede Slettet bruger
03. august 2010 - 10:22 #13
Fedt. Velbekomme : )
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester