2009-06-19 42 views
12

Trong tập tin HTML của tôi, tôi đã liên kết với JS với:đèo vars JavaScript qua SRC thuộc tính

src="myscript.js?config=true" 

thể JS của tôi trực tiếp đọc các giá trị của var này như thế này?

alert (config); 

Tính năng này không hoạt động và Bảng điều khiển lỗi FireFox cho biết "chưa định nghĩa cấu hình". Làm thế nào để đọc các vars được truyền qua thuộc tính src trong tệp JS? Nó có đơn giản không?

Trả lời

16
<script> 
var config=true; 
</script> 
<script src="myscript.js"></script> 

Bạn không thể chuyển biến cho JS theo cách bạn đã thử. Thẻ SCRIPT không tạo đối tượng Window (có chuỗi truy vấn) và nó không phải là mã phía máy chủ.

+0

Tốt thay thế, mặc dù nó không trả lời câu hỏi của tôi :) –

+8

Có nó không: Câu hỏi "JS của tôi có thể đọc trực tiếp giá trị của var này như thế này?" Trả lời "Bạn không thể passe biến JS theo cách bạn đã thử" – Benjol

+0

Mặc dù, src attr có thể trỏ đến một php (hoặc bất kỳ máy chủ bên công nghệ) và thực hiện điều này. –

4

Bạn có thể đã thấy điều này được thực hiện, nhưng thực sự tệp JS đang được xử lý trước phía máy chủ bằng cách sử dụng PHP hoặc một số ngôn ngữ khác trước. Mã phía máy chủ sẽ in/echo javascript với các biến được đặt. Tôi đã nhìn thấy một dịch vụ quảng cáo kịch bản làm điều này trước đây, và nó làm cho tôi nhìn vào xem nếu nó có thể được thực hiện với đồng bằng ol 'js, nhưng nó không thể.

+0

Đây cũng là cách JSONP (http://en.wikipedia.org/wiki/JSONP#JSONP) hoạt động. Bạn chuyển tên của một hàm và máy chủ sẽ lặp lại nó trong cơ thể. –

+0

Thật vậy, vì JSONP được xử lý bởi ngôn ngữ phía máy chủ như PHP hoặc ASP. –

5

Vâng, bạn có thể, nhưng bạn cần phải biết tên tập tin kịch bản chính xác trong kịch bản:

var libFileName = 'myscript.js', 
    scripts = document.head.getElementsByTagName("script"), 
    i, j, src, parts, basePath, options = {}; 

for (i = 0; i < scripts.length; i++) { 
    src = scripts[i].src; 
    if (src.indexOf(libFileName) != -1) { 
    parts = src.split('?'); 
    basePath = parts[0].replace(libFileName, ''); 
    if (parts[1]) { 
     var opt = parts[1].split('&'); 
     for (j = opt.length-1; j >= 0; --j) { 
     var pair = opt[j].split('='); 
     options[pair[0]] = pair[1]; 
     } 
    } 
    break; 
    } 
} 

Bạn có bây giờ là một biến 'tùy chọn' trong đó có các đối số được truyền. Tôi đã không kiểm tra nó, tôi đã thay đổi nó một chút từ http://code.google.com/p/canvas-text/source/browse/trunk/canvas.text.js nơi nó hoạt động.

+0

Tôi đang đấu tranh để nghĩ về một trường hợp sử dụng trong thế giới thực, điều này sẽ có lợi hơn so với câu trả lời của Itay Moav. –

+2

Để làm cho tập lệnh dễ tích hợp hơn. Personnaly tôi tìm thấy nó dễ dàng hơn để vượt qua một vài tham số http (mà không thực sự là những cái) hơn là phải khai báo một vài biến trong một thẻ script khác. –

4

Bạn cần sử dụng Javascript để tìm thuộc tính src của tập lệnh và phân tích các biến sau '?'. Sử dụng khuôn khổ Prototype.js, nó trông giống một cái gì đó như thế này:

var js = /myscript\.js(\?.*)?$/; // regex to match .js 

var jsfile = $$('head script[src]').findAll(function(s) { 
    return s.src.match(js); 
}).each(function(s) { 
    var path = s.src.replace(js, ''), 
    includes = s.src.match(/\?.*([a-z,]*)/); 
    config = (includes ? includes[1].split('='); 
    alert(config[1]); // should alert "true" ?? 
}); 

kỹ năng Javascript/RegEx của tôi là gỉ, nhưng đó là ý tưởng chung. Ripped trực tiếp từ tập tin scriptaculous.js!

+0

+1 vì đã đánh tôi, tôi đã dán vào đó: ( – karim79

1

Tuy nhiên, tập lệnh của bạn có thể định vị nút tập lệnh của chính nó và kiểm tra thuộc tính src và trích xuất bất kỳ thông tin nào bạn muốn.

var scripts = document.getElementsByTagName ('script'); 
    for (var s, i = scripts.length; i && (s = scripts[--i]);) { 
    if ((s = s.getAttribute ('src')) && (s = s.match (/^(.*)myscript.js(\?\s*(.+))?\s*/))) { 
     alert ("Parameter string : '" + s[3] + "'");  
     break; 
    } 
    } 
+1

Nó sẽ không đơn giản hơn để cung cấp cho thẻ script một ID và trong đó sử dụng document.getElementById? –

+0

Có nếu bạn là tác giả của cả hai tập lệnh Đoạn mã của tôi đến từ một tệp thư viện chung và tôi không muốn người dùng của nó phải sử dụng id với các vấn đề tiếp theo nếu nó được chỉ định không chính xác. – HBP

0

Việc này có phải là câu hỏi hợp lý hay không, nhưng nếu bạn muốn, http://feather.elektrum.org/book/src.html thực sự sẽ hiển thị như thế nào. Giả sử trình duyệt của bạn chặn khi hiển thị thẻ tập lệnh (hiện tại là đúng, nhưng có thể không phải là bằng chứng trong tương lai), tập lệnh được đề cập luôn là tập lệnh cuối cùng trên trang đến thời điểm đó.

Sau đó, sử dụng một số khung và plugin như jQuery và http://plugins.jquery.com/project/parseQuery điều này trở nên khá tầm thường. Ngạc nhiên không có một plugin cho nó được nêu ra.

Hơi liên quan là thẻ script hạ John Resig, nhưng mà chạy mã SAU kịch bản bên ngoài, không phải là một phần của việc khởi tạo: http://ejohn.org/blog/degrading-script-tags/

Điểm Uy Tín: Passing parameters to JavaScript files, Passing parameters to JavaScript files

0

Sử dụng các biến toàn cầu không phải là một cái giải pháp sạch hoặc an toàn, thay vào đó bạn có thể sử dụng các thuộc tính data-X, nó sạch hơn và an toàn hơn:

<script type="text/javascript" data-parameter_1="value_1" ... src="/js/myfile.js"></script> 

Từ myfile.js bạn có thể truy cập vào các thông số dữ liệu, ví dụ với jQuery:

var parameter1 = $('script[src*="myfile.js"]').data('parameter_1'); 

Rõ ràng "myfile.is" và "parameter_1" phải phù hợp trong 2 nguồn;)

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