2010-08-26 19 views
9

Trong javascript, như một tập lệnh được tải từ máy chủ lưu trữ, có cách nào để biết máy chủ/máy chủ nào tôi đã được tải từ đó không? Tôi cần phải thực hiện thêm yêu cầu ajax trở lại máy chủ đó và muốn tìm ra máy chủ động.Trong Javascript bất kỳ cách nào để biết kịch bản máy chủ lưu trữ được tải từ đâu?

Vì vậy, nếu bạn bao gồm một tập tin javascript trên một trang

<script src="http://somehost.com/js/test.js"></script> 

khi javascript thực hiện, trong test.js ...

var host_loaded_from = ??? // should be somehost.com 

Cảm ơn

+0

+1 câu hỏi tốt, quan tâm đến việc nhìn thấy nếu nó có thể sử dụng JS – Mikey1980

Trả lời

11

có cách nào để biết máy chủ/máy chủ nào I đã được tải từ?

Vâng, nó có thể trừ khi kịch bản được tải không đồng bộ sử dụng defer hoặc async thuộc tính kể từ khi kịch bản cuối cùng trong DOM có thể không nhất thiết phải là kịch bản hiện đang thực hiện trong trường hợp đó. Xem các bình luận của @kangax để biết thêm thông tin.

Ngoài ra, điều này same question đã được đăng gần đây.

Bên trong test.js của bạn, nhận phần tử tập lệnh cuối cùng sẽ là tập lệnh được phân tích cú pháp hiện tại (test.js trong trường hợp của bạn) và nhận được src.

// test.js 
var scripts = document.getElementsByTagName('script'); 
var src = scripts[scripts.length - 1].src; 

Một trong số src được tìm thấy, phân tích cú pháp máy chủ bằng regex.

src.match(new RegExp('https?://[^/]*')) 
["http://somehost.com"] // for your example 
+0

yếu tố kịch bản cuối không nhất thiết phải là một trong những hiện đang được thực thi, mặc dù (suy nghĩ "trì hoãn" và "không đồng bộ" thuộc tính), vì vậy phương pháp này không đáng tin cậy. – kangax

+0

@kangax - là nó đúng để nói ở trên sẽ làm việc với ngoại lệ của khi 'defer' hoặc' async' thuộc tính được sử dụng? – Anurag

+2

Vâng, tôi nghĩ vậy. Đặc tả HTML5 hiện tại - phần lớn nên phản ánh hành vi của trình duyệt thực - nói: "Nếu không có thuộc tính nào (có nghĩa là" trì hoãn "và" không đồng bộ "), thì tập lệnh được tìm nạp và thực thi ngay lập tức, trước khi tác nhân người dùng tiếp tục phân tích cú pháp trang. " Vì vậy, hiện tại kịch bản được thực thi nên trên thực tế là phần tử kịch bản cuối cùng trong tài liệu (vì việc phân tích cú pháp không thể tiếp tục cho đến khi thực hiện xong). – kangax

0

Nope, xin lỗi.

Nếu <script> có id, thì có thể. Nhưng bạn không thể thực sự dựa vào điều đó.

0

Không chắc chắn nếu điều đó có thể được thực hiện với JavaScript. Nếu tập lệnh nằm bên trong tệp PHP, hãy thực hiện như sau:

... 
var host_loaded_from = <?php echo $_SERVER[SERVER_NAME] ?> 
... 

Trên trang web của tôi, tôi bao gồm tập lệnh JS bằng PHP chỉ vì lý do đó. Tôi quan tâm để xem nếu có một cách tốt hơn.

0

Do chính sách xuất xứ giống nhau, bạn có thể yêu cầu AJAX chỉ xuất xứ (host + protocol + port), trang HTML (tài liệu) được tải từ - không nhất thiết giống như nguồn gốc js của bạn đã được tải từ.

Bạn có thể sử dụng window.location.hostname hoặc document.location.hostname để tìm ra tên máy chủ của tài liệu.

+0

Hãy nhớ khi các cuộc gọi Ajax bị giới hạn, một tập lệnh Javascript CÓ THỂ tải thêm các tập lệnh, dữ liệu (sử dụng JSONP), hình ảnh, v.v ... từ bất kỳ miền nào. Chính sách xuất xứ tương tự là về các cuộc gọi Ajax thẳng. –

+1

@Larry: Có, nhưng OP đã hỏi cụ thể về các cuộc gọi Ajax. (JSONP không phải là Ajax.) –

0

Tập lệnh có biết tên tệp riêng của nó không? ("test.js" trong câu hỏi OP.)

Nếu vậy, tập lệnh của bạn có thể truy vấn vị trí cho tất cả các thẻ tập lệnh, tìm kiếm các thẻ có thuộc tính src. Nhưng bạn cần xem hai kịch bản có cùng tên tệp được tải từ các máy chủ khác nhau.Ví dụ:

<script src="http://somehost.com/js/test.js"></script> 
<script src="http://somehost_number2.com/js/test.js"></script> 

Dưới đây là JS trông cho tất cả các thẻ script trong một el:

var scripts = el.getElementsByTagName('SCRIPT'); 
Các vấn đề liên quan