2010-08-20 27 views
26

Hãy để tôi chỉ ra trước cho bất kỳ người dùng IE nào ngay bây giờ (đây không phải là vấn đề gợi ý gợi ý trong Chrome, Safari hoặc Firefox;)Thành viên không tìm thấy lỗi IE (IE 6, 7, 8, 9)

Vì vậy ... Tôi có vấn đề với chú giải công cụ trong IE, tôi có trình nghe onmouseover cho tất cả các yếu tố có thể di chuột và sau đó trong chức năng di chuột của tôi, tôi có một tuyên bố trình duyệt chéo cơ bản như vậy ...

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

Tôi đã gặp sự cố với đối tượng cửa sổ không tồn tại trong IE hoặc gì đó, đây là vấn đề sau khi tôi thêm cờ để bỏ qua di chuột qua một phần tử di chuột trên đường đến chú giải công cụ (trong khi chu kỳ thời gian cho phép, 300ms). Nói cách khác, cờ là để bỏ qua mouseovers trên tuyến đường đến tooltip từ mouseover gốc.

Vì vậy, logic đó trông như thế này ...

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 
    } 

} 

Các "thành viên không tìm thấy" lỗi sẽ xảy ra khi tôi di chuột từ một yếu tố một cách nhanh chóng đến tiếp theo trong IE với tooltip vẫn còn mở.

Tôi đã đọc về window.open và các công cụ đóng với một lần thử nhưng tôi không thấy cách đó đã được relavent. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

Cảm ơn

Trả lời

42

Ok Tôi đã tìm thấy sự cố.

Tóm lại, về cơ bản IE sẽ không chuyển một sự kiện sang chức năng khác nếu cuộc gọi hàm đó nằm trong một setTimeout.

Vì vậy, bạn có thể đánh lừa trình duyệt IE bằng cách tạo ra một bản sao của sự kiện và truyền rằng, đây là một ví dụ về điều đó ...

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

Sau đó, chỉ cần gửi chức năng của bạn eventCopy, mặc dù đây là một ' tổng số 'hack.

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

Và nó sẽ hoạt động.

Tôi nên thêm, Internet Explorer sẽ chỉ tạo tham chiếu đến sự kiện cửa sổ toàn cầu, đó là lý do tại sao chúng tôi cần bản sao sự kiện. Điều này là do thời gian setTimeout gọi hàm, windows.event đã trôi qua,

Dòng dưới cùng ... không cố gửi sự kiện bên trong một setTimeout vì IE sẽ không chấp nhận nó. Điều này đúng với IE 6, 7 & 8 từ thử nghiệm của tôi.

0

Tôi nhận thấy câu hỏi/câu trả lời này khá cũ và dường như đã được giải quyết. Điều đó đang được nói, tôi có một lựa chọn khác mà tôi đã sử dụng để xử lý một vấn đề tương tự - nhưng hơi khác với 'Thành viên Không tìm thấy' trong các phiên bản IE trước MSIE 9. Tôi hy vọng điều này sẽ giúp ai đó ra ngoài! ... điều này cũng có thể được sử dụng để khắc phục sự cố với Firefox không có window.event.

Đầu tiên tôi mở rộng jQuery và thêm một hàm để lấy phiên bản MSIE hoặc -1 nếu trình duyệt không phải là MSIE. Bạn có thể làm như vậy hoặc chỉ cần tạo một hàm JS thuần túy để thực hiện điều này. Sau đó, tạo một hàm ghi đè sự kiện (có thể cần phải thêm một biến 'sự kiện' toàn cầu trong một số trường hợp), đó là nhiều hơn cho mỗi trường hợp cơ sở cá nhân. Sau đó ghi đè lên sự kiện trong trình xử lý sự kiện của bạn nếu cần.

Mở rộng 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; 
}; 

Override sự kiện toàn cầu

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; 
}; 

Cách sử dụng Ví dụ

$('img.myImageID').bind('mouseover mouseout', function (evt) { 
    setEvent(evt); // Override the event 
    // DO WORK! ...continue all other awesomeness here! 
    // Maybe setTimeout(...) 
}; 
Các vấn đề liên quan