Javascript 如何获取元素中的文本以及其中的图像(JQuery)?
我希望得到匹配元素集中每个元素的组合文本内容,但其中包含图像 例如,对于此输入:Javascript 如何获取元素中的文本以及其中的图像(JQuery)?,javascript,jquery,html,Javascript,Jquery,Html,我希望得到匹配元素集中每个元素的组合文本内容,但其中包含图像 例如,对于此输入: <div id="test">Lorem ipsum <strong>dolor</strong> sit amet, consectetur <a href="...">adipiscing</a> elit: <img src="test.png" alt="test"/> Etiam vulputate arcu risus</di
<div id="test">Lorem ipsum <strong>dolor</strong> sit amet, consectetur <a href="...">adipiscing</a> elit: <img src="test.png" alt="test"/> Etiam vulputate arcu risus</div>
Lorem ipsumdolorsit amet,concetetur elit:Etiam vulputate arcu risus
我希望获得以下输出:
Lorem ipsum dolor sit amet, consectetur adipiscing elit: <img src="test.png" alt="test"/> Etiam vulputate arcu risus
Lorem ipsum dolor sit amet,一位杰出的领导者:一位伟大的领袖
如何使用JQuery来管理它?它几乎与
.text()
函数相同,但我应该以某种方式保留图像。我相信我有一个简单的解决方案。以下是您可以做的:
var source = $("#test").clone(); //clone your dom element
source.find(':not(img)').remove(); //remove all tags exept img
console.log(source.html()); //Watch result in console
更新:
如果不想删除标记的内容:
$("#test").find("*").not("img").each(function() {
$(this).replaceWith(this.innerHTML);
});
这是
更新2:
如果您有嵌套元素:
var beginsWith = function(needle, haystack){
return (haystack.substr(0, needle.length) == needle);
};
var filterHTML = function($elem) {
var $cp = $elem.clone();
var changed = true;
while(changed) {
var tx1 = $cp.html();
$cp.contents().each(function() {
if(this.nodeType === Node.COMMENT_NODE) {
$(this).remove();
} else if(this.nodeType == Node.ELEMENT_NODE) {
if(this.nodeName == 'IMG') {
var src = $(this).attr("src");
if(
!beginsWith("http://",src) &&
!beginsWith("https://",src) &&
!beginsWith("data:image",src)
) {
$(this).remove();
}
} else {
$(this).replaceWith(this.innerHTML);
}
}
});
var tx2 = $cp.html();
changed = (tx1 != tx2);
}
return $cp.html();
};
我相信我有一个简单的解决办法。以下是您可以做的:
var source = $("#test").clone(); //clone your dom element
source.find(':not(img)').remove(); //remove all tags exept img
console.log(source.html()); //Watch result in console
更新:
如果不想删除标记的内容:
$("#test").find("*").not("img").each(function() {
$(this).replaceWith(this.innerHTML);
});
这是
更新2:
如果您有嵌套元素:
var beginsWith = function(needle, haystack){
return (haystack.substr(0, needle.length) == needle);
};
var filterHTML = function($elem) {
var $cp = $elem.clone();
var changed = true;
while(changed) {
var tx1 = $cp.html();
$cp.contents().each(function() {
if(this.nodeType === Node.COMMENT_NODE) {
$(this).remove();
} else if(this.nodeType == Node.ELEMENT_NODE) {
if(this.nodeName == 'IMG') {
var src = $(this).attr("src");
if(
!beginsWith("http://",src) &&
!beginsWith("https://",src) &&
!beginsWith("data:image",src)
) {
$(this).remove();
}
} else {
$(this).replaceWith(this.innerHTML);
}
}
});
var tx2 = $cp.html();
changed = (tx1 != tx2);
}
return $cp.html();
};
在另一个答案中,它将删除除img之外的所有元素标记,因此如果您注意到,强元素(dolor)和锚元素(adipising)中的文本将不会显示,请使用此代码,以便获得预期的输出
<div id="test">Lorem ipsum <strong>dolor</strong> sit amet, consectetur <a href="...">adipiscing</a> elit: <img src="test.png" alt="test"/> Etiam vulputate arcu risus</div>
<script>
$(function(){
var $contents = $('#test').contents();
var returnString='';
for(var i=0;i< $('#test').contents().length; i++){
if($contents[i].nodeType == 3)
returnString = returnString + $contents[i].textContent;
else if($contents[i].nodeType != 3 && $contents[i].nodeName != 'IMG')
returnString = returnString + $contents[i].innerHTML;
else
returnString = returnString + $contents[i].outerHTML;
}
console.log(returnString);
});
</script>
Lorem ipsumdolorsit amet,concetetur elit:Etiam vulputate arcu risus
$(函数(){
var$contents=$('#test').contents();
var returnString='';
对于(var i=0;i<$('#test').contents().length;i++){
if($contents[i].nodeType==3)
returnString=returnString+$contents[i].textContent;
else如果($contents[i].nodeType!=3&&$contents[i].nodeName!=“IMG”)
returnString=returnString+$contents[i].innerHTML;
其他的
returnString=returnString+$contents[i].outerHTML;
}
console.log(returnString);
});
工作小提琴:
输出:Lorem ipsum dolor sit amet,Concetetur Adipsicing elit:img tag Etiam vulputate arcu risus在另一个答案中,它将删除除img以外的所有元素标记,因此如果您注意到,将不显示强元素(dolor)和锚元素(Adipsicing)内的文本,使用此代码可以获得预期的输出
<div id="test">Lorem ipsum <strong>dolor</strong> sit amet, consectetur <a href="...">adipiscing</a> elit: <img src="test.png" alt="test"/> Etiam vulputate arcu risus</div>
<script>
$(function(){
var $contents = $('#test').contents();
var returnString='';
for(var i=0;i< $('#test').contents().length; i++){
if($contents[i].nodeType == 3)
returnString = returnString + $contents[i].textContent;
else if($contents[i].nodeType != 3 && $contents[i].nodeName != 'IMG')
returnString = returnString + $contents[i].innerHTML;
else
returnString = returnString + $contents[i].outerHTML;
}
console.log(returnString);
});
</script>
Lorem ipsumdolorsit amet,concetetur elit:Etiam vulputate arcu risus
$(函数(){
var$contents=$('#test').contents();
var returnString='';
对于(var i=0;i<$('#test').contents().length;i++){
if($contents[i].nodeType==3)
returnString=returnString+$contents[i].textContent;
else如果($contents[i].nodeType!=3&&$contents[i].nodeName!=“IMG”)
returnString=returnString+$contents[i].innerHTML;
其他的
returnString=returnString+$contents[i].outerHTML;
}
console.log(returnString);
});
工作小提琴:
输出:Lorem ipsum dolor sit amet,Concetetur adipiscing Elite:img tag Etiam vulputate arcu risus这不会是直接的。您可能最好通过检索textNodes的节点和标记名==
IMG
的DomeElement的outerHTML递归。这不是直接的。您最好通过检索textNodes的节点和标记名==IMG
的DomeElement的outerHTML递归。谢谢。但是你能解释一下它是如何工作的吗.remove()
不仅应该删除元素本身,还应该删除其中的所有内容it@IterAtor好了,现在我得到你想要的了。这是UpdateThk you中的另一个解决方案。但是你能解释一下它是如何工作的吗.remove()
不仅应该删除元素本身,还应该删除其中的所有内容it@IterAtor好了,现在我得到你想要的了。这里是更新中的另一个解决方案