Как использовать это в JavaScript?

В jQuery мы используем:

$("p").click(function(){$(this).hide();});

В приведенном выше утверждении this очень важно, поскольку он скрывает только тот элемент p, на который мы нажимаем. Но вместо этого, если мы используем "p" в месте this, он скроет все элементы p при нажатии любого из элементов p.

Мне было интересно, есть ли способ генерировать тот же эффект с помощью JavaScript. Я пробовал:

document.getElementsByTagName("p").onclick = function(){this.style.display:none;}

и

document.getElementsByTagName("p").onclick = function(){document.getElementsByTagName(this).style.display:none;}

Но ничего из этого не работает.

Ответы

Ответ 1

Вам нужно выполнить итерацию по каждому элементу, а затем использовать addEventListener для присоединения к нему события:

var allP = document.getElementsByTagName("p");
for(i=0; i< allP.length; i++) {
    allP[i].addEventListener('click', function () {
      this.style.display = "none";
    });
}

Рабочий демонстрационный пример

Ответ 2

Как Алекс написал в комментариях:

Мне было интересно, есть ли способ генерировать тот же эффект с помощью JavaScript.

Нет, он работает только с jQuery, который использует темную магию.

jQuery неправильно использует this. Фактически он должен использоваться только в классах, а не в обратных вызовах.

Чтобы добиться такого же эффекта с помощью встроенного DOM:

  • Используйте document.querySelectorAll(), чтобы выбрать все элементы <p>.
  • Преобразуйте результат (NodeList) в массив, используя Array.from().
  • Вызов метода forEach() для выполнения функции для всех элементов.
  • Назначьте прослушиватель событий click для каждого элемента, используя метод addEventListener().
  • Наконец, внутри прослушивателя событий присвойте 'none' в el.style.display, чтобы скрыть элемент.

Демо-версия

Array.from(document.querySelectorAll("p"))
  .forEach(el => el.addEventListener('click', () => el.style.display = 'none'))
<p>Try clicking any of the paragraphs.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla purus metus, ullamcorper tempus augue interdum, efficitur vulputate lectus.</p>
<p>Vestibulum ullamcorper ultrices egestas.</p>
<p>Pellentesque volutpat, est ut convallis interdum, elit metus dapibus ex, non consectetur sem est et felis.</p>

Ответ 3

Шаг1: Получить все абзацы

Шаг 2: Прикрепите элемент clickListener к каждому элементу в параграфах

<html>
<head><title>Test</title></head>

<body>
    <p>This is a paragraph</p>

    <p>This is another paragraph</p>
</body>

<script type="text/javascript">

    function paragraphsClickHandler() {
        this.style.display = "none";
    }

    var paragraphs = document.getElementsByTagName("p");
    var i;

    for(i=0; i<paragraphs.length; i++)
        paragraphs[i].addEventListener("click", paragraphsClickHandler);


</script>
</html>

Ответ 4

Метод document.getElementByTagName не существует.

Вместо этого вы должны использовать document.getElement**s**ByTagName, который возвращает коллекцию:

document.getElementsByTagName("p")[0].onclick = function(){
    this.style.display= "none";
}

Или используйте это для одного и того же примера $("p"):

var elems = document.getElementsByTagName("p");
for(var i = 0; i < elems.length; i++){
    elems[i].onclick = function(){
        this.style.display= "none";
    }
}

Ответ 5

Если вы предпочитаете функции стрелок или не можете доверять this по какой-либо причине, вы можете вместо e.currentTarget:

const elems = document.getElementsByTagName("p");
const handleClick = e => console.log(e.currentTarget); //logs the clicked element

for (let i = 0; i < elems.length; i++) {
  elems[i].addEventListener('click', handleClick);
}

Ответ 6

document.getElementsByTagName( "p" ) возвращает коллекцию. Вам необходимо выполнить итерацию и привязать событие к каждому элементу как:

Array.prototype.slice.call(document.getElementsByTagName("p"))
                     .forEach(function(element) {
                                element.onclick = function() {
                                 element.style.display = 'none';
                                }
                      });

Ответ 7

Поскольку вы используете getElementsByTagName, он даст объект массива, а не один элемент, поэтому вам нужно перебрать его в цикле и связать событие click с каждым элементом, как показано ниже:

var domLength = document.getElementsByName('p').length;
for (var i=0; i<domLength; i++) {
    document.getElementsByName('p')[i].style.display = none;
}

Ответ 8

 var bubblingToEle = function (target, type, value) {
        while(target){
            switch (type){
                case 'nodeName':
                    if(target.nodeName === value){
                        return target;
                    }
                    break;
                default :
                    break;
            }
            target = target.parentNode;
            if(target.nodeName === 'HTML'){
                break;
            }
        }
        return null;
    }
    document.body.addEventListener('click', function (e) {
        var target = e.target,
            isPTag = bubblingToEle(target, 'nodeName', 'P');

        if(isPTag){
            isPTag.style.display = 'none';
        }
    })

Я думаю, что это лучше, не нужно связывать много слушателей.