0
DOMParser有一種奇怪的行爲。當我使用「text/xml」作爲參數時,我得到我的對象,並且每次使用子對象(如parentNodes)時,該子對象本身就是一個DOM對象。但是,當我使用「text/html」作爲參數時,孩子不是DOM對象。爲什麼是這樣,我怎麼能爲所有的孩子有DOM對象?DOMParser - 兒童不是DOM對象
這裏是我做的:
parser = new DOMParser();
doc = parser.parseFromString(stringContainingHTMLSource, "text/html").getElementsByTagName('p');
console.log(doc[0].childNodes[0]);
我childNode返回元素,但不是作爲一個DOM對象...
編輯: 這裏是我的遞歸函數:
var getParents = function(node, parentNodes){
if(node.nodeName == 'span'){
parentNodes.push(node.attributes[0].nodeValue);
} else if(node.nodeName == 'p' && node.attributes.length > 0) {
parentNodes.push(node.nodeName);
parentNodes.push(node.attributes[0].nodeValue);
} else {
parentNodes.push(node.nodeName);
}
if(node.parentNode.nodeName != '#document'){
getParents(node.parentNode, parentNodes);
}
return parentNodes;
};
var parse = function(node, vertical, horizontal, paragraph){
if(node.childNodes.length > 0){
for(var int = 0; int < node.childNodes.length; int++){
parse(node.childNodes[int], vertical, horizontal, paragraph);
}
} else{
var object = {};
var attributes = getParents(node, []);
for(var int = 0; int < attributes.length; int++) {
// right alignment
if(/text-align/i.test(attributes[int])){
object.alignment = attributes[int].split(": ")[1].replace(';','');
} else if (/color/i.test(attributes[int])) {
// color
object.color = attributes[int].split(":")[1];
} else if (attributes[int] == 'em') {
// italic
if (object.italics) {
delete object.bold;
object.bolditalics = true;
} else {
object.italics = true;
}
} else if (attributes[int] == 'strong') {
// bold
if (object.italics) {
delete object.italics;
object.bolditalics = true;
} else {
object.bold = true;
}
} else if (attributes[int] == 'u') {
// underline
object.decoration = 'underline';
} else if (attributes[int] == 's') {
// strike
object.decoration = 'lineThrough';
}
}
object.text = node.textContent;
pdfContent[vertical][horizontal].push(object);
}
};
for(var vertical = 0; vertical < payment.htmlContent.length; vertical++) {
for(var horizontal = 0; horizontal < payment.htmlContent[vertical].length; horizontal++) {
var parser = new DOMParser();
var paragraphs = parser.parseFromString(payment.htmlContent[vertical][horizontal], "text/xml").getElementsByTagName('p');
for (var paragraph = 0; paragraph < paragraphs.length; paragraph++) {
for (var num = 0; num < paragraphs[paragraph].childNodes.length; num++) {
parse(paragraphs[paragraph].childNodes[num], vertical, horizontal, paragraph);
}
}
}
}
你所說的 「他們不是DOM對象」 呢?你能給我們一個你傳遞的字符串和輸出的例子嗎?乍一看我會說這是因爲childNodes返回節點。你可能只想用'doc [0] .children [0]'來檢查元素。 – Kaiido
@Kaiido嗯,這就是我想要做的......我遞歸地進入所有childNodes(遞歸函數),當我到達我的最後一個孩子時,我通過我的父節點遞歸地回去(以獲得孩子所有的nodeNames )。使用xml,它工作得很好,但帶有html,當我到達最後一個childNode時,它不再有父節點,因爲它只是一個簡單的元素。 (將用遞歸函數更新我的問題...) – ncohen
是的,請更新,對我來說,它在控制檯中工作,手動進入最後一個節點並再次爬升。但是,也許你會對[TreeWalker](https://developer.mozilla.org/en/docs/Web/API/TreeWalker)對這類任務感興趣 – Kaiido