0

次のように、ページにjqueryオートコンプリートコンボボックスを取得しました。

$.widget( "ui.combobox", {
        _create: function() {
        ...
        var input = this.input = $( "<input>" )
                .insertAfter( select )
                .val( value )
                .autocomplete({
                    ...
                    select: function( event, ui ) {
                    ...
                    change: function( event, ui ) {
                    ...

$(function() {
    $("#myid").combobox();
}

onselectおよびchangeイベント ajax 呼び出しを実行し、非表示フィールドの情報を変更しますが、何かを入力し、テキスト フィールドのフォーカスを解除せずに[送信] ボタンをクリックすると問題が発生します -changeイベントがトリガーされず、サーバーで間違ったデータが取得されます (基本的には、 select-change で発生したイベントによって以前に設定された非表示フィールドのデータを取得しましたが、最新のものをキャッチしていません)。changeでは、フォームを送信する前にテキスト フィールドのフォーカス解除を実行してイベントをトリガーするにはどうすればよいでしょうか。または、テキストフィールドの最新の変更をキャッチしてトリガーする他の方法があるかもしれません(変更をonkeypressイベントで置き換える)?助けてくれてありがとう。

4

2 に答える 2

0

送信ボタンのデフォルトのアクションを無効にすることができます

$(".submit-btn").click(function(e){e.preventDefault();});

このようにして、送信ボタンはフォームを送信せず、フォームは選択または変更イベントを取得します。ユーザーは送信ボタンをクリックしてフォーカスを外します

于 2012-04-19T17:00:21.617 に答える
0

あなたができることは、変更イベントで隠しフィールドデータを取得するための関数を分離することです。また、データが更新された後に呼び出される関数へのパラメーターとしてコールバック関数を用意します。次に、変更イベント ハンドラーとフォームの送信ハンドラーで同じ関数を使用できます。送信ハンドラーでは、デフォルトの送信アクションを無効にし、その関数にコールバックを提供して、非表示フィールドでデータが更新されたときに JS を介してフォームを送信できるようにします。

上記の解決策は機能するはずですが、独自のサーバーからデータを取得して入力する場合は、クライアントで Javascript を使用してそれを行うべきではなく、サーバー側のコードでのみ行う必要があります。たとえば、非表示フィールドを使用してユーザーが入力した文字列 ("poland" など) をデータベース内の ID にマップし、その ID を非表示フィールドに格納する場合は、単に "poland" を文字列としてサーバーに送信し、このマッピングをサーバーで処理する必要があります。そうすれば、フォームはサーバーからこのマッピングを取得するのを待つ必要はありません。もちろん、これはAJAXリクエストをサーバーに送信している場合にのみ実行でき、サーバーからアクセスできない他のサーバーには送信できません。

于 2012-04-19T19:48:39.867 に答える