jQuery replaceWith有效,但前置不行吗?

时间:2012-08-08 19:41:22

标签: jquery

错误行是:

contxt.replaceWith(safe_copy[id]).prepend("<span class='error'>"+jsonObj.data+"</span>");

虽然replaceWith语句工作正常,但数据未获得“prepended”。

更完整的代码:

contxt = $(this).parents('div[style^="display"]');
id = $(this).attr('id');

        $.ajax({
                url: "/submit/myposts",
                type: "POST",
                data: "action=edit&post="+$(this).attr('id').match(/[0-9]+/)[0]+"&data="+encodeURIComponent(text),
                success: function(data){
                    loading.remove();
                    jsonObj = $.parseJSON(data);

                    if(jsonObj.code == "0")
                        block.html(jsonObj.data);
                    else
                        contxt.replaceWith(safe_copy[id]).prepend("<span class='error'>"+jsonObj.data+"</span>");
                },
                error: function(){
                    loading.remove();
                    contxt.replaceWith(safe_copy[id]).prepend("<span class='error'>An error occurred. Please try again.</span>");
                }
            });

2 个答案:

答案 0 :(得分:2)

.replaceWith()返回原始jQuery对象(从页面中删除的对象),因此当您链接到该对象时,它将对已删除的内容进行操作,而不是对已添加的内容进行操作。

来自.replaceWith()的{​​{1}}:

  

与大多数jQuery方法一样,.replaceWith()方法返回   jQuery对象,以便可以将其他方法链接到它上面。然而,   必须注意的是返回原始的jQuery对象。这个   object指的是从DOM中删除的元素,而不是   已取代它的新元素。

我不完全确定我理解您的代码/ HTML,但这可能是一种可能的解决办法:

var newContent = $(safe_copy[id]).prepend("<span class='error'>"+jsonObj.data+"</span>");
contxt.replaceWith(newContent);

答案 1 :(得分:0)

我怀疑以下两个问题:

a. Either the object being returned by replaceWith() was not same as the new node added, or
b. The return object was being regenerated using the original selection criteria

事实证明,您仍然可以处理原始对象,该对象已从DOM中删除。这已在文档here中得到确认。

您只需运行选择以再次引用新节点,然后运行前置操作。对于您描述的场景,您不能将prepend链接到replaceWith()。查看以下小提琴示例,显示此方法有效:

http://jsfiddle.net/shaikhtabrez/BbgXW/7/