0

奇妙なjQueryの問題があります。文字列をパラメーターとして受け入れる関数を作成し、その文字列を jQuery セレクターにフィードしています。

関数は次のとおりです。

function myFunction(specialfields) {
   if(!$(specialfields).is(':focus')) {
       alert('thats not in focus');
   }
 }

ただし、次のエラーが発生し続けます。

 Uncaught Syntax error, unrecognized expression: focus 

ただし、奇妙なのは、パラメーターを受け入れない場合に '.is(':focus') ' が他の領域で機能することです。これを渡すと、次のようになります。

 $(specialfields)

有効なオブジェクトとして読み取ります。次のような文字列を渡そうとしています:

#id1, #id2

さらに、これは機能します:

$(specialfields).val()

ここで何が起こっているのか誰にも分かりますか?

4

3 に答える 3

1

さて、問題は、2つのパラメーターを「特殊フィールド」に渡していたという事実であると思います。これは、明らかに2つのフィールドに同時にフォーカスを設定できないため、「:focus」セレクターを壊しました。

関数にセレクターを1つ渡すだけで修正できます。

于 2013-01-17T19:39:11.140 に答える
1

結論

あなたの方法はずっとうまくいき、私の時間の無駄な代替手段よりも速く機能します.


詳細

関数の定義を少し変えalert()て、応答を に渡すことで機能を置き換えました<p id="response">

HTML:

<input type="text" name="id1" id="id1" />
<br />
<input type="text" name="id2" id="id2" />
<br />
<p id="response">response</p>

JavaScript:

var myFunction = function (specialfields) {
  if ($(specialfields + ':focus').length === 0) {
    $('#response').text(specialfields + ' is not in focus');
  } else {
    $('#response').text(specialfields + ' is in focus');
  }
};

実際の例については、 http://jsfiddle.net/jhfrench/UufWD/を参照してください。

:focuswithの渡されたパラメーターを評価していることに気付くでしょうif ($(specialfields + ':focus').length === 0)

この方が早いと思っていたのですが、そうでもありません

プラス面として、このメソッドは複数のセレクター引数を処理します ( など。 http://jsfiddle.net/jhfrench/UufWD/19/#id1, #id2')を参照)。しかし、あなたの元の評価の方が優れています。if(!$(specialfields).is(':focus'))


アプローチの実際の例については、http://jsfiddle.net/jhfrench/UufWD/14/を参照してください。

于 2013-01-17T19:52:52.173 に答える
0
I think .focus() should be enough, as :focus is not a selector.

ネイティブ ソリューションはありませんが、よりエレガントな方法があります。

jQuery.extend(jQuery.expr[':'], {
  focus: "a == document.activeElement"
});

新しいセレクターを定義しています。プラグイン/オーサリングを参照してください。次に、次のことができます。

if ($("...").is(":focus")) {
  ...
}

ソース -- JavaScript (または jQuery) に「フォーカスあり」はありますか?

于 2013-01-17T19:26:13.637 に答える