Раскрывающееся меню - onmouseout вызывается на дочернем узле, когда установлен в родительском узле - PullRequest
0 голосов
/ 13 января 2012

Попытка имитировать browse catagories по следующей ссылке https://dev.twitter.com/discussions

onmouseover - контейнер расширяется, чтобы соответствовать новым элементам внутри себя, но перемещая мышь внутри контейнера (расширенconainer) приведет к тому, что onmouseout будет вызван - даже когда мышь находится внутри самого контейнера - глупая ошибка или не изо всех сил выяснить, где и как я могу пойти не так

<html>
    <style type="text/css">
    #container{
    overflow: hidden;
    height: auto;
    width: 350px;
    background-color: rgba(0,0,0,0.65);
    }
    .contents{
    height: 30px;
    width: 350px;
    background-color: yellow;
    float: left;
    }
    </style>
    <script type="text/javascript" >
    var foo = new Array("bar","santa","claus")
    function fire(){
    var contents = document.getElementById("contents")
    if(contents.hasChildNodes())
    return
    for(i = 0 ; i < foo.length ; i++){
        var tem=document.createElement("div");
        tem.setAttribute("id",'cont'+i);
        tem.setAttribute("class","contents");
        tem.appendChild(document.createTextNode(foo[i]))
        contents.appendChild(tem)
    }
    }
    function unfire(evt){

    if ((evt.target || evt.srcElement).id != "container") 
    return;

    var contents = document.getElementById("contents");
    while(contents.hasChildNodes())
    contents.removeChild(contents.firstChild)
    }
    </script>

    <div id="container" onmouseover="fire(event)" onmouseout="unfire(event)">
        Move your mouse here
        <div id="contents" ></div>
    </div>
    </html>

1 Ответ

1 голос
/ 13 января 2012

Извините, мой первоначальный ответ был полностью неверным, я не уверен, о чем я думал. Конечно, mouseout срабатывает на родительском элементе, когда мышь перемещается к дочернему элементу. В этом случае вам необходимо проверить свойства relatedTarget или toElement объекта event и проверить, является ли этот элемент потомком контейнера.

Вы можете проверить происхождение с помощью contains() в Internet Explorer и compareDocumentPosition() в других браузерах. Например, измените onmouseout="unfire(event)" на onmouseout="unfire.call(this, event)" и добавьте следующий код в функцию unfire:

var to = evt.relatedTarget || evt.toElement;

if((this.contains && this.contains(to)) || this.compareDocumentPosition(to) & 16)
    return;
...