Javascript 使用条件函数的Jquery ReplaceWith()的行为与我预期的不一样

Javascript 使用条件函数的Jquery ReplaceWith()的行为与我预期的不一样,javascript,jquery,html,Javascript,Jquery,Html,我正在学习jQuery,并且正在使用在线教程。我正在学习replaceWith()函数,以及它如何使用另一个函数作为返回结果。看着老师的代码,我不明白它是怎么工作的 jQuery $("document").ready(function () { $("#example p").replaceWith(replacementFn); function replacementFn() { if ($(this).text().indexOf("1") != -1)

我正在学习jQuery,并且正在使用在线教程。我正在学习
replaceWith()
函数,以及它如何使用另一个函数作为返回结果。看着老师的代码,我不明白它是怎么工作的

jQuery

$("document").ready(function () {
    $("#example p").replaceWith(replacementFn);
    function replacementFn() {
        if ($(this).text().indexOf("1") != -1) {
            return "<p>This is paragraph uno</p>";
        }
    }
});
$(“文档”).ready(函数(){
$(“#示例p”).replaceWith(replacementFn);
函数替换fn(){
if($(this).text().indexOf(“1”)!=-1){
返回“这是uno的段落”

”; } } });
HTML

<div id="example">
    <p class="a">This is paragraph 1</p>
    <p id="para1">This is paragraph 2</p>
    <p class="b">This is paragraph 3</p>
    <p id="para4" lang="en-us">This is paragraph 4</p>
    <p id="para5" lang="en-gb">This is paragraph 5</p>
</div>

这是第1段

这是第2段

这是第3段

这是第4段

这是第5段

正如代码所示,它的工作原理与我所看到的一样。一个段落被替换为
“这是uno段落”
。但一旦我将
indexOf(“1”)
更改为
indexOf(“6”)
示例div中的所有内容都将被删除。我不明白的是,为什么当至少有一段符合要求时,一切都正常。但是一旦他们都不符合要求,一切都会被消灭

为什么原始代码不删除与检查匹配的段落以外的所有内容

If将出现在jQuery源中,这是原因。如果替换函数返回集合中所有项都不可用的内容,则整个集合将从DOM中删除:

// Force removal if there was no new content (e.g., from empty arguments)
return arg && (arg.length || arg.nodeType) ? this : this.remove();
我想说,您正在使用的这个条件替换似乎是某种漏洞,jQuery文档中没有记录它

我建议在执行替换之前筛选要替换的项目:

$("#example p").filter(pickItems).replaceWith(replacementFn);

function pickItems() {
    return $(this).text().indexOf("1") !== -1;
} 

function replacementFn() {
    return "<p>This is paragraph uno</p>";
}
$(“#示例p”).filter(pickItems).replaceWith(replacementFn);
函数pickItems(){
返回$(this).text().indexOf(“1”)!=-1;
} 
函数替换fn(){
返回“这是uno的段落”

”; }
或者,在不替换新内容或原始项目时,可以有条件地返回它们:

$(函数(){
$(“#示例p”).replaceWith(replacementFn);
函数替换fn(){
if($(this).text().indexOf(“6”)!=-1){
返回“这是uno的段落”

”; } 归还这个; } });

这是第1段

这是第2段

这是第3段

这是第4段

这是第5段


这很奇怪。如果添加
else{return this.outerHTML}
,它们都会被还原,因此当没有匹配项时,
未定义的
返回值会将它们清除。我不知道为什么。似乎有问题。添加
else{return this.outerHTML}
解决了问题,谢谢。但我还是很好奇为什么。是的,不确定。在国际海事组织,它应该表现得更为一致。这就解释了这一点。谢谢。好的,就在这儿。你真邋遢,jQuery+1很好的发现。看起来这是破坏它的承诺:应该有人(而不是我)提交错误报告。;-)我只是在论坛上发帖问这是不是一个bug。如果是的话,我会做需要做的事。谢谢您的帮助。@眯着眼睛看前面/后面的,看起来这种行为可能已经出现在“之前”版本中了。基本上,如果函数从未返回可被视为节点的内容,则永远不会调用
replaceWith()
中的回调,并且必须至少调用一次,以防止发生
这种情况。remove()
。在“以前”的版本中似乎是这样。看起来
replaceWith
domManip
都是一个完全混乱的易变性,但我不会声称我比jQuery开发人员更清楚。