jquery删除节点并保留子节点
我很惭愧地提出这个问题,但我还没有设法在Jquery中使用unwrap或replaceWith方法来满足这种需要 我的问题很简单:我需要删除html代码的一些节点(jquery选择器),而不会丢失这些节点的子节点 下面是一个JSFIDLE,它演示了我用于实现目标的难看代码的结果(是的,它是有效的…)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='';
//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代码,我必须先更改它