Отладка
Ваш код:
if $('p:has(img#img_2)'){
action here
}
Имеет следующие проблемы:
- без скобок вокруг выражения условия
- jQuery объект всегда возвращает истину
Исправлено:
// .length is used to for detection and results in truthy/falsy expression
if ( $('p:has(img#img_2)').length ){
action here
}
Обнаружение родителя / ребенка
Обнаружение элемента может быть легко выполнено изначально без использования jQuery.
1. Walking-Up
Этот подход находит элемент и идет вверх по дереву DOM. closest
и parentNode
используются для четкого описания намерения; поскольку желательно, чтобы ближайшим p
был родитель, а не какой-то предок. В производственной среде вы можете добавить проверки, чтобы убедиться, что img
найден перед поиском родителя - быстрый способ - добавить img &&
в начале условия.
const img = document.querySelector('#img_2')
if (img.closest('p') == img.parentNode)
console.log('found')
if (img.closest('p') != img.parentNode)
console.log('not found')
<p>
<img src="path.jpg" id="img_2">
</p>
2. Прогулка вниз
Это достигается путем поиска абзаца и поиска его детей.
const p = document.querySelector('p')
if (p.querySelector('#img_1'))
console.log('found 1')
if (p.querySelector('#img_2'))
console.log('found 2') // not found
<p>
<img src="path.jpg" id="img_1">
<div><img src="path.jpg" id="img_2"></div>
</p>
3. Доверие к Child-Selector
Это использует дочерний >
селектор для извлечения элементов и последующей оценки, были ли найдены элементы. Предоставлены обе стороны условного обозначения, чтобы проиллюстрировать, как обнаружить несоответствие. Как правило, else
будет достаточно.
const img1 = document.querySelector('p > #img_1')
const img2 = document.querySelector('p > #img_2')
if (img1)
console.log('found img_1') // not reached
if (!img1)
console.log('no paragraph with #img_1 child')
if (img2)
console.log('found "p>#img_2"; paragraph: ', img2.parentNode)
if (!img2)
console.log('no paragraph with #img_2 child') // not reached
<!-- outside -->
<img src="path.jpg" id="img_1">
<!-- inside -->
<p>
<img src="path.jpg" id="img_2">
</p>