4

我一直在使用 JQuery 的 JEditable 插件,我想向插件返回错误以指示它恢复到以前的值并向用户显示错误。我使用同步 ajax 调用来工作,但我更喜欢使用异步回调。我必须到目前为止的代码如下。

$("#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);
 }

我还在评论中包含了我的同步实现,效果很好。在服务器负载较高的情况下,这将锁定浏览器,直到后端编辑完成。如果编辑失败,我宁愿返回值并在稍后恢复它。

谢谢,

编辑

在尝试了 jitters 建议并让它在 IE8 中运行后,我意识到问题出在 FF 和 chrome 上,仅当我单击按钮。如果我单击该字段,编辑然后按 Enter 一切都很好。回调触发并且值被重置。

如果我单击该字段,编辑然后单击确定按钮并且不接收和验证错误,则表单将保持活动状态并坐在那里。如果收到该部分执行的错误,则文本值将恢复为原始值,但是我无法再次单击该字段,似乎 jeditable 已解除绑定。

我可以确认在 firebug 中收到了帖子和响应,因此 ajax 正在触发。

{"errorMsg":""}

如果我按下回车键,为什么这在所有浏览器中都能完美运行,但如果我单击确定按钮则不行?无论哪种方式都执行相同的代码,并且按钮肯定会正确提交表单。

解除绑定的事情也只发生在按下按钮时。

有没有人有任何使用 jeditable 和处理诸如此类的服务器端验证问题的示例?

4

2 回答 2

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);
  }
}
...
于 2009-06-20T12:12:24.567 回答
0

还有另一种方式,可以考虑 jeditable onerror 函数。

...
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);
  }
}
...
于 2011-08-09T17:44:27.443 回答