Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.07.2013, 00:02
Новичок на форуме
Отправить личное сообщение для sanambler Посмотреть профиль Найти все сообщения от sanambler
 
Регистрация: 22.07.2013
Сообщений: 2

onClick для добавленного элемента в DOM
Помогите, пожалуйста, разобраться и по грамотному повесить событие на span (Картинка '+/-'). Если делать так:
Код:
/*before*/
span.onclick = function () {
    alert();
}
/*after*/
то, похоже, что span погибает после каждого захода, и забирает с собой повешенное на него событие. Вроде)

Код:
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>js - фарева</title>
  <script>
    function __dscArr(tag, arr) {
      /*
      Вывод в указаный tag информацию о массиве: (key: value)
      */
      var ul = document.createElement('ul');
      var li = document.createElement('li');
      var span = document.createElement('span');
      var addClass = 'bivariate-array';
      var mas = [];

      //Построение
      tag.appendChild(ul);
      for (var key in arr) {
        if (Object.prototype.toString.call(arr[key]) === '[object Array]') {
          li.className = addClass;
          ul.appendChild(li);
          li.appendChild(span);

          /*before*/
          span.onclick = function () {
            alert();
          }
          /*after*/

          li.innerHTML += '' +
              '<b>' + key + ':' + '</b>'
          ;
          __dscArr(li, arr[key]);
        }
        else {
          ul.innerHTML += '' +
              '<li>' +
              '<b>' + key + ': ' + '</b>' +
              '<span>' + arr[key] + '</span>' +
              '</li>'
          ;
        }
      }
    }
  </script>
  <script>
    window.onload = function () {
      var mass = [
        0,
        [
          0, 1,
          [0, 1,
            [0, 1, 2, 3]
          ],
          3, 4
        ],
        2, 3, 4
      ];

      __dscArr(desc, mass);
    }
  </script>

  <style>
    * {
      margin: 0;
      padding: 0;
    }
    body {
      margin: 15px;
    }
    ul li {
      list-style-type: none;
    }
    li.bivariate-array {
      position: relative;
    }
    li.bivariate-array > span {
      position: absolute;
      top: 6px;
      left: -11px;
      width: 9px;
      height: 9px;
      background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAJwAAACcBKgmRTwAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8yMi8xM4uhIv4AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAmUlEQVQ4jeVTSQ7EIAyzK/4d+DjupUGIApE63MYXIuHsMXPOAiCsQTNjKSXkJQAys2vFKKXUxwx5r0+Su+xbLDN9QXKjr8htSRwdurYbvP0WzB1JahZkdJzhaJuvYLuqIiQAnM2hgwcPeZQ+X8I0a3jZkvhsOFaApOUiSDYFRLw/UQAB1H4WowJIVkmXv6uqpjP7BUcVcPTObiyVZin7rh6UAAAAAElFTkSuQmCC") no-repeat -10px 0;
      cursor: pointer;
    }
    li.bivariate-array > span:hover {
      background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAJwAAACcBKgmRTwAAABZ0RVh0Q3JlYXRpb24gVGltZQAwNy8yMi8xM4uhIv4AAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAAmUlEQVQ4jeVTSQ7EIAyzK/4d+DjupUGIApE63MYXIuHsMXPOAiCsQTNjKSXkJQAys2vFKKXUxwx5r0+Su+xbLDN9QXKjr8htSRwdurYbvP0WzB1JahZkdJzhaJuvYLuqIiQAnM2hgwcPeZQ+X8I0a3jZkvhsOFaApOUiSDYFRLw/UQAB1H4WowJIVkmXv6uqpjP7BUcVcPTObiyVZin7rh6UAAAAAElFTkSuQmCC") no-repeat -10px -10px, #eee;
    }
    li.bivariate-array ul {
      margin-left: -7px;
      padding-left: 30px;
      border-left: 1px dashed #ccc;
      word-wrap: break-word;
    }
  </style>
</head>
<body>
  <div id='desc'></div>
</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 23.07.2013, 00:21
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от sanambler
li.innerHTML += '' +
'<b>' + key + ':' + '</b>'
;
Вот тут ты перезаписываешь свойство innerHTML. Твой старый <span> таким образом исчезает из <li>, затем браузер парсит новый innerHTML и создает новый <span>, но это уже другой элемент.

Варианты решения:
1) Не трогать innerHTML вообще. Использовать только DOM-методы.
2) Вставлять часть innerHTML через insertAdjacentHTML
3) Изменять innerHTML, затем только вставлять <span> через insertBefore
4) Делегировать обработчик события родительскому элементу.
Ответить с цитированием
  #3 (permalink)  
Старый 23.07.2013, 00:49
Новичок на форуме
Отправить личное сообщение для sanambler Посмотреть профиль Найти все сообщения от sanambler
 
Регистрация: 22.07.2013
Сообщений: 2

Сообщение от danik.js Посмотреть сообщение
2) Вставлять часть innerHTML через insertAdjacentHTML
Благодарю) Есть прогресс!
Код:
  /*before*/
  span.onclick = function () {
    alert('fdas');
  }
  /*after*/

  li.insertAdjacentHTML('beforeend',
      '<b>' + key + ':' + '</b>'
  );

  __dscArr(li, arr[key]);
}
else {
  ul.insertAdjacentHTML('beforeend',
      '<li>' +
          '<b>' + key + ': ' + '</b>' +
          '<span>' + arr[key] + '</span>' +
          '</li>'
  );
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создание элемента именно в DOM bayanruby Events/DOM/Window 4 26.11.2012 20:58
удаление элемента dom Catherine Events/DOM/Window 0 28.10.2011 23:35
Для события onCLick получить индекс строки и объект грида. progi2007 ExtJS 4 05.08.2009 11:31
Функция onclick для созданных потомков Groonel Общие вопросы Javascript 6 24.04.2009 18:35
Применение функции для каждого элемента sergeygerasimov jQuery 2 26.11.2008 11:15