JEdi​​table,如何处理JSON响应?

Sam*_*m3k 15 javascript jquery jeditable

现在,我正在使用的服务器响应发回一个JSON响应,如下所示:

{"status":1}
Run Code Online (Sandbox Code Playgroud)

保存后,jeditable将实际响应{"status":1}放在页面上.无论如何要解决这个问题?

nor*_*man 23

更好的解决方案是在返回页面之前对返回的json数据进行后处理.

假设您的服务器返回以下json字符串:

{ "status": 1, "result": "value to be displayed", "other": "some other data" }
Run Code Online (Sandbox Code Playgroud)

并且您希望处理"状态"和"其他"字段,并在可编辑输入字段中显示"结果"字段.

将以下两行添加到jquery.jeditable.js:

(第95行):

var intercept = settings.intercept || function(s) {return s; };
Run Code Online (Sandbox Code Playgroud)

(在第350行附近,"成功:功能(结果,状态){"之后

result = intercept.apply(self,[result]);
Run Code Online (Sandbox Code Playgroud)

然后,在您自己的代码中,执行以下操作:

$(some_field).editable(
 '/some_url_on_your_server',
 {
     indicator : "<img src='/images/spinner.gif'>",
     tooltip: "Click to edit.",
     indicator: "Saving...",
     onblur: "submit",
     intercept: function (jsondata) {
         obj = jQuery.parseJSON(jsondata);
         // do something with obj.status and obj.other
         return(obj.result);
     },
     etc.
Run Code Online (Sandbox Code Playgroud)

这允许你做一些很酷的事情,例如让服务器将缩写转换为完整的字符串等.

请享用!

  • 让我想到默认情况下插件中不存在这个.谢谢你的帮助. (9认同)

Fel*_*eão 12

通过使用回调,有一种简单的方法..editable()将任何响应转换为字符串,因此必须将响应转换为JSON变量.然后可以检索这些值,然后使用'.text()'方法写入.检查代码:

$("#myField").editable("http://www.example.com/save.php", { 
    submit    : 'Save',
    cancel    : 'Cancel',
    onblur    : "ignore",
    name      : "sentText",
    callback : function(value, settings) {
        var json = $.parseJSON(value);
        $("#myField").text(json.sentText);
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案,我不需要编辑JEditable脚本,thx. (2认同)
  • 我打算说我看不出这是怎么回事.在回调中,`value`指的是提交的值,而不是响应.但我只测试了它,并且值是返回值而不是提交的值!在可浏览页面(http://www.appelsiini.net/projects/jeditable)上,它显示"值包含已提交的表单内容".哪个不对!(另外,顺便说一下,在save.php之后你有一个额外的引用,它会弄乱你的代码标记.) (2认同)

Sam*_*m3k 0

所以我想出的解决方案与 madcapnmckay 在这里回答的类似

var editableTextArea = $('.editable-textarea');
        editableTextArea.editable(submitEditableTextArea, {
    type      : 'textarea',
    cancel    : 'Cancel',
    submit    : 'Save',
            name            : editableTextArea.attr('id'),
            method      : 'post',
            data            : function(value, settings) {
                                        return $.fn.stripHTMLforAJAX(value);
                                    },
            event     : "dblclick",

    onsubmit    : function(value, settings) {
                //jquery bug: on callback reset display from block to inline
                $('.btn-edit').show(0, function(){$(this).css('display','inline');});
              },
    onreset     : function(value, settings) {
                //jquery bug: on callback reset display from block to inline
                $('.btn-edit').show(0, function(){$(this).css('display','inline');});
              }
  });
Run Code Online (Sandbox Code Playgroud)

那么url函数就是

function submitEditableTextArea(value, settings) { 
                        var edits = new Object();
                        var result = $.fn.addHTMLfromAJAX(value);
                        edits[settings.name] = [value];
                        var returned = $.ajax({
                            type            : "POST",
                            data            : edits,
                            dataType    : "json",
                            success     : function(_data) {
                                var json = eval( _data );
                                if ( json.status == 1 ) {
                                    console.log('success');
                                }
                            }
                        });
                        return(result);
                    }
Run Code Online (Sandbox Code Playgroud)