Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Не срабатывает обертка фун-и в IE8 (https://javascript.ru/forum/css-html-internet-explorer/29907-ne-srabatyvaet-obertka-fun-i-v-ie8.html)

zilker 16.07.2012 17:17

Не срабатывает обертка фун-и в IE8
 
День добрый. Восьмой осел никак не хочет показывать подменю.
В разметке, после кода меню, идет обработчик -
portfolio.onmouseover = handleMouseenter(ShowSubMenu);

Вот сама обертка -
function handleMouseenter(handler) {
    return function(e) {
        e = e || event; // IE
        var toElement = e.relatedTarget || e.srcElement; // IE
        var fromElement = toElement;

        // проверяем, мышь пришла с элемента внутри текущего?
        while (toElement && toElement !== this) {
            toElement = toElement.parentNode;
        }
        if (toElement == this || fromElement.parentNode.id == "subMenu") { // да, внутри
            return; // значит мы перешли на родителя из потомка, лишнее событие
        }

        return handler.call(this, e);
    };
}
- взято с этого сайта с небольшим дополнением.
Вот сама фун-я -
function ShowSubMenu() {
    document.getElementById("subMenu").style.display = "block";
    var check = 0;
    function ShowSubMenuButton() {
        var subMenuButton = document.getElementsByClassName("subMenuButton");
        subMenuButton[check].style.display = "block";
        check++;
        if (check == 5) {
            clearInterval(timer);
        }
    }
    var timer = setInterval(ShowSubMenuButton, 50);
}

Везде работает, в осле нет. Вызов
ShowSubMenu()
в консоли срабатывает. Вызов
handleMouseenter(ShowSubMenu)
- просто выводит функцию в консоль,
handleMouseenter(ShowSubMenu())
- тоже выводит в консоль но срабатывает (меню показывается).
Походу туплю на какой-то мелочи, но на какой....

devote 16.07.2012 18:03

var toElement = e.relatedTarget || e.type == 'mouseout' ? e.toElement : e.type == 'mouseover' ? e.fromElement : null;

zilker 16.07.2012 18:13

Спасибо за ответ, но не работает.
С вашим кодом осталось работать только в ие9, в 8м так и не работает + к тому же перестало работать в хроме.

devote 16.07.2012 18:18

ну может стоит скобочки расставить
var toElement = e.relatedTarget || ( e.type == 'mouseout' ? e.toElement : ( e.type == 'mouseover' ? e.fromElement : null ) );

devote 16.07.2012 18:21

ну или так:
var toElement = e.relatedTarget || ( e.srcElement && e.fromElement === e.srcElement ? e.toElement : e.fromElement ) || null;

devote 16.07.2012 18:25

ах и еще, насчет this в ИЕ он равен объекту window. Поэтому нужно делать так:

function handleMouseenter(handler) {
    return function(e) {
        e = e || event; // IE
        var target = e.target || e.srcElement;
        var toElement = e.relatedTarget || ( e.fromElement === target ? e.toElement : e.fromElement ) || null;
        var fromElement = toElement;
 
        // проверяем, мышь пришла с элемента внутри текущего?
        while (toElement && toElement !== target) {
            toElement = toElement.parentNode;
        }
        if (toElement == target || fromElement.parentNode.id == "subMenu") { // да, внутри
            return; // значит мы перешли на родителя из потомка, лишнее событие
        }
 
        return handler.call(target, e);
    };
}

zilker 16.07.2012 18:54

Да, точно! Спасибо огромное!


Часовой пояс GMT +3, время: 10:14.