私は何時間も手がかりの可能性を探していましたが、空白になったので、あなたの偉大な知恵で手を貸してください...
フォームがあり、そのフォーム内に選択ツールと呼ばれるフィールドがあり、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()
ですか?