2

私がやっただけではchangeImage();うまくいきますが、どうやって仕事に取り掛かるのかわかりませんsetInterval()。これが私のコードです:

HTML:

<div id="coin1"></div>

JS:

$(document).ready(function() {
  function changeImage() {
    if ($("#coin1").css("display") == "none") {  
      $("#coin1").fadeIn("slow");
    } else {  
      $("#coin1").fadeOut("slow");
    }
  };
  
  setInterval("changeImage()", 2000);
});
4

2 に答える 2

4

changeImage()内で定義しているため$(document).ready()、グローバルに定義されていないため、setIntervalによって呼び出されません。代わりに関数の名前を使用してください。つまり、次のようになります。

setInterval(changeImage, 2000);

お役に立てれば。

于 2010-01-15T17:22:10.793 に答える
1

明確にするために、受け入れられた答えは正しいコードを示していますが、説明が正しくないため、問題は次のとおりではありません。

...あなたはchangeImage()内で定義しています$(document).ready()...

のスコープ内で関数を定義することはまったく問題ありません$(document).ready()

問題は、コールバックとして使用される関数の代わりにsetInterval("changeImage()", 2000);、最初のパラメーターとして文字列を渡すことです。setInterval()受け入れられた回答のコード(説明ではありません)によると、適切な使用方法setInterval()はのようsetInterval(changeImage, 2000);です。ここでは括弧が使用されていないことに注意してください。これは、関数が呼び出されたときに関数から返されるものではなく、関数自体をパラメーターとして渡したいためです。

使用しているコードをスコープ外に移動したときに機能する唯一の理由は、文字列を渡すと、インタープリターが文字列に対して$(document).ready()強制的に実行され、グローバルスコープで発生するためです。eval()eval()

したがって、ソリューションを文字列で機能させることは可能ですが、コーディングは適切ではありません。のドキュメントによるとsetInterval()

オプションの構文を使用すると、遅延ミリ秒ごとにコンパイルおよび実行される関数の代わりに文字列を含めることができます。この構文は、セキュリティリスクを使用するのと同じ理由で推奨されません。eval()

于 2020-10-30T13:56:36.103 に答える