0

キャンパス内の特定の場所で許可されているアイテムを追跡するフォームがあります。ラジオ ボタン グループは、問題の領域が物理的な部屋であるか、より一般的な「プロジェクト」であるかを制御します。いずれも、データベースの同じフィールドに値が入力されています。

部屋とプロジェクトは別々のテーブルに保存されます。ここで jQuery UI のオートコンプリートを利用したいと思います。これまでのところ、ラジオ グループの変更イベントは、部屋とプロジェクトの適切なテキストを切り替え、クラス「roomAC」を切り替えます。「roomAC」クラスは、オートコンプリートのセレクターです。

クラスを削除すると、オートコンプリートが機能しなくなると思いましたが、機能します。これは、イベントがまだ DOM 要素にバインドされているためです。私が知りたいのは、オートコンプリート イベントをバインド/バインド解除する方法があるかどうかです。または、if ステートメント (ラジオ グループ) 内でイベント ハンドラーを再作成するのに行き詰まっていますか?

私のJS

//ROOM FIELD JQUERY-UI AUTO-COMPLETE
$(".roomAC").autocomplete({
    source: "autocomplete.cfm",
    minLength: 4
});

tl;dr

jQuery UI オートコンプリート イベントをバインドおよびバインド解除するにはどうすればよいですか?

4

1 に答える 1

0

オートコンプリートコントロールのバインド解除に関する質問については、オートコンプリートコントロールを無効にするか、.autocomplete( "option" , optionName , [value] )構文を使用してソースを変更できます。

しかし、私があなたの状況を正しく理解していれば、あなたは実際に検索語とソース識別子の両方を送信したいと思うでしょう。これは、(オートコンプリートオプションで)ソースとしてコールバックを使用することで実現できます。ドキュメントによると:

3番目のバリエーションであるコールバックは最も柔軟性があり、任意のデータソースをオートコンプリートに接続するために使用できます。コールバックは2つの引数を取得します。

「term」と呼ばれる単一のプロパティを持つリクエストオブジェクト。これは、現在テキスト入力にある値を参照します。たとえば、ユーザーが都市フィールドに「new yo」と入力した場合、オートコンプリートの用語は「newyo」と等しくなります。

応答コールバック。単一の引数に、ユーザーに提案するデータが含まれていることを期待します。このデータは、指定された用語に基づいてフィルタリングする必要があり、単純なローカルデータ(ラベル/値/両方のプロパティを持つString-ArrayまたはObject-Array)の場合は上記の任意の形式にすることができます。リクエスト中のエラーを処理するカスタムソースコールバックを提供する場合は重要です。エラーが発生した場合でも、常に応答コールバックを呼び出す必要があります。これにより、ウィジェットが常に正しい状態になります。

これは、jQueryUIオートコンプリートで使用した関数です。

function initSuggest(){
    var cache = {},
        lastXhr;
    $( ".Mjesto" ).each( function() {
        $( this ).autocomplete( {
            minLength: 2,
            source: function( request, response ) {
                var sourceId = $("#DrzavaId option:selected").text();
                var term = request.term;
                if ( term in cache ) {
                    response( cache[term] );
                } else {
                    try {
                        lastXhr = $.getJSON( "autocomplete2.cfm", { c: sourceId, t: term }, 
                            function( data, status, xhr ) {
                                cache[term] = data;
                                if ( xhr === lastXhr ) {
                                response( data );
                            }
                        });
                    } catch( ex ) {
                        response( null );
                    }
                }
            },
            autoFocus: true
        } );
    } );
}

この関数は応答もキャッシュします。それを無視すると、トリックはtry/catchブロック内にあります。

于 2012-09-18T19:56:21.493 に答える