4

スクリプトがロードされたら<script>、ページから要素を削除しても、変数/関数はそのまま残ります。

UIを処理し、ユーザーが好みに基づいて選択できる2つのバージョンの関数があるとします。

ページ全体はAJAXベースです。理想的には、ユーザーが明示的に行わない限り、リロードしないようにする必要があります。そのため、呼び出しlocation.reload()は問題外です。

私が持っているアイデアはこれです:

<script type="text/javascript" src="ui1.js" id="uiscript"></script>

次に、単に変更します。

document.getElementById('uiscript').src = ...;

どちらのファイルも次の形式です。

var ui = function(...) {
    ...
};

だから私の質問は、2つのソースを切り替えると機能が確実に変わるのでしょうか?スクリプトがキャッシュされている場合でも?キャッシュバスティングクエリ文字列を追加したほうがいいでしょうか?または、このアイデアを完全に放棄して、スクリプトのソースを変更するのではなく、コールバックで関数を書き直すなど、別のことを行う必要がありますか?

このようなものに関する他の提案はありますか?

4

4 に答える 4

3

関数への参照を使用してみませんか?ここにいくつかの擬似コード:

function func1() { /* Do stuff one way */}
function func2() { /* Do stuff the other way */}
var ui = func1;

ui(some_param);

function myCallback() {
  // overwrite ui
  ui = func2;
  ui(some_param); // now calls func2
}

これは単純な例です。現実の世界では、オブジェクトを使用して関数をグループ化します。

たぶん、 injectのようなJavaScriptの依存性注入フレームワークを使用できます

于 2012-05-09T14:58:46.780 に答える
0

基本的に、あなたがやろうとしているのは悪い習慣です-あるバージョンのJSを別のバージョンで上書きしようとしています。そのようにしないでください。

関数のバージョンが2つある場合は、それらに異なる関数名を付け、変数をアクティブなものに設定してから、その変数を使用して次のように現在の関数を実行します。

function drawMethodOne() {}
function drawmethodTwo() {}
var currentDrawMethod = drawMethodOne;

次に、コードで次を使用しますcurrentDrawMethod

currentDrawMethod();

あなたの質問に対するより具体的な答えとして、javscriptは以前にロードされた関数定義をアンロードしません。既存の関数名を再定義するスクリプトをさらにロードすると、新しい関数がその既存の名前に割り当てられるだけで、前の関数のコードにアクセスできなくなります。したがって、その関数名を再定義する新しいjavascriptをロードすることで、以前の関数定義を置き換えることは可能ですが、これは一般的に悪い習慣であり、デバッグが非常に困難になる多くの状況を考えることができます。

于 2012-05-09T14:59:07.177 に答える
0

簡単なテストとして、Chromeは、ソースを変更するだけで2番目のスクリプトを読み込もうとしませんでした。新しいスクリプト要素を追加すると、2番目のjsファイルが取り込まれ、関数が上書きされたようです。2つの関数が変更されない場合は、それらをキャッシュして、必要な関数に「ui」変数を再割り当てすることをお勧めします。上記の悪い習慣のコメントに同意しますが、あなたのユースケースはわかりません。

于 2012-05-09T15:00:36.773 に答える
0

率直に言って、私はその振る舞いについて多くを語ることはできません-私が考える限り、それは単に予測不可能であり、実装に依存しています。より良いアイデアは、次のようなものを使用することです。

// usage: call skinHandler.setSkin({/* a skin object */)
// now having set the skin, call the skin's functions using skinHandler.skin.MyFunc();
app.skinHandler = function() {
    var oldSkin = null;
    this.skin = null;
    // call this after loading the skin object.
    this.setSkin = function(skin) {
        oldSkin = this.currentSkin;
        this.skin = skin;
    };
};

スキンオブジェクトは、UIに必要なすべてのコードで構成され、スキンごとに異なります。これを使用するには、各スキン/テーマファイルの機能を個別のオブジェクトにラップする必要があります。

于 2012-05-09T15:02:18.620 に答える