2009-06-20 16 views
4

JQuery用のJEditableプラグインを使用していましたが、プラグインにエラーを返して以前の値に戻し、エラーを表示するようにしたいと考えています。私はこれを同期ajax呼び出しを使用して作業しているが、代わりに非同期コールバックを使用することをお勧めします。私が遠くに持っているコードは以下の通りです。Jeditable非同期復帰時のエラー

$("#editbox").editable(submitEdit, { 
    indicator : "Saving...", 
    tooltip : "Click to edit...", 
    name : "Editable.EmailAddress", 
    id : "elementid", 
    type : "text", 
    submit : "<span class=\"mini_button\">Ok</span>", 
    cssclass : "edit_text" 
}); 
function submitEdit(value, settings) 
{ 
    var edits = new Object(); 
    var origvalue = this.revert; 
    var textbox = this; 
    edits[settings.name] = [value]; 
    var returned = $.ajax({ 
         url: "http://someurl.com/edit/", 
         type: "POST", 
         /*async: false,*/ 
         data : edits, 
         dataType : "json", 
         complete : function (XMLHttpRequest, textStatus) 
            { 
             alert("Setting back to original value " +origvalue); 
             $(textbox).html(origvalue); 
            } 
        }); 

     /*var response = $.secureEvalJSON(returned.responseText); 
     if (response.errorMsg != '') 
     {  
      $("#ajaxNotify").addClass("ajax_error").html(response.errorMsg); 
      return(this.revert);      
     }*/ 
     return(value); 
} 

私は、よく動作するコメントに私の同期実装を含めました。サーバーの負荷が高い状況では、編集がバックエンドで終了するまでブラウザをロックします。 IDはむしろ値を返し、編集が失敗した場合は後で戻します。

おかげで、

EDIT

は、ジッタの提案をしようと、それはIE8で働いて取得した後、私はボタンのみをクリックすると、問題はFFとクロムと気づきました。フィールドをクリックして編集してEnterキーを押すとすべてが正常です。コールバックが発生し、値がリセットされます。

フィールドをクリックして編集し、[OK]ボタンをクリックしても、検証エラーが表示されない場合、フォームはアクティブのままで、そこにのみ置かれます。その部分が実行されるエラーが受信された場合、テキスト値は元に戻されますが、そのフィールドを再度クリックすることはできません.jeditableはアンバインドされているようです。

ポストとレスポンスがファイアバグで受信されているため、ajaxが発砲していることが確認できます。

{「errorMsg内容」:「」}

私は、[OK]ボタンをクリックすると、入力しなく押した場合は、なぜこの作品は、すべてのブラウザで完璧ですか?どちらの方法でも同じコードが実行され、ボタンがフォームを正しく送信しています。

アンバインドされているものは、ボタンを押しただけでも発生します。

誰もjeditableを使用してこれらのようなサーバー側の検証の問題を処理する例はありますか?

答えて

5

これは機能しません。

... 
complete : function (xhr, textStatus) { 
    $.secureEvalJSON(xhr.responseText); 
    if (response.errorMsg != '') { 
    $("#ajaxNotify").addClass("ajax_error").html(response.errorMsg); 
    alert("Setting back to original value " +origvalue); 
    $(textbox).html(origvalue); 
    } 
} 
... 
+1

私はその解決策を5回試してみましたが、今は動作しませんでした。私がFireBugのコールバックの最後の行にブレークポイントを置くと、それが詰まるようです。デバッグしようとして私はそれを壊した!私は何が起こっていたのか分からなかった。ああ、私のばかげたことを指摘してくれてありがとう。 – madcapnmckay

+0

@madcapnmckayはあなたが「heisenbug」と呼ぶものですか?ところで、素晴らしい情報;-) –

0

ジッタ可能なエラー機能を検討することもできます。

... 
onerror: function(settings, original, xhr) { 
    $.secureEvalJSON(xhr.responseText); 
    if (response.errorMsg != '') { 
    var origvalue = ...; 
    $("#ajaxNotify").addClass("ajax_error").html(response.errorMsg); 
    console.log("Setting back to original value " + origvalue); 
    $(original).html(origvalue); 
    } 
} 
...