2011-04-25 33 views
0

我想包括腳本標籤,同時提供一個參數給它。這是我想出了迄今爲止什麼是最簡單的<script>標籤使用參數

  1. 提供一個參數腳本網址:腳本標籤(利弊

    <script src="http://example.com/something.js?P=123" type="text/javascript"></script> 
    
  2. 隱藏參數(利弊生成多個JS文件):同#1 )

    <script src="http://example.com/scripts/123/something.js" type="text/javascript"></script> 
    
  3. 谷歌分析方法(缺點:醜陋的,複雜的,全局變量)

    <script type="text/javascript" charset="utf-8"> 
        var _something = _something || 123; 
        (function() { 
        var s = document.createElement('script'); 
        s.type = 'text/javascript'; 
        s.src = 'http://example.com/something.js'; 
        var ss = document.getElementsByTagName('script')[0]; 
        ss.parentNode.insertBefore(s, ss); 
        })(); 
    </script> 
    

回答

1

如果執行腳本的方式,取決於它是如何調用,您可以添加PARAMS喜歡你的選項1.

其他方式是:

<script params='{"abc": 123}' src="script.js"></script><!-- params is a non standard, non official attr that the script will read --> 

<script>var _abc = 123;</script> 
<script src="script.js"></script> 

甚至

<script src="script.js#abc=123"></script> 

我雖與@outis同意:加載同樣的事情給大家,總是和/客戶想(S)之後像你執行它。

+0

真棒,感謝第三個代碼塊! – pitr 2011-04-25 03:07:46

3

最好的事情是在外部腳本,定義的東西(功能& C),但執行任何操作。然後有一個內聯腳本調用外部腳本中定義的函數/方法。

<script src="http://example.com/something.js" type="text/javascript"></script> 
<script type="text/javascript"> 
    something(123); 
</script> 
+0

這仍然有我的#3(全局變量,過於複雜,包括)相同的缺點,儘管更短:) – pitr 2011-04-25 03:01:44

+0

@pitr:沒有全局變量,調用函數並不完全複雜。這種方法與您在其他語言中使用的方法相同,其中外部腳本是庫,內部是程序入口點。這也正是JS庫的使用方式。 – outis 2011-04-25 07:55:54

+0

'something()'在全局命名空間中,不是嗎?庫通過全局變量(例如'$'或'_')公開其功能(因爲這就是它們的功能)。然而,我不想不必要地污染命名空間(我在問題中沒有提到的東西) – pitr 2011-04-25 20:29:53

1

我這樣做了,我有一個跨子域XHR處理。我叫它爲:

<script type="text/javascript" src="xd.js#subdomain"></script> 

,然後在腳本中,解析它本身(使用jQuery):

$('script').each(function(){ 
    if((src = this.src).indexOf('xd.js') < 0){ return; } 
    xds = src.substr(src.indexOf('#') + 1).split(','); 

    // do stuff with xds 
}); 
+0

不是我在找的東西,因爲它需要在不同位置使用jQuery代碼,但這個想法(類似於@Rudie)是我可能最終要做的。謝謝! – pitr 2011-04-25 03:04:11

+0

jQuery的作品與'document.getElementsByTagName('script')' – 2011-04-25 03:09:49

+0

相同我不是在談論jQuery的依賴關係,但事實上有兩個地方,代碼在本質上。 – pitr 2011-04-25 03:41:40

1

你的第一個例子並不需要生成多個文件。它可以通過單獨的JavaScript使用,通過檢測window.location.href和解析它(你可能會發現的http://phpjs.org/functions/parse_url:485http://phpjs.org/functions/parse_str:484有用喜歡做這個:var queryString = parse_str(parse_url(window.location.href).query);)。

不過,如果你使用類似#P=123而不是?P=123,你會不會導致你的用戶文件的另一個下載,所以我建議,而不是(在這種情況下,改變「查詢」上面的代碼示例中到「片段」)。

另一種可能性是使用HTML5保留數據 - *屬性,在腳本中檢測它們的值:

<script src="http://example.com/something.js" data-myOwnAttribute="someValue" data-anotherCustomAttribute="anotherValue"></script> 

然後,該腳本將沿着這些線路檢測:

(function() { 
    function getScriptParam (attr) { 
     var scripts = document.getElementsByTagName('script'), 
      currentScript = scripts[scripts.length-1]; 
     return currentScript.getAttribute('data-' + attr); // in future, could just use the HTML5 standard dataset attribute instead: currentScript.dataset[attr] 
    } 
    var myOwnAttribute = getScriptParam('myOwnAttribute'); 
    // ... do stuff here ... 
}()); 

實谷歌醜陋的API的優勢在於,它允許開發者在文檔的<head>中放入代碼(被認爲是適當的形式),同時仍然以跨瀏覽器的方式異步執行。我認爲如果他們將動態腳本標記技術與上述任何一種方法結合起來,他們確實可以避免全球化。

相關問題