Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.07.2012, 17:17
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

Не срабатывает обертка фун-и в 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())
- тоже выводит в консоль но срабатывает (меню показывается).
Походу туплю на какой-то мелочи, но на какой....
Ответить с цитированием
  #2 (permalink)  
Старый 16.07.2012, 18:03
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

var toElement = e.relatedTarget || e.type == 'mouseout' ? e.toElement : e.type == 'mouseover' ? e.fromElement : null;
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 16.07.2012 в 18:08.
Ответить с цитированием
  #3 (permalink)  
Старый 16.07.2012, 18:13
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

Спасибо за ответ, но не работает.
С вашим кодом осталось работать только в ие9, в 8м так и не работает + к тому же перестало работать в хроме.
Ответить с цитированием
  #4 (permalink)  
Старый 16.07.2012, 18:18
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

ну может стоит скобочки расставить
var toElement = e.relatedTarget || ( e.type == 'mouseout' ? e.toElement : ( e.type == 'mouseover' ? e.fromElement : null ) );
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #5 (permalink)  
Старый 16.07.2012, 18:21
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

ну или так:
var toElement = e.relatedTarget || ( e.srcElement && e.fromElement === e.srcElement ? e.toElement : e.fromElement ) || null;
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #6 (permalink)  
Старый 16.07.2012, 18:25
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

ах и еще, насчет 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);
    };
}
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 16.07.2012 в 18:30.
Ответить с цитированием
  #7 (permalink)  
Старый 16.07.2012, 18:54
Аватар для zilker
Профессор
Отправить личное сообщение для zilker Посмотреть профиль Найти все сообщения от zilker
 
Регистрация: 30.07.2011
Сообщений: 189

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JSON.stringify в IE8 sysif Internet Explorer 13 15.02.2012 09:11
window.resizeTo(w,h) в ie8 задёт не те размеры. mister_maxim Internet Explorer 1 29.07.2011 22:51
Как отключить режим совместимости в IE8? kidar2 Internet Explorer 2 25.06.2011 16:45
<= IE8 memory leak, IE9 - fine AbNormy Internet Explorer 1 20.05.2011 19:47
IE8, windows 2008 server. Не срабатывает onload у iframe bdiang Events/DOM/Window 4 29.08.2009 15:19