Подтвердить что ты не робот

Участник не найден Ошибка IE (IE 6, 7, 8, 9)

Позвольте мне сначала указать всем пользователям IE прямо сейчас (это не проблема в Chrome, Safari или Firefox) подсказка подсказки;)

Итак... У меня проблема с моими подсказками в IE, у меня есть onmouseover-прослушиватель для всех элементов, которые должны быть нависшими, а затем в моей функции mouseover. У меня есть очень базовое описание перекрестного браузера как такового...

var event = e || window.event,
    el = event.target || event.srcElement;

У меня возникли проблемы с объектом окна, который не существует в IE или что-то в этом роде, это было проблемой после того, как я добавил флаг, чтобы игнорировать наведение мыши из одного элемента мыши на пути к самой всплывающей подсказке (во время разрешенного периода времени, 300 мс). Другими словами, флаг должен игнорировать мыши на пути к всплывающей подсказке из первоначальной мыши.

Итак, логика выглядит так:

loadtip.refMouseOver = function (e) {

    var event = e || window.event, el = event.target || event.srcElement;
    //console.log(window); // <-- throws error in IE (Member not found)
    // Reset the lastHoveredRef data.
    tipManager.lastHoveredRef = null;
    tipManager.lastHoveredRef = [el, event];

    // true means there is a tip open still, so if no tip is open.
    if (tipManager.tipState !== true) { 
        tipManager.processTip(el, event);
    } else {        
        return; // do nothing
    }

}

Ошибка "Member not found" возникнет, когда я быстро нахожу один элемент в IE, пока всплывающая подсказка еще не открыта.

Я читал о window.open и закрывал материал с помощью try catch, но я не видел, как это было relavent. Любая помощь приветствуется.

Спасибо

4b9b3361

Ответ 1

Хорошо, я нашел проблему.

Подводя итог, в основном IE не передаст событие другой функции, если этот вызов функции находится в пределах setTimeout.

Итак, вы можете обмануть IE, создав копию события и передав это, вот пример этого...

var eventCopy = {};
for (var i in event) {
    eventCopy[i] = event[i];    
}

Затем просто отправьте свою функцию eventCopy, хотя это "полный" взлом.

setTimeout(function () { yourFunction(eventCopy), yourDelayTime);

И вуаля это сработает.

Я должен добавить, что Internet Explorer просто создаст ссылку на событие глобального окна, поэтому нам нужна копия события. Это связано с тем, что к тому времени, когда setTimeout вызывает функцию, windows.event уже прошел,

Нижняя строка... не пытайтесь отправить событие внутри setTimeout, потому что IE не примет его. Это верно для IE 6, 7 и 8 из моего тестирования.

Ответ 2

Я понимаю, что этот вопрос/ответ довольно старый и, похоже, решен. Тем не менее, у меня есть еще одна альтернатива, с которой я столкнулся с подобной, но слегка отличающейся проблемой с "Member Not Found" в версиях IE до MSIE 9. Надеюсь, это поможет кому-то!... это также можно использовать для устранения проблем с Firefox, не имеющих window.event.

Сначала я расширил jQuery и добавил функцию для получения версии MSIE или -1, если браузер не MSIE. Вы можете сделать то же самое или просто создать чистую JS-функцию для этого. Затем создайте функцию переопределения события (в некоторых случаях может потребоваться добавить глобальную переменную "событие" ), что больше зависит от конкретной ситуации. Затем переопределите событие в обработчике событий при необходимости.

Расширение jQuery

// So this will give you the version of IE (or for non IE browser -1)
$.fn.msieVersion = function()
{
    if ( navigator.userAgent.toLowerCase().indexOf( 'msie' ) !== -1 ) {
        return document.documentMode; 
    }
    return -1;
};

Отменить глобальное событие

var setEvent = function( evt ) {
    // Set the event if MSIE version is >= 9 or is -1 which means it not IE
    if ( $.fn.msieVersion() >= 9 || $.fn.msieVersion === -1 ) { 
        // NOTE: I have a global 'event' variable I'm using that comes from another previously loaded JS file 
        // Why? I didn't do it. I'm updating some SUPER old code the best I can. (old enough it has references to Netscape....)
        event = evt || window.event; 
    }
    return true;
};

Пример использования

$( 'img.myImageID' ).bind('mouseover mouseout', function ( evt ) {
    setEvent( evt ); // Override the event
    // DO WORK! ...continue all other awesomeness here!
    // Maybe setTimeout(...)
};