Член не найден IE ошибка (IE 6, 7, 8, 9) - PullRequest
26 голосов
/ 20 августа 2010

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

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

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
    }

}

Ошибка «Элемент не найден»произойдет, когда я быстро наведусь от одного элемента к следующему в IE с открытой подсказкой.

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

Спасибо

Ответы [ 2 ]

43 голосов
/ 20 августа 2010

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

Подводя итог, в основном 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 из моего тестирования.

0 голосов
/ 28 апреля 2015

Я понимаю, что этот вопрос / ответ довольно старый и, кажется, решен. При этом у меня есть другая альтернатива, которую я использовал для решения аналогичной - но немного другой - проблемы с «Член не найден» в версиях 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's 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(...)
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...