2010-06-10 13 views
19

Hey tất cả, tôi đã cố gắng để nhét vào một hàm tổng quát để lấy URL tuyệt đối của một tập tin JavaScript thực hiện trên một trang web:Bắt URL của thi tập tin JavaScript (IE6-7 vấn đề chủ yếu)

http://gist.github.com/433486

về cơ bản bạn có thể gọi một cái gì đó như thế này:

getScriptName(function(url) { 
    console.log(url); 
    // http://www.example.com/myExternalJsFile.js 
}); 

bên trong một tập tin JavaScript bên ngoài trên một trang và sau đó có thể làm điều gì đó với nó (như tìm thẻ <script> mà nạp nó chẳng hạn).

Nó hoạt động tốt trong hầu hết các trình duyệt mà tôi đã thử nghiệm (Firefox, Chrome, Safari, Opera v10 ít nhất và IE 8).

Có vẻ như không thành công, tuy nhiên, trong IE 6 và 7. Hàm gọi lại được thực thi, nhưng tên đã truy xuất là URL đến trang HTML chính, không phải tệp JavaScript. Tiếp tục với ví dụ, getScriptName gọi hàm gọi lại với thông số: http://www.example.com/index.html

Vì vậy, tất cả những gì tôi thực sự hỏi là có cách nào khác để lấy URL của tệp JavaScript hiện tại (có thể là trình duyệt IE 6 và 7 cụ thể không)? Cảm ơn trước!

EDIT: Ngoài ra, điều này sẽ không làm việc trong mọi trường hợp, vì vậy xin đừng khuyên nó:

var scripts = document.getElementsByTagName("script"); 
return scripts[scripts.length-1].src; 

Tôi muốn nó hoạt động trong trường hợp thẻ script tự động tạo ra (có thể không được đặt cuối cùng trong trang), hay còn gọi là lười biếng.

+1

Mã và câu hỏi hay. Mặc dù tôi không biết câu trả lời cho điều này, tôi chỉ muốn cung cấp cho bạn một vài tối ưu hóa: bạn có thể thay đổi mọi 'obj ['prop']' thành 'obj.prop' và như 'typeof' luôn trả về một chuỗi, bạn không phải kiểm tra nhận dạng (' === '); thử nghiệm cho bình đẳng ('==') là đủ tốt. Những điều này thực hiện tốt hơn một chút so với những thứ trong mã của bạn. –

+0

Cảm ơn. Ya, tôi biết tôi có thể thay thế obj ['prop'] thành obj.prop, tôi chỉ có nó theo cách đó để chuẩn bị có chức năng được gửi đến Google Closure Compiler, nó sẽ mang những tên biến đó. Tôi sẽ thay đổi === thành == mặc dù, cảm ơn! – TooTallNate

+0

Tôi vừa thử truy cập 'obj ['prop']' chống lại 'obj.prop', nhưng trái với những gì tôi nghĩ là trường hợp, trong Firefox, sự khác biệt là không đáng kể, trong khi Chrome trước đây thực sự * nhanh hơn * . Tôi thực sự ngạc nhiên về điều này, nó có thể có một cái gì đó để làm với 'biên dịch' của JavaScript của V8. –

Trả lời

1

Rất nhiều điều này tùy thuộc vào những gì bạn có quyền truy cập. Nếu, như nó xuất hiện, bạn đang cố gắng làm điều này hoàn toàn trong mã JS, tôi không tin rằng bạn có thể làm điều đó, vì một số lý do được hiển thị ở trên. Bạn có thể nhận được 90% con đường có thể, nhưng không được dứt khoát.

Nếu bạn đang làm việc trong môi trường dotnet (tôi là người duy nhất biết), tôi sẽ đề nghị sử dụng một mô-đun có thể chặn tất cả các yêu cầu JS và thêm vào vị trí yêu cầu hoặc bản chất đó.

Tôi nghĩ bạn cần giải quyết vấn đề này từ phía máy chủ chứ không phải phía máy khách. Tôi không nghĩ rằng bạn sẽ có một câu trả lời cuối cùng hình thức phía khách hàng. Tôi nghĩ rằng bạn cũng sẽ đấu tranh để có được một câu trả lời từ phía máy chủ, nhưng bạn có thể thành công hơn.

1

Xin lỗi, tôi nghi ngờ bạn có thể đấu tranh với điều này. IE sớm hơn so với phiên bản 8 thường đưa ra các thông báo lỗi từ các lỗi javascript có dạng:

line: 342 
char: 3 
error: expected identifier, string or number 
code: 0 
url: http://example.com/path/to/resource 

nơi url là window.location.href, chứ không phải là địa chỉ URL của tài nguyên javascript bên ngoài có chứa các vấn đề. Tôi đề xuất rằng IE cung cấp giá trị URL không ích lợi vì URL tập lệnh không có sẵn cho IE tại thời điểm đó và không có sẵn cho bất kỳ Javascript nào bạn có thể viết để cố gắng hiển thị nó.

Tôi rất muốn có thể liên kết tới ghi chú phát hành IE8 cho biết lỗi/tính năng này đã được khắc phục, do đó lý do tôi tạo trang này làm wiki cộng đồng. MSDN foo của tôi khá yếu!