Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jquery删除节点并保留子节点_Jquery_Html_Children_Parents - Fatal编程技术网

jquery删除节点并保留子节点

jquery删除节点并保留子节点,jquery,html,children,parents,Jquery,Html,Children,Parents,我很惭愧地提出这个问题,但我还没有设法在Jquery中使用unwrap或replaceWith方法来满足这种需要 我的问题很简单:我需要删除html代码的一些节点(jquery选择器),而不会丢失这些节点的子节点 下面是一个JSFIDLE,它演示了我用于实现目标的难看代码的结果(是的,它是有效的…) //var content:wysiwyg的html源代码 var结果=“”; $(content).contents().each(function()){ var addContent='';

我很惭愧地提出这个问题,但我还没有设法在Jquery中使用unwrap或replaceWith方法来满足这种需要

我的问题很简单:我需要删除html代码的一些节点(jquery选择器),而不会丢失这些节点的子节点

下面是一个JSFIDLE,它演示了我用于实现目标的难看代码的结果(是的,它是有效的…)

//var content:wysiwyg的html源代码
var结果=“”;
$(content).contents().each(function()){
var addContent='';
//文本节点
if(this.nodeType==3){
//文本节点
结果+=$(this.text();
}else if(this.nodeType==1&&$(this.hasClass('atwho-inserted')){
//if是具有目标类的对象节点
//我只保留它的内容(意味着“.atwho inserted”不保留)
结果+=$(this.html();
}否则{
//在任何其他情况下,我完全保留它
结果+=this.outerHTML;
}
});
你能给我找一个更好的代码(使用展开方法)吗


非常感谢:)

基本上,
outerHTML
是您想要用
innerHTML
替换的内容(展开) 检查

$(“#触发器”)。单击(函数(){
$(this.hide();
$('.atwho inserted')。每个(函数(){
this.outerHTML=$(this.html();
});
});
正文{
填充:10px;
}
.atwho插入{
背景色:红色;
}
预编码,.wrap{
空白:行前;
}
#触发{
字号:1.5em;
}

单击以触发编辑
所有选择器“.atwho inserted”均为“背景色:红色”,必须在不丢失其子项的情况下删除。

@事实使用者

一些lorem ipsum文本 #易接近性

你好
#陪伴

这里的结果是有效的,但代码没有得到优化

如果您的目的是只删除插入的
span.atwho,而不删除其子项,并且DOM的其余部分保持不变,则可以通过以下方式执行:

$('.start .atwho-inserted').children(':first-child').unwrap();
首先,选择类为
.atwho inserted
的元素,然后找到它们各自的第一个子元素并执行
展开

unwrap
删除选择器直接父包装,并留下子包装


你可以走了

我想这个会让你高兴的。 注意var的修改
tmp

$(文档).ready(函数(){
var content=$('.start').html();
$('.startCode')。文本(内容);
var tmp=$(内容);
$('.atwho插入',tmp).children().unwrap();
var result=tmp[0].outerHTML;//或tmp.html();但将丢失最外层的标记
$('.result').html(result);
$('.resultCode').text(结果);
});
正文{
填充:10px;
}
.atwho插入{
背景色:红色;
}
预编码,.wrap{
空白:行前;
}

所有选择器“.atwho inserted”均为“背景色:红色”,必须在不丢失其子项的情况下删除。

@事实使用者
一些lorem ipsum文本 #易接近性

你好
#陪伴


这里的结果是有效的,但代码没有得到优化

这里是另一个JSFIDLE,我在其中添加了unwrap()解决方案

$(内容).find('.atwho inserted').children(':first child').unwrap();

我认为问题在于unwrap()只返回解包后的jquery对象,并且只能应用于DOM(不是来自被视为DOM对象的变量)。

我注意到您正在JSFIDLE中运行两个不同版本的引导CSS。在结果代码中,
也被删除。这是预期的吗?@aManHasNoName不,不是。。。好吧,这是另一个问题!谢谢@MiquelAl.Vicens。。。这是我第一次使用JsFiddle;)这似乎是一个很好的解决方案,但是在我的例子中,我使用了一个包含html代码的变量。unwrap()只返回解包后的jquery对象,但不返回经过清理的整个代码。因为我比较了您的结果和我的结果,除了我在问题注释中提到的
标记之外,它们是相同的。抱歉,这是您的解决方案的新JSFIDLE:)我刚刚发现了“更新”按钮……谢谢!然而,我还没有找到在变量“content”上直接使用这个过程的方法。Unwrap()返回jQuery中已展开的对象或直接应用于Dom。使用示例:var content=$(messageContent).summernote('code')$(content.find('.atwho inserted').each(函数(){this.outerHTML=$(this.html();});console.log($(content));抱歉…我在这里没有找到在注释中发布代码的方法…对于内联代码,请使用back ticks``和
在这里
初始化后您没有修改
内容的值
,因此它仍然是
$('.start')。html()
注释第二个解决方案的第一行,在最后一行
$('.result2')添加这一行。查找('.atwho inserted').children(':first child').unwrap();
$(content)
自从您使用jquery对象(查看其值)开始就不起作用,我所做的是直接操作DOM(无需存储值)。我当然理解您的工作,但我不能更改DOM。如何存储代码的结果
$('.result2').find('.atwho inserted').children(':first child').unwrap();
?问题是:我的wysiwyg和其他一些插件生成了一个html代码,我必须先更改它