1

jQuery を使用して問題が発生し、その修正方法がわからない場合。簡単に言うと、次のものが得られました。

var overlay;

if(condition == "test") {
    overlay = $("<div></div>");
}
else if (condition == "test2") {
    console.log("first-log");
    overlay = $("<span></span>");
}

console.log("second-log");
overlay.prependTo("body");

条件が「if」に一致する場合、すべてが正常に機能し、オーバーレイがコンテンツで満たされ、本文の前に追加されます。

条件は「else if」に一致しますが、オーバーレイが定義されていないというエラーが表示されます。

だから私は自分のコードが何をしているのかを見るためにいくつかの console.log() を入れました。両方の console.log アクションが発生しますが、私のブラウザー コンソールでは、最初に「second-log」が表示され、その後に「first-log」が表示されます。

私のコードは、条件が一致していても、「if / else if」が終了する前に追加しようとしています。

答えを探してみましたが、何も見つからなかったので、ここの誰かが私を助けてくれることを願っています. ありがとう!

私のコードのjsfiddle

4

4 に答える 4

0

プログラムの開始時に var オーバーレイを初期化する必要があります。

于 2013-12-10T08:56:52.703 に答える
0

問題の鍵は、jsfiddle コードによる更新にあります。あなたのjsfiddleリンクに基づいて、次の基本構造を持っているようです:

if (resource=="iframe") {
  console.log("resource is iframe");

} else if (resource=="json") {
    $.getJSON("someUrl", function(data) {
        console.log("resource is json");
    });
}

console.log("at the end - one of the above log statements should be hit");

ただし、質問のために単純化しようとした問題は、処理のケースresource=="json"がヒットしていないことだと思います。

これはおそらく、getJSON への呼び出しが非同期で実行されているためです。その if ブロック内の関数は、予想されるときにインラインで実行されていませんが、後で getJSON 呼び出しに結果があり、残りの外部関数の実行が終了した後です。

これを修正する 1 つの方法は、コールバックを使用して構造を変更し ( Igle の answerに似ています)、処理コードが後で実行されないようにすることです。

function executeAfterIf() {
    console.log("at the end - one of the above log statements should be hit");
}

if (resource=="iframe") {
  console.log("resource is iframe");
  executeAfterIf();

} else if (resource=="json") {
    $.getJSON("someUrl", function(data) {
        console.log("resource is json");
        executeAfterIf();
    });
}

この基本的なリファクタリングでexecuteAfterIfは、 if ブロックのいずれかのケースが処理された後にコールバック関数が呼び出されます。

もちろん、このようなことを処理するパターンは他にもあります。どちらを選択するかは、プロジェクトの残りのコードによって異なります。

于 2013-12-10T16:47:43.120 に答える