2

一部のページに少なくとも 1 つのメディア プレーヤーが含まれる Web サイトを作成しています。ページ サイズの制限により、メディア プレーヤーの JavaScript ファイルをメディアのあるページにのみロードしたいと考えています。ページの先頭にある JavaScript オブジェクトにメディア情報を保存し、本文の最後に他のスクリプト ファイルをロードしています。

このソリューション( を使用) は非常に優れていることがわかりまし$.getScriptたが、どのフレームワークにも依存しないソリューションが必要です。jQuery Web サイトで興味深い実装を見つけたので、次のように変更しました。

<script>typeof(player) != 'object' || document.write(unescape('%3Cscript src="/assets/js/player/mediaplayer/jwplayer.js"%3E%3C/script%3E'));</script>

それは魅力のように機能しますが、私はjavascriptのプロではないので、これがどのように機能するか知りたいですか?

  • オブジェクト型の変数がない場合、2 番目の条件をチェックする必要はありませんか?
  • 他のブラウザはこのコードに対してどのように動作しますか?
  • それらのすべて (古い IE も含む) は 2 番目の条件をスキップしますか、それともすべての条件をチェックする可能性がありますか?
  • クロスブラウザ動作でより良い解決策はありますか?
4

2 に答える 2

2

Use a more standard approach to loading:

jQuery

Use getScript

if (typeof player != "object") {
    $.getScript("/assets/js/player/mediaplayer/jwplayer.js");
};

Raw JavaScript

function loadScript(path) {
    var script = document.createElement("script");
    script.src = path;
    script.type = "text/javascript";
    // changed "target" to "head"
    var head = document.getElementsByTagName("head")[0];
    head.appendChild(script);
};

Then in your code:

if (typeof player != 'object') {
    loadScript("/assets/js/player/mediaplayer/jwplayer.js");
};
于 2013-05-11T19:10:12.190 に答える
1

あなたが言及しているのは短絡と呼ばれるものです。

ご覧のコード||では、「or」演算子である を使用しています。したがって、「or」演算子の場合、オペランドの 1 つだけが true である必要があります。つまり、オペランドの 1 つが条件を満たすとすぐに、残りは評価されません。例えば:

if (returnTrue() || returnFalse()) {

(関数がそれ自体を物語っています)returnFalse()ショートサーキットのため、メソッドは呼び出されません。オペランドの 1 つ (最初の) が true と評価されるためreturnTrue()条件は「or」演算子を満たします。

「and」演算子はその反対であり、すべてのオペランドtrueが満たされるために評価される必要があります。

例えば:

if (returnTrue() && returnFalse()) {

すべてのオペランドが に評価returnFalse() ifれるかどうかをステートメントが知る必要があるため、 が呼び出されますtrue。最初のもの真なので、オペランドの評価を続けます。もう一つの例:

if (returnTrue() && returnFalse() && returnTrue()) {

最初の 2 つの呼び出しのみが実行されますがreturnFalse()、比較が台無しになり、最後の呼び出しに到達する前に短絡します。returnTrue()

これらの「ルール」はすべてifステートメントの外側に適用されるため、コードが機能します。playerしたがって、コードでは、「がオブジェクトの場合、オペランドの評価を続行する」と言っています。あなたのコードは基本的に次と同じです:

if (typeof(player) == 'object') {
    document.write("stuff");
}

私はあなたが知っていると確信しています。

参照:

于 2013-05-11T19:51:21.973 に答える