2009-06-19 11 views
12

属性:パスはSRCを経由してJavaScriptにvarsのは、私はJSにリンクしている私のHTMLファイルで

src="myscript.js?config=true" 

私のJSは、直接このように、このvarの値を読むことができますか?

alert (config); 

これは機能しません。また、FireFoxエラーコンソールには「config is not defined」と表示されます。 JSファイルのsrc属性で渡された変数を読み取るにはどうすればよいですか?これは簡単ですか?

答えて

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

JSに変数を渡すことはできません。 SCRIPTタグは、(クエリ文字列を持つ)Windowオブジェクトを作成せず、サーバー側のコードではありません。

+0

良い代替、それは答えませんが、私の質問:) –

+8

はいそれはしますか:質問 "私のJSはこのようなこのvarの価値を直接読み取ることができますか?"答え "あなたは試したやり方でJSに変数を渡すことはできません" – Benjol

+0

srcのattrはphp(または他のサーバーサイドの技術者)を指し示し、これを達成することができます。 –

4

あなたはこれを行ったかもしれませんが、実際にはJSファイルはPHPや他の言語を使用してサーバー側で前処理されています。サーバー側のコードは、変数を設定した状態でjavascriptを印刷/エコーします。スクリプト広告サービスがこれまでにやっているのを見たことがあります。それで私はそれが普通のOLでできるかどうか見てみましたが、できません。

+0

JSONP(http://en.wikipedia.org/wiki/JSONP#JSONP)の仕組みもこれです。関数の名前を渡すと、サーバーはそれを本体にエコーします。 –

+0

実際、JSONPはPHPやASPなどのサーバー側言語で処理されるため、 –

5

はい、できますが、あなたはスクリプトで正確なスクリプトファイル名を知っておく必要があります。

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; 
    } 
} 

あなたは今渡された引数を持っている「オプション」の変数を持っています。私はそれをテストしなかった、私は少しそれをhttp://code.google.com/p/canvas-text/source/browse/trunk/canvas.text.jsから変更しました。

+0

私はこれがItay Moavの答えよりも有益な現実世界のユースケースを考えるのに苦労しています。 –

+2

スクリプトを統合しやすくするためです。 Personnaly私はいくつかの変数を他のスクリプトタグで宣言しなければならないよりも、いくつかのhttpパラメータ(実際にはそうではない)を渡す方が簡単だと分かります。 –

4

スクリプトのsrc属性を見つけて '?'の後に変数を解析するには、JavaScriptを使用する必要があります。 prototype.jsのフレームワークを使用して、それがこのような何かなります

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" ?? 
}); 

を私のJavascript /正規表現のスキルが錆びているが、それは一般的な考えです。 scriptaculous.jsファイルからまっすぐに抜粋!

+0

+1私にそれを打つために、私はちょうどそれを貼り付けた:( – karim79

1

あなたのスクリプトは、独自のスクリプトノードを見つけてsrc属性を調べて好きな情報を抽出することができます。

これを実行するかどうか
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

スクリプトタグにIDを与えることはずっと簡単ではないでしょうか?document.getElementById? –

+0

あなたは両方のスクリプト私のコードフラグメントは一般的なライブラリファイルから来たもので、誤って指定された場合、そのユーザが次の問題のIDを使用する必要はありません。 – HBP

0

は、公正な質問ですが、あなたがそれをしたい場合は、http://feather.elektrum.org/book/src.htmlは本当に方法を示しています。スクリプトタグをレンダリングするときにブラウザがブロックされていると仮定すると(現在は当てはまりますが、将来証明されることはありません)、問題のスクリプトは常にその時点までのページの最後のスクリプトです。

jQueryとhttp://plugins.jquery.com/project/parseQueryのようなフレームワークとプラグインを使用すると、これはかなり簡単になります。まだそれのためのプラグインはありません驚いている。

やや関連ジョンResig氏の分解スクリプトタグであるが、それはない初期化の一部として、外部スクリプトの後のコードを実行します:http://ejohn.org/blog/degrading-script-tags/

クレジット:Passing parameters to JavaScript files、グローバル変数を使用してPassing parameters to JavaScript files

0

そうではありませんクリーンで安全なソリューションではなく、データ-X属性を使用することができます。それはよりクリーンで安全です。

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

From myfile。JSあなたはjQueryを使って、たとえば、データパラメータにアクセスすることができます。

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

「myfile.is」と「parameter_1を」2つのソースに一致する必要が;)

関連する問題