Answers:
尽管这不是一个完整的答案,但您应关注W3C Selector API v.2,该版本已在大多数浏览器(包括台式机和移动设备)中提供,但IE(Edge似乎支持)除外:请参阅完整的支持列表。
function(elem) {
return elem.querySelectorAll(':scope > someselector');
};
:scope
仍然在drafts.csswg.org/selectors-4/#the-scope-pseudo中指定了。到目前为止,仅<style scoped>
删除了该属性。目前尚不清楚这是否还会导致:scope
被删除(因为这<style scoped>
是的重要用例:scope
)。
你不能 没有选择器可以模拟您的起点。
jQuery的方式(更多是由于qsa
行为方式不符合他们的喜好),是他们检查是否elem
具有ID,如果没有,则临时添加ID,然后创建完整的选择器字符串。
基本上,您会这样做:
var sel = '> someselector';
var hadId = true;
if( !elem.id ) {
hadID = false;
elem.id = 'some_unique_value';
}
sel = '#' + elem.id + sel;
var result = document.querySelectorAll( sel );
if( !hadId ) {
elem.id = '';
}
这当然不是jQuery代码,但从我记得的情况来看,这基本上就是他们的工作。不仅在这种情况下,而且在从嵌套元素的上下文中运行选择器的任何情况下。
正如avetisk所提到的, Selectors API 2使用:scope
伪选择器。
要使它在所有支持的浏览器中都能正常工作,querySelector
这里是polyfill
(function(doc, proto) {
try { // check if browser supports :scope natively
doc.querySelector(':scope body');
} catch (err) { // polyfill native methods if it doesn't
['querySelector', 'querySelectorAll'].forEach(function(method) {
var nativ = proto[method];
proto[method] = function(selectors) {
if (/(^|,)\s*:scope/.test(selectors)) { // only if selectors contains :scope
var id = this.id; // remember current element id
this.id = 'ID_' + Date.now(); // assign new unique id
selectors = selectors.replace(/((^|,)\s*):scope/g, '$1#' + this.id); // replace :scope with #ID
var result = doc[method](selectors);
this.id = id; // restore previous id
return result;
} else {
return nativ.call(this, selectors); // use native code for other selectors
}
}
});
}
})(window.document, Element.prototype);
node.querySelector(':scope > someselector');
node.querySelectorAll(':scope > someselector');
由于历史原因,我以前的解决方案
根据所有答案
// Caution! Prototype extending
Node.prototype.find = function(selector) {
if (/(^\s*|,\s*)>/.test(selector)) {
if (!this.id) {
this.id = 'ID_' + new Date().getTime();
var removeId = true;
}
selector = selector.replace(/(^\s*|,\s*)>/g, '$1#' + this.id + ' >');
var result = document.querySelectorAll(selector);
if (removeId) {
this.id = null;
}
return result;
} else {
return this.querySelectorAll(selector);
}
};
用法
elem.find('> a');
Date.now()
较旧的浏览器不支持,可以用new Date().getTime()
如果知道要查找的元素的标签名称,则可以在选择器中使用它来实现所需的功能。
例如,如果您有一个<select>
具有,<option>
和的<optgroups>
,并且只希望<option>
s是其直接子代,而不是其内部的子代<optgoups>
:
<select>
<option>iPhone</option>
<optgroup>
<option>Nokia</option>
<option>Blackberry</option>
</optgroup>
</select>
因此,令人惊讶的是,通过引用select元素,您可以像下面这样获得它的直接子元素:
selectElement.querySelectorAll('select > option')
它似乎可以在Chrome,Safari和Firefox中运行,但未在IE中进行测试。= /
<ul id="start"> <li>A</li> <li> <ul> <li>b</li> <li>c</li> </ul> </li> </ul> var result = document.getElementById('start').querySelectorAll('ul>li');
->将选择所有4个li元素!
<select>
同一个父母有两个要素。
如果您最终想找到直接子级(而不是例如> div > span
),可以尝试Element.matches():
const elems = Array.from(elem.children).filter(e => e.matches('.my-class'))
要求
我个人会从patrick dw那里得到答案,并+1他的答案,我的答案是寻求替代解决方案。我认为这不应该被否决。
这是我的尝试:
function q(elem){
var nodes = elem.querySelectorAll('someSeletor');
console.log(nodes);
for(var i = 0; i < nodes.length; i++){
if(nodes[i].parentNode === elem) return nodes[i];
}
}
querySelector
,这意味着:eq()
无法使用。即使可以,选择器也将返回在:eq()
页面上显示的元素,而不是:eq()
其父元素的索引(在该位置获取idx
)。
elem
在索引4处是,但之前的兄弟姐妹具有tagName
,但与之不同,但是它在其中嵌套了一个具有match的元素tagName
,该嵌套元素将在结果中包含在您要定位的元素之前,再次抛出索引。这是一个示例
$('> someselector', elem);
; o)
这对我有用:
Node.prototype.search = function(selector)
{
if (selector.indexOf('@this') != -1)
{
if (!this.id)
this.id = "ID" + new Date().getTime();
while (selector.indexOf('@this') != -1)
selector = selector.replace('@this', '#' + this.id);
return document.querySelectorAll(selector);
} else
return this.querySelectorAll(selector);
};
如果要搜索直系子级,则必须在>之前传递@this键盘输入。
以下是一种简化的通用方法,用于仅在直接子代上运行任何CSS选择器查询-它还考虑了组合查询,例如"foo[bar], baz.boo"
:
var count = 0;
function queryChildren(element, selector) {
var id = element.id,
guid = element.id = id || 'query_children_' + count++,
attr = '#' + guid + ' > ',
selector = attr + (selector + '').replace(',', ',' + attr, 'g');
var result = element.parentNode.querySelectorAll(selector);
if (!id) element.removeAttribute('id');
return result;
}
*** Example Use ***
queryChildren(someElement, '.foo, .bar[xyz="123"]');
检查元素是否具有ID,否则添加随机ID并根据其进行搜索
function(elem) {
if(!elem.id)
elem.id = Math.random().toString(36).substr(2, 10);
return elem.querySelectorAll(elem.id + ' > someselector');
};
将做与
$("> someselector",$(elem))