Участник не найден Ошибка 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. Любая помощь приветствуется.
Спасибо
Ответы
Ответ 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(...)
};