0

私は何時間も手がかりの可能性を探していましたが、空白になったので、あなたの偉大な知恵で手を貸してください...

フォームがあり、そのフォーム内に選択ツールと呼ばれるフィールドがあり、2 つの部分で構成されています。わかりやすいラベルを表示するフィールドと、選択した ID を格納する隠しフィールドです。次のようになります。

<input type="hidden" name="selector" id="selector" value="" />
<input type="text" readonly="readonly" id="selector_label" value="" />
<a.... link to selection tool .... />

選択ツールは実際には重要な iframe で開きますが、心配しないでください。XSS エラーはありません。ユーザーがツールでレコードをクリックすると、そのリモート ページは次を呼び出します。

$('#selector_label',window.parent.document).val(label);
$('#selector',window.parent.document).val(selected).change();
...script to close iframe...

ご覧のとおり、フォームを直接更新し、非表示部分の値を更新する 2 番目のステートメントは、.change()リスナーをトリガーするために呼び出すことで終了します。最後に、それ自体を閉じます。

これをより複雑にするために、次のようにフィールドに割り当てられたリスナーがあります。

$('#selector').on('blur change', function() {
    ... script to update a related field ...
});

これは実際には動的スクリプトであり、さまざまな理由blurで使用されている多くのフィールドに割り当てられていることに注意してください。.each()なんらかの干渉があるとあなたが言う場合に備えて、私はそれを含めています.

したがって、セレクター ツールはうまく機能し、ラベル フィールドと非表示フィールドの両方を更新しますが、動的に割り当てたリスナーが起動しないため、関連するフィールドは新しく変更された#selectorフィールドの値を取得しません。

.change()リスナーがプログラムで発生したイベントを検出しない理由はありますか? ご協力いただきありがとうございます。

- - - 編集 - - -

.on()の代わりに使用するコメントの提案に従って更新されましたが.bind()、残念ながら変更はありません。

参考までに、この「相対」イベントを使用して更新する同じ形式の他のフィールドがあり、正常に機能するため、これは他のフィールドで機能することを知っています。重要な違いと考えられる原因は、非表示フィールドではなく、表示および編集可能なテキスト フィールドを使用していることです。

----- 編集 2 -----

テスト目的で、非表示フィールドを読み取り専用の表示フィールドに変更しましたが、最初は効果がなく、セレクターは引き続き機能しましたが、割り当てられたイベントは機能しませんでした。ただし、興味深い癖の 1 つは、その (以前は非表示だった) フィールドをクリックしてから、別の場所でblurイベント状態をトリガーすると、割り当てられたイベント リスナーが起動し、相対を更新することです。では、プログラムでイベントを発生させるように指示したときではなく、フィールドとやり取りしたときにのみイベントが発生するのはなぜ.change()ですか?

4

1 に答える 1

0

コメントで提案したように、おそらく解決策は .bind() の代わりに .on() を使用してイベントを添付することです。jQuery Web サイトから:

.on() メソッドは、jQuery オブジェクトで現在選択されている要素のセットにイベント ハンドラーをアタッチします。jQuery 1.7 以降、.on() メソッドは、イベント ハンドラーをアタッチするために必要なすべての機能を提供します。古い jQuery イベント メソッドからの変換については、.bind()、.delegate()、および .live() を参照してください。.on() でバインドされたイベントを削除するには、.off() を参照してください。1 回だけ実行されてから削除されるイベントをアタッチするには、.one() を参照してください。

于 2013-04-25T15:41:24.007 に答える