9

イベントが IE でユーザーによってトリガーされると、window.eventオブジェクトに設定されます。イベントをトリガーしたものを確認する唯一の方法は、window.eventオブジェクトにアクセスすることです(私の知る限り)

これにより、jQuery を介してイベントをトリガーする場合のように、イベントがプログラムによってトリガーされる場合、ASP.NET バリデーターで問題が発生します。この場合、window.eventオブジェクトは最後にユーザーがトリガーしたイベントを格納します。

ASP.NET バリデーターがアタッチされているテキスト ボックスに対してプログラムによってonchangeイベントが発生すると、バリデーターの対象となる要素ではなく、最後のイベントを発生させた要素が参照されるため、検証が中断されます。

誰もこれを回避する方法を知っていますか? 解決可能な問題のように見えますが、オンラインで見ると、ほとんどの人は問題を解決するのではなく、問題を無視する方法を見つけているだけです。


私が具体的に何をしているのかを説明するには
、2 つの ASP.NET バリデーターが関連付けられているテキスト ボックスで jQuery タイム ピッカー プラグインを使用しています。時間が変更されると、更新パネルを使用してサーバーにポストバックし、いくつかのことを動的に行うため、そのテキスト ボックスのポストバックをトリガーするために onchange イベントを発生させる必要があります。

jQuery タイム ピッカーは、テキスト ボックスがクリックされたときに表示される非表示の順序付けられていないリストを作成することによって動作します。リスト項目の 1 つがクリックされると、jQuery のchange()メソッドを介して、プログラムによってテキスト ボックスの「変更」イベントが発生します。

イベントのトリガーはリスト アイテムだったので、IE はリスト アイテムをテキスト ボックスではなく、イベントのソースとして認識します。

テキスト ボックスが変更されるとすぐにこの ASP.NET バリデーターが機能することにはあまり関心がありませんchange。テキスト ボックスに対してポストバック イベントが呼び出されるように、" " イベントを処理する必要があるだけです。問題は、バリデーターが IE で例外をスローし、イベントのトリガーを停止することです。

Firefox (および他のブラウザーも想定しています) には、この問題はありません。イベント モデルが異なるため、IE のみ。誰かがこれに遭遇し、それを修正する方法を見ましたか?


この問題が他のいくつかの場所で報告されていることがわかりましたが、解決策はありません。

4

6 に答える 6

7

私も同じ問題を抱えていました。この関数を使用して解決:

jQuery.fn.extend({
    fire: function(evttype){ 
        el = this.get(0);
        if (document.createEvent) {
            var evt = document.createEvent('HTMLEvents'); 
            evt.initEvent(evttype, false, false); 
            el.dispatchEvent(evt); 
        } else if (document.createEventObject) { 
            el.fireEvent('on' + evttype); 
        }
        return this;
    }
});

したがって、datepicker への「onSelect」イベント ハンドラは次のようになります。

if ($.browser.msie) {
    datepickerOptions = $.extend(datepickerOptions, { 
        onSelect: function(){
            $(this).fire("change").blur();
        }
    });
}
于 2008-12-16T14:09:34.060 に答える
4

パッチで問題を解決しました:

    window.ValidatorHookupEvent = function(control, eventType, body) {
        $(control).bind(eventType.slice(2), new Function("event", body));
    };

更新:問題を MS に送信しました (リンク)。

于 2012-01-24T20:48:04.120 に答える
2

これは、jQuery の日付ピッカーと ASP 検証コントロールに固有の問題です。あなたが言っているように、間違った要素が ASP NET JavaScript 検証ルーチンをクロストリガーし、ルーチンのトリガー要素が定義されていないため、M$ コードがエラーをスローします。

私はこれを私が見た他の誰とも違った方法で解決しました - M$ は彼らのコードをより堅牢に書くべきだったと判断し、未定義の要素に対処するために M$ バリデータ コードの一部を再宣言しました。私が見た他のすべては、本質的にjQuery側の回避策であり、可能な機能を切り取っています(たとえば、変更の代わりにクリックイベントを使用しています)。

失敗するビットは

   for (i = 0; i < vals.length; i++) {
        ValidatorValidate(vals[i], null, event);
    }

未定義の「vals」の長さを取得しようとすると、エラーがスローされます。

ちょうど追加しました

if (vals) {
    for (i = 0; i < vals.length; i++) {
        ValidatorValidate(vals[i], null, event);
    }
}

そして彼女は行く準備ができています。問題のある関数全体を再宣言する最終的なコードを以下に示します。マスターページまたはページの下部にスクリプトインクルードとして配置します。

はい、M$ が将来バリデータ コードを変更することを決定した場合、これは上位互換性を壊します。しかし、彼らがそれを修正してくれれば、このパッチを完全に取り除くことができるでしょう。

//  Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix
 function ValidatorOnChange(event) {
    if (!event) {
        event = window.event;
    }
    Page_InvalidControlToBeFocused = null;
    var targetedControl;
    if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {
        targetedControl = event.srcElement;
    }
    else {
        targetedControl = event.target;
    }
    var vals;
    if (typeof (targetedControl.Validators) != "undefined") {
        vals = targetedControl.Validators;
    }
    else {
        if (targetedControl.tagName.toLowerCase() == "label") {
            targetedControl = document.getElementById(targetedControl.htmlFor);
            vals = targetedControl.Validators;
        }
    }
    var i;
    if (vals) {
        for (i = 0; i < vals.length; i++) {
            ValidatorValidate(vals[i], null, event);
        }
    }
    ValidatorUpdateIsValid();
}
于 2010-05-25T13:46:26.917 に答える
2

JavaScript でイベントを開始する前に、隠しフィールド _EVENTTARGET 値を設定することを検討してください。サーバーがそれを理解するには、サーバー側の ID に設定する必要があります (クライアント ID のアンダースコアを $ に置き換えます)。ボタンのクリックをシミュレートして、結果が返されたときにどの OnClick メソッドを起動するかをサーバー側で決定できるようにします。Ajax かどうかは問題ではありません。

于 2008-10-05T12:54:37.110 に答える
2

あなたが説明していることから、この問題は、IE が JS に使用する独自のイベント バブリング モデルの結果である可能性があります。

私の唯一の本当の答えは、ASP.NET バリデーターを捨てて、代わりに jQuery フォーム検証プラグインを使用することです。次に、テキストボックスを通常の ASP Webforms コントロールにすることができ、コンテンツが変更されてポストバックが発生すると、すべて問題ありません。さらに、クライアント側の問題をサーバー コードから分離しておくことができます。

Webform Client コントロール (Form Validation コントロールなど) と jQuery などの外部 JS ライブラリを混在させることは、あまりうまくいきませんでした。より良いルートは、どちらか一方を使用することであり、混ぜ合わせないことであることがわかりました。

おそらくあなたが探している答えではありません。

jQuery フォーム検証プラグインを使用する場合は、このjQuery Form Validationを検討してください

于 2008-10-03T23:57:04.840 に答える
0

これが私が同様の問題を解決した方法です。日付ピッカーのonSelect()ハンドラーを作成しました。 リンクテキスト その関数では、__ doPostBack('textboxcontrolid'、'')と呼ばれます。これにより、テキストボックスのサーバーへの部分的なポストバックがトリガーされ、サーバーはバリデーターを順番に呼び出しました。

于 2008-11-29T12:11:33.900 に答える