10

我有一个页面可能是以下之一:

<span id='size'>33</span>

或者

<span id='size'>
    <b>33</b>
    <strike>32</strike>
</span>

我想在这两种情况下都获取值 '33',有没有我可以使用的 CSS 选择器?我尝试使用以下 #size 没有 b 兄弟或 b 这是 #size 兄弟:

document.querySelector('#size:not(>b), #size>b').innerText

但是我不断收到错误消息-“错误:SYNTAX_ERR:DOM Exception 12”

根据w3 Spec仅支持简单选择器,问题是“大于号”(U+003E,>)”被视为简单选择器定义的一部分。

4

3 回答 3

13

你不能用常规的 CSS 选择器来做,但是你可以用几行 JS 来做:

var element = document.querySelector('#size');
var b = element.querySelector('b');
var text = b ? b.innerText : element.childNodes[0].nodeValue;

console.log(text);
于 2013-02-19T20:44:45.980 回答
1

So really you want significant text (ie other than whitespace, because in your second example there's probably tabs and returns between the span start tag and the b) of #size, or, if that doesn't exist, the significant text of its first element:

// Is text just whitespace?
function isWhitespace(text){
    return text.replace(/\s+/,'').length === 0;
}

// Get the immediate text (ie not that of children) of element
function getImmediateText(element){
    var text = '';

    // Text and elements are all DOM nodes. We can grab the lot of immediate descendants and cycle through them.
    for(var i = 0, l = element.childNodes.length, node; i < l, node = element.childNodes[i]; ++i){
    // nodeType 3 is text
        if(node.nodeType === 3){
            text += node.nodeValue;
        }
    }

    return text;
}

function getFirstTextNode(element){
    var text = getImmediateText(element);

    // If the text is empty, and there are children, try to get the first child's text (recursively)
    if(isWhitespace(text) && element.children.length){
        return getFirstTextNode(element.children[0])
    }
    // ...But if we've got no children at all, then we'll just return whatever we have.
    else {
        return text;
    }
}
于 2013-02-19T20:48:41.087 回答
0

在我们拥有 CSS Level 4 选择器和父选择器的那一天,您将能够使用一个简单的选择器,但现在您不能直接使用它。

您可以迭代找到第一个文本节点,但这是一个 hacky 解决方案:

var text = document.getElementById('size').innerHTML.split(/<.*?>/)[0];

#size仅在您对元素的内容有所了解时使用。

于 2013-02-19T20:45:53.090 回答