Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.07.2016, 10:45
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

getElementsByClassName не срабатывает на clicks
Добрый день уважаемые. Вот столкнулся с недопониманием работы метода getElementsByClassName. Может кто объяснить где я косячу ? https://jsfiddle.net/BlackStar1991/3xe1fp9r/
Если работать через идентификаторы всё работает, а вот через классы оно не срабатывает.
Ответить с цитированием
  #2 (permalink)  
Старый 13.07.2016, 11:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
нужен цикл по всему списку элементов
Сообщение от Black_Star
Elements
Ответить с цитированием
  #3 (permalink)  
Старый 13.07.2016, 12:35
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

https://jsfiddle.net/BlackStar1991/3xe1fp9r/3/
Тоесть что бы назначить на каждый элемент класса некое действие по средством нажатия кнопки мыши, надо пилить цикл ?

var buttonClick = document.getElementsByClassName('Buttons');
  buttonClick.onclick = function() 
  { for (i=0; i< buttonClick.length; i++) 
        alert("OK class");
  };
Ответить с цитированием
  #4 (permalink)  
Старый 13.07.2016, 12:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
да нужен цикл. пока тот же бред в коде.
Ответить с цитированием
  #5 (permalink)  
Старый 13.07.2016, 13:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
var buttonClick = document.getElementsByClassName('Buttons');
/* можно так */
   for (i=0; i< buttonClick.length; i++)
   buttonClick[i].onclick = function()
  {     alert("OK class");
  };
/* а лучше так */
[].slice.call(buttonClick).forEach(function(item) {
        item.addEventListener('click', function() {
           alert("OK class");
        });
    });
/* или так */
[].forEach.call(document.querySelectorAll('.Buttons'), function(item) {
        item.addEventListener('click', function() {
           alert("OK class");
        });
    });
Ответить с цитированием
  #6 (permalink)  
Старый 13.07.2016, 19:49
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

HTMLCollection.prototype.addEventListener = function() {
    for(var i = 0; i < this.length; i++) {
        Element.prototype.addEventListener.apply(this[i], Array.prototype.slice.call(arguments));
    }
};



document.getElementsByClassName('foo').addEventListener('click', function() {
   alert('Click on div.foo');
});


document.getElementsByClassName('bar').addEventListener('click', function() {
   alert('Click on div.bar');
});


Но лучший вариант - делегировать событие!
Ответить с цитированием
  #7 (permalink)  
Старый 14.07.2016, 09:05
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Сообщение от рони Посмотреть сообщение
рони,
var buttonClick = document.getElementsByClassName('Buttons');
/* можно так */
   for (i=0; i< buttonClick.length; i++)
   buttonClick[i].onclick = function()
  {     alert("OK class");
  };
/* а лучше так */
[].slice.call(buttonClick).forEach(function(item) {
        item.addEventListener('click', function() {
           alert("OK class");
        });
    });
/* или так */
[].forEach.call(document.querySelectorAll('.Buttons'), function(item) {
        item.addEventListener('click', function() {
           alert("OK class");
        });
    });
Спасибо всё сработало.
Сообщение от Ruslan_xDD Посмотреть сообщение
HTMLCollection.prototype.addEventListener = function() {
    for(var i = 0; i < this.length; i++) {
        Element.prototype.addEventListener.apply(this[i], Array.prototype.slice.call(arguments));
    }
};



document.getElementsByClassName('foo').addEventListener('click', function() {
   alert('Click on div.foo');
});


document.getElementsByClassName('bar').addEventListener('click', function() {
   alert('Click on div.bar');
});


Но лучший вариант - делегировать событие!
Пишет что document.getElementsByClassName(...).addEventListe ner is not a function. А что подразумевается под делегировать событие, и чем это лучше ?
Ответить с цитированием
  #8 (permalink)  
Старый 14.07.2016, 11:41
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Большое спасибо за советы.
Ещё вопросик, а как реализовать событие (проказа/спрятывания) по клику. Вот к примеру
https://jsfiddle.net/3xe1fp9r/5/
У меня по клику на объект отображаются (меняется стиль) у всех классов, а как сделать привязку к конкретному (вложеному классу) - 1)По нажатию на красный квадрат отображались только красный круг который в него вложен)
2)Ну и ещё задам вопрос как по второму нажатию на объект этот встроенный класс прятать ?
Ответить с цитированием
  #9 (permalink)  
Старый 14.07.2016, 11:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
пока помедитируйте над .classList.toggle
Ответить с цитированием
  #10 (permalink)  
Старый 14.07.2016, 15:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Black_Star,
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
  <style type="text/css">
        #element1 {
        width: 150px;
        height: 150px;
        margin: 10px;
        background-color: red;
        display: block;
    }

    #element2 {
        width: 150px;
        height: 150px;
        margin: 10px;
        background-color: green;
    }


    .redCircle{
        width: 50px;
    height: 50px;
    border: 1px solid white;
    border-radius: 50%;
    background-color: red;
    font-size: 1.5em;
    text-align: center;
    vertical-align: middle;
    color:white;
    display: none;
}

    .greenCircle {
    width: 50px;
    height: 50px;
     border: 1px solid white;
    border-radius: 50%;
    background-color: green;
    text-align: center;
    vertical-align: middle;
    font-size: 1.5em;
    color:white;
}

.Buttons.active .redCircle {
  display: block;
}

  </style>

  <title></title>
<script>
window.onload=function(){

var buttonClick = document.getElementsByClassName('Buttons');
var redCircle = document.getElementsByClassName('redCircle');
var greenCircle = document.getElementsByClassName('greenCircle');
// Реализация событий по клику мышки

    for (var i=0; i< buttonClick.length; i++){
    buttonClick[i].onclick= function() {
        this.classList.toggle("active")
    };


}
}//]]>

</script>


</head>

<body>

 <div class="Buttons">
    <div id="element1">
        Button1

            <div class="redCircle">1</div>
            <div class="greenCircle">2</div>

    </div>

</div>
<div class="Buttons">
    <div id="element2">
        Button2

            <div class="redCircle">3</div>
            <div class="greenCircle">4</div>


    </div>
</div>



</body>

</html>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
onclick срабатывает со 2 раза в ie djonA Общие вопросы Javascript 19 25.03.2013 01:07
Не срабатывает обработчик window.onload. Alex82 Events/DOM/Window 16 22.02.2013 21:06
AJAX запрос в Internet Explorer срабатывает через раз nikolayseo jQuery 5 13.11.2012 00:13
Нажатие по дате в календаре срабатывает только со второго клика afr0 Events/DOM/Window 4 31.10.2012 13:39
Не срабатывает обертка фун-и в IE8 zilker Internet Explorer 6 16.07.2012 18:54