2

わかりました、より明確になると思うので、投稿を再編集しています。

グリッドビューなどを含む ASP.net ページがあります。

グリッドビューの結果行には、クリックするとモーダル ポップアップ ウィンドウ (基本的にはクリック時に表示される非表示の div) が開くイメージがあります。

そのモーダルは、表示されるように、2 列のテーブル、列 1 はテキスト行のみ、列 2 は空のドロップダウン リストとチェック ボックスの組み合わせを持つ ajax/json によって動的に読み込まれます。(これらはすべて、メイン ページの読み込み後に DOM に追加されます。 )。

ユーザーがクリックしたときに ajax/json を介して利用可能なチェックリストを設定しようとしていますが、これは最初のクリックでのみ発生し、ユーザーがその後そのドロップダウンを何回クリックしても (焦点が外れて戻った後)同じことが繰り返されるのを見たくありません。

ドロップダウンがクリックされたとき、つまりドロップダウンが入力されたときに現在機能するコードは次のとおりです。問題は、フォーカスを失ってからドロップダウンを再度クリックすると、次の重複したリストが再入力されることです。

<code> 
    $('#FSSiteName').live('focus', function () {
        var $this = $(this);
        getFSSites();
        //i thought the below line would stop it happening again when i click on the dropdown
    $this.unbind('focus');
});

 function getFSSites() {
            var ddSites = $("#FSSiteName");
            $.ajax({
                type: "POST",
                url: "Circuits_OrderManagementTracker.aspx/getTheSitesList",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    var xmlDoc = $.parseXML(response.d);
                    var xml = $(xmlDoc);
                    var FSSitesReturned = xml.find("Table");

                    $.each(FSSitesReturned, function (index, FSSitesReturned) {
                        dbname = $(this).find("SiteNames").text()
                        ddSites.append('<option>' + dbname + '</option>');
                    });
                },
                failure: function (msg) {
                    alert(msg);
                }
            });
        }
</code>

私はあなたの善意による提案で以下のコードに変更しましたが、以下を行うとドロップダウンリストが読み込まれなくなり、同じ効果をもたらす .one() も試しました。

<code>
         $('#FSSiteName').on('click', function () {
            var $this = $(this);
            //run your alert here if it´s necessary
            //alert('Focused for the first time :)');
            getFSSites();
            //unbind the event to prevent it from being triggered again
            $this.off('click');
         });
</code>

これが、助けたい人にとって少し明確になることを願っています。

4

4 に答える 4

1

live()isの反対ですdie()が、どちらも deprecatedon()です。代わりにandを使用する必要がありoffます。

于 2013-03-19T19:41:02.750 に答える
1

オンにもオフにも使いやすいです。

on() -> イベント ハンドラを追加する off() -> イベント ハンドラを削除する

$("#item li").on('click', function () {
    $(this).text('ITEM CLICKED')
    alert('CLICKED');

    //remove the event
    $(this).off("click")
});

この例を参照してください: http://jsfiddle.net/jMxxa/

オンとオフの Jquery ドキュメント:

オン: http://api.jquery.com/on/ オフ: http://api.jquery.com/off/

于 2013-03-19T20:31:16.183 に答える
0

.live() の代わりに .one を使用するという Varnie のコメントに同意します。

$('#FSSiteName').one('focus', function () {
        getFSSites();
 });

Live() は、DOM に動的に追加される要素で使用することを目的としています。ページがブラウザに最初に読み込まれたときに存在しない要素。要素にはクラス セレクターではなく id セレクターがあるため、.live()/.on() を使用する必要はまったくないと想定しています。

于 2013-03-19T19:45:00.850 に答える
0

こんにちは皆さん、ご協力ありがとうございます。これは、学習者として知っている最高のサイトの 1 つです。

私はトリックを行うように思われる解決策を自分で入れましたが、コーディングが初めてなので、理想的ではないことをして、より簡単な解決策があればフィードバックをいただければ幸いです。

上記をより明確にするためにOPを再編集しましたが、それでも有効ですが、コードの一部を変更して、ドロップダウンが空であるかどうかを確認するだけで、正常に機能します。

<code>
         $('#FSSiteName').live('click', function () {
             var $this = $(this);
             //Check if the dropdown has any options and if no add some
             if ($this.find('option').length <= 1) {
                 getFSSites();
             }
             else {
                //Do Nothing!!
             }            
         });

</code>
于 2013-03-20T10:26:21.347 に答える