2010-08-23 55 views
8

Làm cách nào để tệp javascript biết vị trí của nó? Ví dụ:Cách lấy vị trí (src) của tệp javascript?

<script type="text/javascript" src="http://mysite.com/scripts/howdy.js"></script> 

Làm thế nào có thể mã trong howdy.js biết về http://mysite.com/scripts/howdy.js?

Chỉnh sửa: Làm rõ. Tôi không thể dựa vào việc tìm kiếm DOM cho thẻ tập lệnh của mình vì tôi cần biết về nó trước khi DOM có thể sẵn sàng.

+2

Tôi tò mò, tại sao bạn cần thông tin này? – tenfour

+0

có thể trùng lặp của [Làm thế nào tôi có thể nhận được tên tập lệnh kịch bản từ bên trong tập lệnh đó?] (Http://stackoverflow.com/questions/710957/how-might-i-get-the-script-filename-from-within-that -script) –

+1

@tenfour - Có các kịch bản khác mà howdy.js có thể kéo vào từ cùng một thư mục và tôi không thể chắc chắn nơi howdy.js sẽ được lưu trữ (kiểm tra, prod, qa, máy khách, vv). Nó không tuyệt vời nhưng nó là một yêu cầu kinh doanh. @Marcel - Vâng, bạn nói đúng, đó là sự lừa đảo. Nhưng tôi sẽ để nó lên vì tôi không thể tìm thấy câu trả lời đó với các từ tìm kiếm mà tôi đã sử dụng. –

Trả lời

13

Trong khoảnh khắc, trong đó kịch bản hiện nay đang được thực hiện, sẽ là script yếu tố cuối cùng trong DOM, do đó bạn có thể nhận được bằng cách:

var scripts = document.getElementsByTagName('script'), 
    currentScriptSrc = scripts[scripts.length-1].src; 

Kiểm tra điều này example tải số này script.

Edit: Lấy trong việc xem xét bình luận các @ kangax của, về asyncdefer thuộc tính, cách an toàn chỉ IMO, trước đây biết tên tập tin, sẽ được kiểm tra việc script yếu tố trên trang web, kiểm tra thuộc tính src của nó , một số thư viện như Scriptaculous.us sử dụng kỹ thuật này, ví dụ:

var scripts = document.getElementsByTagName('script'), 
    len = scripts.length, 
    re = /howdy\.js$/, 
    src, howdyScriptSrc; 

while (len--) { 
    src = scripts[len].src; 
    if (src && src.match(re)) { 
    howdyScriptSrc = src; 
    break; 
    } 
} 
​ 
+0

Tuyệt vời, không biết bạn đã được đảm bảo thông tin này. Nhưng nó có vẻ phù hợp trên mọi trình duyệt mà tôi đã thử. Cảm ơn! –

+1

Hãy xem xét nhận xét của Kangax dẫn tôi tới đây: http://twitter.com/kangax/status/22208127507 – zachleat

+1

@zachleat: Cảm ơn !, Có, tôi đã hoàn toàn quên thuộc tính trì hoãn và không đồng bộ. – CMS

0

Hãy thử:

document.scripts[document.scripts.length-1]; // add .src to get href 
//or 
document.getElementsByTagName("script")[document.getElementsByTagName("script").length-1]; 
//for (maybe) better compatibility 

nào được kịch bản cuối cùng trong DOM. Nếu kịch bản của bạn đang được thực hiện trong khi nó đang được tải, điều này sẽ trả về phần tử bên phải.

Lưu vào biến để sử dụng trong các chức năng sẽ được sử dụng sau này.

var thisScript = document.scripts[document.scripts.length-1]; 
1

Đưa thẻ script này một id, và viết:

var src = document.getElementById('scriptID').attributes['src']; 
1

Hãy thử điều này:

function getScriptSourceName(name){ 
    var scripts = document.getElementsByTagName('script'); 
    for (i=0;i<scripts.length;i++){ 
     if (scripts[i].src.indexOf(name) > -1) 
      return scripts[i].src; 
    } 
} 

getScriptSourceName('howdy.js'); 
Các vấn đề liên quan