2

私はこのコードを持っています:

function beforemouseout() {
  if ($(this).val() == '') {
    $(this).val($(this).attr('title'));

  } 
  else {

  }
  setTimeout('beforemouseout()',3000); 
}
$(".other").click(function() {
  $(this).val('');  
  $(".other").mouseout(beforemouseout);
});
<input id="hour" type="text" class="other" autocomplete="off" value="hour" title="hour" />
<input id="hour" type="text" class="other" autocomplete="off" value="minutes" title="minutes" />

しかし、Firebug はエラーを出します: beforemouseout が定義されていません。なんで?jsfiddle.netで試してみましたが、エラーは発生しませんでしたが、結果は期待したものではありません.#hourをクリックしてテキストを非表示にし、onmouseoutがトリガーされて5秒待ってから-にチェックを行う

4

3 に答える 3

2

次のように setTimeout を変更します。

setTimeout(beforemouseout ,3000); 

beforemouseoutそれ以外の場合は、グローバルコンテキストで探しており、コードがそこにない場合 (任意の種類の別のクロージャーの内部/スコープにある場合)、それは見つかりません。readyここでは、ハンドラーのすぐ横に HTML を投稿しているため、つまりスニペットを取得しているため、ハンドラーにあると推測しています。

全体的な観点から、文字列を決して渡さないでください。setTimeout()またはsetInterval()、それを回避できる場合でも、多くの望ましくない副作用が発生します...このような. 代わりに、上記のように直接参照を渡して、完全に明示的かつ適切に...機能させます:)


編集(質問のコメント用):実際に書かれているものとはまだ少し異なっているようです。私が収集したものから、デフォルト値を に復元する前に遅延したいと考えています<input>。これを行うにはいくつかの方法があります。

function beforemouseout() {
  if ($(this).val() == '') {
    $(this).val($(this).attr('title'));
  }
}
$(".other").click(function() {
  $(this).val('').mouseout(function() {
    setTimeout($.proxy(beforemouseout, this), 3000);
  });
});

ここで試してみることができます。</p>

于 2010-07-25T13:03:33.660 に答える
0

はい、setTimeout 関数のパラメーターとして文字列を渡さないでください。ちなみに、ここでは setTimeout は必要ないと思います。マウスを離しているときに毎回フィールドが空である場合、フィールドに「タイトル」を入力しています。setTimeout と mouseout の両方を一緒に使用すると、関数の呼び出しが指数関数的に増加します。私の見解を理解していると思います。
ありがとう

于 2010-07-25T13:01:01.250 に答える
0

これに変更$(".other").mouseout(beforemouseout);します。

$(".other").mouseout(function(){ 
  beforemouseout();
});
于 2010-07-25T13:06:30.940 に答える