按标签/类名长度选择元素

时间:2017-09-10 20:46:23

标签: javascript jquery

我想在Tampermonkey.

中使用javascript / jquery选择一个元素

每次加载页面时,元素的类名和标记都会发生变化。 所以我必须使用某种形式的正则表达式,但无法弄清楚如何去做。

这就是html的样子:

<ivodo class="ivodo" ... </ivodo>
<ivodo class="ivodo" ... </ivodo>
<ivodo class="ivodo" ... </ivodo>
  • 标记始终与类名相同。
  • 它始终是一个4/5字母随机“代码”

我猜它会是这样的: $( '[/ ^ [A-Z] {4,5} /}')

有人可以帮助我获得正确的正则表达式吗?

4 个答案:

答案 0 :(得分:2)

您不能在选择器中使用regexp。您可以选择一些容器并选择其所有元素,然后根据其类名对其进行过滤。但这可能不会超快。

我为你做了一个演示: https://codepen.io/anon/pen/RZXdrL?editors=1010

HTML:

<div class="container">
  <abc class="abc">abc</abc>
  <abdef class="abdef">abdef</abdef>
  <hdusf class="hdusf">hdusf</hdusf>
  <ueff class="ueff">ueff</ueff>
  <asdas class="asdas">asdas</asdas>
  <asfg class="asfg">asfg</asfg>
  <aasdasdbc class="aasdasdbc">aasdasdbc</aasdasdbc>
</div>

js(使用jQuery):

const $elements = $('.container *').filter((index, element) => {
  return (element.className.length === 5);
});

$elements.css('color', 'red');

答案 1 :(得分:2)

最简单的方法是根据固定父级选择那些动态元素,例如:

$('#parent > *').each(function() {
  // your logic here...
})

答案 2 :(得分:1)

如果您在问题中说明了构建这些标签的规则是可靠的,那么您可以选择所有元素,然后过滤掉那些不感兴趣的元素,例如:

var $elements  = $('*').filter(function() {
    return this.className.length === 5 && this.className.toUpperCase() === this.tagName.toUpperCase();
});

<强> DEMO

当然,您可能希望最初只选择某些容器中的元素。如果是,请将'*'替换为更具体的选择器:

var $elements  = $('someSelector *').filter(function() {
    return this.className.length === 5 && this.className.toUpperCase() === this.tagName.toUpperCase();
});

答案 3 :(得分:1)

你可以在vanilla JS中做到这一点 DEMO

检查demo dev工具控制台

<body>
  <things class="things">things</things>
  <div class="stuff">this is not the DOM element you're looking for</div>
</body>

JS

// Grab the body children
var bodyChildren = document.getElementsByTagName("body")[0].children;

// Convert children to an array and filter out everything but the targets
var targets = [].filter.call(bodyChildren, function(el) {
  var tagName = el.tagName.toLowerCase();
  var classlistVal = el.classList.value.toLowerCase();
  if (tagName === classlistVal) { return el; }
});

targets.forEach(function(el) {
// Do stuff
  console.log(el)
})