Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   создание элементов динамически DOM (https://javascript.ru/forum/events/60426-sozdanie-ehlementov-dinamicheski-dom.html)

Сергей_Р 28.12.2015 20:11

создание элементов динамически DOM
 
Подскажите как повесить событие (например onclick) на динамически созданный (createElement) элемент (например <button>).
:help:

рони 28.12.2015 20:52

Сергей_Р,
повесить при создании или использовать делегирование, а лучше код покажите.

Сергей_Р 28.12.2015 21:21

var my_div = document.getElementsByTagName('div');

var addButton = function (e) {
if (e.target.className === 'block') {
var my_button = document.createElement("button"),
id_element = document.getElementById("button_v"),
text = document.createTextNode("Кнопка");

my_button.appendChild(text);
my_button.setAttribute('id', 'plus_v');
my_button.classList.add('my_button');
id_element.appendChild(my_button);

}
my_div[0].removeEventListener('mouseover', addButton);
}


var addCell = function (e) {
var div = document.createElement("div"),
cell = document.getElementById("cell"),
text_v = document.createTextNode("Cell V");

if (e.target.id === 'plus_v') {
div.classList.add('block_vertical');
div.appendChild(text_v);
cell.appendChild(div);


}
}

var buttons = document.getElementsByTagName('button');

for (var i = 0, len = buttons.length; i < len; i++) {
buttons[i].addEventListener('click', addCell, false);
}

Сергей_Р 28.12.2015 21:21

Как с помощью делегирования? не могу ни как с этим разобраться

рони 28.12.2015 21:49

Сергей_Р,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Сергей_Р 28.12.2015 22:03

var my_div = document.getElementsByTagName('div');

var addButton = function (e) {
if (e.target.className === 'block') {
var my_button = document.createElement("button"),
id_element = document.getElementById("button_v"),
text = document.createTextNode("Кнопка");

my_button.appendChild(text);
my_button.setAttribute('id', 'plus_v');
my_button.classList.add('my_button');
id_element.appendChild(my_button);

}
my_div[0].removeEventListener('mouseover', addButton); 
}


var addCell = function (e) {
var div = document.createElement("div"), 
cell = document.getElementById("cell"), 
text_v = document.createTextNode("Cell V");

if (e.target.id === 'plus_v') {
div.classList.add('block_vertical'); 
div.appendChild(text_v);
cell.appendChild(div); 


}
}

var buttons = document.getElementsByTagName('button');

for (var i = 0, len = buttons.length; i < len; i++) {
buttons[i].addEventListener('click', addCell, false);
}

Сергей_Р 28.12.2015 22:12

Если имеется одна кнопка html. При ее нажатии динамически создается вторая (c определенным id или class). Как с помощью делегирования на вторую повесить событие, предварительно описанное? Что б при нажатии на вторую срабатывало еще событие.

Сергей_Р 28.12.2015 22:14

var my_div = document.getElementsByTagName('div');

var addButton = function (e) {
    if (e.target.className === 'block') {
        var my_button = document.createElement("button"),
            id_element = document.getElementById("button_v"),
            text = document.createTextNode("Кнопка");

        my_button.appendChild(text);
        my_button.setAttribute('id', 'plus_v');
        my_button.classList.add('my_button');
        id_element.appendChild(my_button);

    }
    my_div[0].removeEventListener('mouseover', addButton); 
}


var addCell = function (e) {
    var div = document.createElement("div"), 
        cell = document.getElementById("cell"), 
        text_v = document.createTextNode("Cell V");

    if (e.target.id === 'plus_v') {
        div.classList.add('block_vertical'); 
        div.appendChild(text_v);
        cell.appendChild(div); 

   
    }
}

var buttons = document.getElementsByTagName('button');

for (var i = 0, len = buttons.length; i < len; i++) {
    buttons[i].addEventListener('click', addCell, false);
}

рони 28.12.2015 22:31

Сергей_Р, смутно вас понимаю но делегирование можно так, вместо алерта впишите что вам нужно
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .area{
     width: 200px;
     height: 200px;
     border: 5px solid #FF0000;
  }
  .go {
     width: 210px;
     height: 20px;
     background-color: #CD853F;
  }
  .lime{
  background-color: #00FF00;
}

  </style>
</head>

<body>
<div class="go">create</div>
<div class="area">area</div>
<script>
window.addEventListener('DOMContentLoaded', function() {
  var go = document.querySelector('.go'),
  area = document.querySelector('.area');
  go.addEventListener('click', function() {
      var div = document.createElement("div"),
      text_v = document.createTextNode("узнать индекс");
      div.appendChild(text_v);
      area.appendChild(div);
      div.classList.add('lime')
  });
   area.addEventListener('click', function (event) {
     var cls = event.target.classList;
     if(cls && cls.contains('lime')) {
       var index = [].indexOf.call(document.querySelectorAll('.lime'), event.target)
       alert(index); //или любое нужное вам событие
     }

  });
  });
</script>
</body>

</html>

рони 28.12.2015 22:34

Сергей_Р,
https://learn.javascript.ru/event-delegation


Часовой пояс GMT +3, время: 04:48.