Вы можете использовать :not
, чтобы убедиться, что выбранные элементы не соответствуют определенному селектору - здесь, #some_id [some_attribute] [some_attribute]
(потому что элементы, которые соответствуют этому селектору, будут some_attribute
вложенными в другой some_attribute
, который не является#some_id
):
const result = $("#some_id")
.find("[some_attribute]:not(#some_id [some_attribute] [some_attribute])")
.each(function() {
console.log(this.innerHTML);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="some_id" some_attribute>
<span some_attribute>sel <!-- SELECT -->
<span some_attribute> <!-- IGNORE -->
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span>
</span>
</span>
<span>
<span some_attribute>sel <!-- SELECT -->
<span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
</span>
<span>
<span>
<span>
<span some_attribute>sel <!-- SELECT -->
</span>
</span>
</span>
</span>
</span>
Если вы не можете жестко запрограммировать его, я полагаю, можно было бы установить атрибут так, чтобы вы могли правильно использовать :not
:
const elm = $("#some_id");
elm[0].dataset.parent = '';
elm
.find("[some_attribute]:not([data-parent] [some_attribute] [some_attribute])")
.each(function() {
console.log(this.innerHTML);
});
elm[0].removeAttribute('data-parent');
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="some_id" some_attribute>
<span some_attribute>sel <!-- SELECT -->
<span some_attribute> <!-- IGNORE -->
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span>
</span>
</span>
<span>
<span some_attribute>sel <!-- SELECT -->
<span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
</span>
<span>
<span>
<span>
<span some_attribute>sel <!-- SELECT -->
</span>
</span>
</span>
</span>
</span>
Если вы также не хотите менять DOM, .filter
и убедитесь, что элемент .closest
с [some_attribute]
является родительским:
const elm = $("#some_id");
elm
.find("[some_attribute]")
.filter(function() {
return $(this).parent().closest('[some_attribute]')[0] === elm[0];
})
.each(function() {
console.log(this.innerHTML);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<span id="some_id" some_attribute>
<span some_attribute>sel <!-- SELECT -->
<span some_attribute> <!-- IGNORE -->
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span>
</span>
</span>
<span>
<span some_attribute>sel <!-- SELECT -->
<span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
</span>
<span>
<span>
<span>
<span some_attribute>sel <!-- SELECT -->
</span>
</span>
</span>
</span>
</span>
Используя старые версии jQuery, вы можете использовать .selector
:
const elm = $("#some_id");
const sel = elm.selector;
elm
.find(`[some_attribute]:not(${sel} [some_attribute] [some_attribute])`)
.each(function() {
console.log(this.innerHTML);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
<span id="some_id" some_attribute>
<span some_attribute>sel <!-- SELECT -->
<span some_attribute> <!-- IGNORE -->
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span>
</span>
</span>
<span>
<span some_attribute>sel <!-- SELECT -->
<span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
<span some_attribute> <!-- IGNORE -->
</span>
</span>
</span>
<span>
<span>
<span>
<span some_attribute>sel <!-- SELECT -->
</span>
</span>
</span>
</span>
</span>