получить ближайший брат в javascript
у меня есть определенная структура DIV с тегом якоря где-то между ними. При нажатии на ссылку мне нужно получить значение другого span
элемент внутри родительского div
и сделайте что-нибудь, (скажем, предупредите его).
html выглядит так:
...
<div id="div1">
...
<span>This is reqd</span>
...
<a href="#">Click Me </a>
...
</div>
...
весь div
повторяется много раз на странице.
Когда я нажимаю на a
Я хочу предупредить "это reqd".
можно ли искать HTML так?
4 ответов
для одного элемента span это должно быть довольно легко. Просто вызовите myFunction (this) по щелчку ссылки и манипулируйте DOM следующим образом :
function myFunction(currObj){
var parentofSelected = currObj.parentNode; // gives the parent DIV
var children = parentofSelected.childNodes;
for (var i=0; i < children.length; i++) {
if (children[i].tagName = "span") {
myValue= children[i].value;
break;
}
}
alert(myValue); // just to test
} // end function
надеюсь, что это работает. Для меня-да !!
С <span>
не является непосредственным брат этой <a>
, мы не можем вызвать .previousSibling
или .previousElementSibling
. Лучшим решением может быть получение родитель и запрос <span>
document.getElementById( 'div1' ).getElementsByTagName( 'a' )[ 0 ].addEventListener('click', function() {
alert( this.parentNode.getElementsByTagName( 'span' )[ 0 ].textContent );
}, false);
обновление: решения с jQuery и без него
этот ответ получил так много downvotes для показа примера с jQuery, что я решил добавить больше примеров с ванильным JavaScript, чтобы любой мог выбрать, использовать jQuery или нет.
как правило, вы можете использовать .previousSibling
в ванильном JavaScript см.:
и вы можете использовать .prev()
в jQuery, см.:
но имейте в виду, что они могут не работать в более сложных случаях, когда вы не знаете точную структуру всего вашего DOM.
вот несколько примеров достижения этой цели как с помощью jQuery, так и с помощью vanilla JavaScript, для простых случаев с фиксированной структурой DOM и для более сложных случаев с использованием классов.
без классы
для самых простых структур DOM вы можете уйти, поставив прослушиватели событий на все ссылки и полагаясь на неявное знание DOM, но это может не сработать для более сложных ситуаций - для тех, кто см. примеры с классами ниже.
С помощью jQuery:
$('a').click(function () {
alert( $(this).prev().text() );
return false;
});
посмотреть демо.
без jQuery:
document.querySelectorAll('a').forEach(link => {
link.addEventListener('click', () => {
alert(link.previousSibling.previousSibling.innerText);
});
});
отметим, что previousSibling
должен использоваться дважды, потому что пустой текстовый узел, который находится между Tha span и link, будет использоваться в противном случае.
посмотреть демо.
используя классы
если span
не сразу, предшествующего a
элемент тогда вы также можете сделать это немного по-другому, также добавив некоторые классы, чтобы убедиться, что ваш код не нарушает никаких других ссылок на странице:
С помощью jQuery:
$('a.link').click(function () {
alert( $(this).parent().find('span.text').text() );
return false;
});
посмотреть демо.
без jQuery:
document.querySelectorAll('a.link').forEach(link => {
link.addEventListener('click', () => {
alert(link.parentNode.querySelector('span.text').innerText);
});
});
посмотреть демо.
приведенный выше код будет привязывать обработчики кликов к каждому a
элемент с классом "ссылка", который будет предупреждать текст, содержащийся его брат span
элемент с классом "текст". (Конечно, имена классов должны быть более описательными.)