Не срабатывает обертка фун-и в 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())- тоже выводит в консоль но срабатывает (меню показывается). Походу туплю на какой-то мелочи, но на какой.... |
var toElement = e.relatedTarget || e.type == 'mouseout' ? e.toElement : e.type == 'mouseover' ? e.fromElement : null; |
Спасибо за ответ, но не работает.
С вашим кодом осталось работать только в ие9, в 8м так и не работает + к тому же перестало работать в хроме. |
ну может стоит скобочки расставить
var toElement = e.relatedTarget || ( e.type == 'mouseout' ? e.toElement : ( e.type == 'mouseover' ? e.fromElement : null ) ); |
ну или так:
var toElement = e.relatedTarget || ( e.srcElement && e.fromElement === e.srcElement ? e.toElement : e.fromElement ) || null; |
ах и еще, насчет 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);
};
}
|
Да, точно! Спасибо огромное!
|
| Часовой пояс GMT +3, время: 04:39. |