1

私はWeb開発にかなり慣れていないので、ASP.NETでMVCを使用していて、jQueryとその関数に苦労しています。RazorViewEngineとASP.NETMVCc#をdevexpressコントロールとともに使用しています。

今これが私の問題です:

@ Html.Action('view'、'controller');を持つビューを取得しました。グリッドビューにリンクするものを宣言しました。

そのグリッドビューで、行が選択され、キーボードでEnterキーが押されたときに、詳細ビューを表示するクライアントサイド関数をいくつか取得しました。

現在、私が使用しているグリッドビューには、テキストフィールドをクリックし、探しているものを入力してEnterキーを押すことにより、いくつかの自動検索オプションがあります。行を検索または選択してEnterキーを押すと、値を保持する値を宣言しました。

その後、検索テキストフィールドでEnterキーを押しても、詳細ビューが開かないようになりました。ただし、検索時にコールバックを実行します。グリッドビューが新しく作成されます。GridViewでのこのコールバックの後、関数が要素を検出しなくなるという問題が発生しました。

jqueryで.find関数を使用してみましたが、役に立ちませんでした。これが私が試したいくつかのスニペットです:

(これらは$(document).ready関数にあります)

 $('#id').click(function () {
    // do something
 });

そして.findバージョン:

 $('#gridview').find('#id').click(function () {
    // do  something
});

したがって、基本的には、グリッドビューが再構築された後に要素を見つけられるようにしたいと思います。

::編集::textfields.clickのIDは同じままです。

:: EDIT2 :: devexpressグリッドビューのEndCallbackclientsideevent内に現在のコードを追加することで、安価で汚い解決策を見つけました。しかし、これを行うにはまともな方法が必要です...しかし、これは、IDが同じままである私の以前の編集も証明しています。

4

3 に答える 3

2

.click()一連の要素を含む jQuery オブジェクトで、イベント ハンドラをバインドする関数 ( など) を呼び出すと、イベント ハンドラはそれらの要素だけにバインドされます。それ以降に作成され、セレクターに一致する要素には適用されません。これらの要素を置き換えると、新しい要素が同じidであっても、イベント ハンドラーは一緒に消えます。ただし、これには解決策があり、イベント委任と呼ばれます。

基本的な原則は、イベントハンドラーを、イベントをトリガーするすべての要素を含む、置き換えられない要素にバインドし、イベントタイプ、トリガーする要素に一致するセレクターを渡すことです。そのイベント タイプの関数、および実行する関数。jQuery 1.7 以降では、.on()関数のバリエーションの 1 つを使用してこれを実現します。

$('#gridview').on('click', '#id', function(e) {
    // do something when the element with an id of 'id' is clicked on
});

あなたの#gridview要素が決して置き換えられないと仮定したことに注意してください。そうである場合は、その要素を含む、参照できる別の要素を選択します#gridview。他のすべてが失敗した場合は、documentそれ自体で呼び出すことができます。

詳細については、jQuery ドキュメントのDirect and delegated events.on()セクションを参照してください。

1.7 より前のバージョンの jQuery をまだ使用している場合は、.delegate()代わりに関数を使用する必要があります。同じように動作しますが、最初の 2 つの引数 (イベント タイプとセレクター) が入れ替わっています。

$('#gridview').delegate('#id', 'click', function(e) {
    // do something when the element with an id of 'id' is clicked on
});
于 2012-09-19T10:06:50.670 に答える
0

グリッド ビューの再レンダリングは ajax を介して行われると仮定します。そうしないと、jquery は引き続き機能します。これらの要素 (id) が DOM から削除された場合、バインディングは失われます。グリッドビューを再ロードする関数にクリック イベントを追加する必要があります。バインディングを関数に入れ、何かが再ロードされたときにこの関数を呼び出すことができます:

function BindGridView(){

$('#id').die().click(function () {
    // do  something
});

}

そして、グリッドビューがレンダリングされている場所で、この再バインド関数を呼び出します

$.ajax({
        cache: true,
        type: 'post',
        url: "/view/RenderGridView",
        success: function (msg) {

            //render grid view then re-bind
            BindGridView();


        }
    });

別のクリックイベントの結果にクリックイベントをバインドすることもできます

于 2012-09-19T10:10:03.877 に答える