如何使用选择器获取相对于element实例的元素
How do you grab an element relative to an Element instance with a selector?
我正在编写一个小库,需要通过querySelector
方法选择目标元素的相对元素。
例如:
HTML
<div class="target"></div>
<div class="relative"></div>
<!-- querySelector will select only this .target element -->
<div class="target"></div>
<div class="relative"></div>
<div class="target"></div>
<div class="relative"></div>
JavaScript
var target = document.querySelectorAll('.target')[1];
// Something like this which doesn't work actually
var relativeElement = target.querySelector('this + .relative');
在上面的示例中,我试图仅相对于值存储在target
变量中的.target
元素来选择.relative
类元素。任何样式都不应应用于其他.relative
类元素。
PS:选择器可能会有所不同。因此,我不能使用JavaScript的预定义方法,如previousElementSibling
或nextElementSibling
。
我不需要jQuery或其他JavaScript库中的解决方案。
理想情况下应该是:
var relativeElement = target.querySelector('.relative');
但这实际上会尝试在目标元素中选择一些内容。因此,只有当您的html结构类似于时,这才会起作用
<div class="target">
<div class="relative"></div>
</div>
在这种情况下,你最好的选择可能是使用nextElementSibling
,我知道你很难使用它。
您不能如果你坚持使用主题元素的querySelector
,答案是没有办法。
规范和MDN都明确表示Element.querySelector
必须返回"调用它的元素的子代",而您想要的对象元素不满足此限制。
如果你想爆发,你必须上去使用其他元素,例如document.querySelector
。
您可以随时覆盖
Element.prototype.querySelector
来进行竞价,包括实现自己的CSS引擎,以任何语法选择您想要的任何元素。我没有提到这一点,因为你将打破对一个非常重要的函数的假设,很容易破坏其他库甚至普通代码,或者充其量会减慢它们的速度。
target.querySelector('.relative');
通过在目标而不是文档上使用querySelector,可以将DOM遍历范围扩大到目标元素。从你的解释中还不完全清楚,但我认为你所说的亲属是指后代?
要获得所有目标元素,可以使用
document.querySelectorAll('.target')
然后迭代结果
我找到了一种适用于我的库的方法。
我将用一个唯一的自定义属性值替换querySelector中的"this "
。类似这样的东西:
Element.prototype.customQuerySelector = function(selector){
// Adding a custom attribute to refer for selector
this.setAttribute('data-unique-id', '1');
// Replace "this " string with custom attribute's value
// You can also add a unique class name instead of adding custom attribute
selector = selector.replace("this ", '[data-unique-id="1"] ');
// Get the relative element
var relativeElement = document.querySelector(selector);
// After getting the relative element, the added custom attribute is useless
// So, remove it
this.removeAttribute('data-unique-id');
// return the fetched element
return relativeElement;
}
var element = document.querySelectorAll('.target')[1];
var targetElement = element.customQuerySelector('this + .relative');
// Now, do anything with the fetched relative element
targetElement.style.color = "red";
工作Fiddle
- 如何使用javascript独立地为聚合物自定义元素的每个实例的lightdom设置样式
- 如何确定 HTML 元素是使用哪个实例创建的
- 元素意外地隐藏在Safari的某些实例中,总是出现在Firefox、Chrome中
- 仅在需要时实例化聚合物元素
- 插件总是只得到最后一个实例,如何让它适用于多个元素
- 角度模态实例可以't读取DOM元素
- 如何通过元素选择器获取tinyMCE编辑器实例
- 删除聚合物元素,文件上传在实例上传时逐渐添加更多文件
- 使用 JQuery 在 5 秒后隐藏元素的实例
- 检查变量是否为 SVG.js 元素实例
- 在实例化 JQuery 小部件时选择当前元素
- 如何将自定义属性添加到 HTML 环境,该属性将默认为元素的每个新实例上的空对象
- 使用 DOM 元素的 id 访问插件实例
- Javascript — 相同元素的两个实例
- 多个语义 UI 弹出窗口,其中目标元素在每个实例的 atribute 中定义
- 根据 jQuery 中多个实例上的另一个元素高度设置高度
- 在JS对象实例中引用Ajax加载的元素
- 替换多个元素中字符的所有实例
- 用于存储/检索Backbone.js的模式查看与dom元素关联的实例
- 如何使用选择器获取相对于element实例的元素