2012-10-17 32 views
5

Tôi có biến objtypeof trong IE <= 8 cho các hàm gốc

obj có thể là bất kỳ thứ gì và tôi muốn phát hiện xem hàm obj có phải là hàm hay không. Thông thường tôi sẽ làm

typeof obj === 'function' 

Vấn đề là trong IE < = 8 khi obj là một chức năng có nguồn gốc (ít nhất là biết điều đó xảy ra với window.open và window.alert). Trong IE typeof obj khi đối tượng là window.open === 'object'

Có cách nào đáng tin cậy để kiểm tra xem window.open có thực sự là một hàm hay không?

tôi thấy jQuery cũng thất bại về vấn đề này

$.isFunction(window.open) => false //in IE 

này apperantly bị loại bỏ trong jquery 1.3 hoặc một cái gì đó, không chắc chắn làm thế nào họ đã kiểm tra nó trước đó.

Added: Một cách dường như là để gọi

Function.prototype.apply.apply(window.open) 

Nếu điều này không ném ra một lỗi, sau đó cửa sổ đang mở là một hàm. Nếu bạn làm

Function.prototype.apply.apply({}) 

Sau đó, IE sẽ gửi lỗi "Chức năng được mong đợi". Nhưng nó là khó có một giải pháp tốt để mở một cửa sổ để kiểm tra xem một biến là một chức năng ..

+2

Vì vậy, đây chỉ là một vấn đề đối với các hàm gốc trong đối tượng typeof trả về của IE, nhưng các hàm do người dùng định nghĩa đang trả về hàm typeof? Tại sao nó không đủ để chỉ kiểm tra rằng các chức năng bản địa tồn tại tức là 'window.open! == undefined'? Tại sao bạn cần các hàm gốc, được ghi lại để làm điều này? Xin lỗi, chỉ cần cố gắng hiểu quy trình suy nghĩ của bạn. – Scott

+0

Hãy xem @ 1.2 & thử nghiệm của nó cho "chức năng" theo nghĩa đen; http://code.google.com/p/jqueryjs/downloads/detail?name=jquery-1.2.js –

+0

^Mã có liên quan từ liên kết của @ AlexK. 'return !! fn && typeof fn! =" string "&& fn.nodeName && fn.constructor! = Array && /function/i.test (fn + ""); 'trong đó fn là tên hàm – Scott

Trả lời

0

Khi nói đến chức năng trình duyệt bản xứ, tính năng phát hiện nên là đủ:

if (window.open) { 
    window.open(...) 
} 

Nếu ai đó ghi đè mẹ đẻ các hàm, sau đó không sử dụng mã của chúng. Họ không nên làm điều này, và bạn đang yêu cầu các vấn đề.

Thật khó để trả lời câu hỏi này mà không có một số ngữ cảnh. Bạn đang đi qua trong obj và gọi nó là một hàm. Nếu bạn đang đi qua trong nhiều loại dữ liệu và làm một cái gì đó khác nhau dựa trên loại, tôi sẽ cho rằng bạn không nên bàn giao các chức năng ở đây. Bởi vì trình duyệt quirks, tạo ra một chức năng một cách rõ ràng để tự động gọi một chức năng khác và không làm kiểm tra lỗi.

+0

Tôi thành thật không nhớ nữa lý do để hỏi điều này là gì. –

Các vấn đề liên quan