Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > обработчик события для всего массива


Автор: GF 6.2.2007, 13:23
Есть простой пример:
Код

<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
  <title></title>
  <script>
  function selector(node){    
      node.items = node.getElementsByTagName('li'); 
      node.selected=node.items[0]
      for(var i = 0; i < node.items.length; i++){   
          node.items[i].onclick = function(){
              this.style.backgroundColor = 'white';    
              node.selected.style.backgroundColor = 'whitesmoke';    
              node.selected = this;
          }
      }
  }
  </script>
</head>
<body onload="selector(document.getElementById('list'))" style="background-color: whitesmoke;">
<h1>Сделать проще</h1>
<div id="list">
<ul>

<li style="background-color: white;">тест 1</li>
<li>тест 2</li>
<li>тест 3</li>
<li>тест 4</li>
<li>тест 5</li>
</ul>

<ul>
<li>тест 6</li>
<li>тест 7</li>
<li>тест 8</li>
<li>тест 9</li>
<li>тест 10</li>
</ul>
</div>
</body>
</html>

Хочется сделать так, чтоб не пришлось пробегать по всему массиву  for(var i = 0; i < node.items.length; i++)   присваивая каждому элементу одну и ту же функцию на щелчок мыши, а присвоить onclick сразу для всех элементов массива. К сожалению со свойствами prototype и constructor я знаком плохо, так что прошу помощи у вас. Заранее благодарен.

Автор: SelenIT 6.2.2007, 14:44
Цитата(GF @  6.2.2007,  13:23 Найти цитируемый пост)
со свойствами prototype и constructor я знаком плохо

Боюсь, что IE принменительно к HTML-элементам знаком с ними еще хуже... А почему бы просто не ловить событие на самом диве?
Код

function selector(node){
      node.selected=node.getElementsByTagName('li')[0];
      node.onclick = function(e){
          ob = e ? e.target : event.srcElement;
          if (ob.tagName.toLowerCase() != 'li') return;
          ob.style.backgroundColor = 'white';    
          node.selected.style.backgroundColor = 'whitesmoke';    
          node.selected = ob;
      }
  }

Автор: GF 6.2.2007, 17:41
SelenIT, это конечно вариант, но проблема состояла не в том, что моё вероисповедание не позволяет мне пользоваться циклом for. Я хотел разобраться, можно ли цеплять обработчик события ко всем элементам массива сразу, не пробегая по каждому элементу, а такой пример я привёл просто для наглядности. Есть ещё мысли? Или это нереально реализовать?

Автор: 12345c 6.2.2007, 19:53
В данном монастыре устав этого не позволяет. Ммм. Над объектами документа абстракция прототипа не действует, в чём легко убедиться, попытавшись записать
Код
Object.prototype.onmouseover=function(){alert(this.id);}

Зато все объекты JS приобретут это свойство:
Код
b=[1,2,3]
alert(b.onmouseover)
Но смысла события она иметь не будет. Да и слишком катастрофично это бы было - все объекты приобретают один обработчик. Нужна тогда иерархия классов, чтобы классу присвоить обработчик. В IE с этим с успехом справляется behavior.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)