Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Onclick элемента списка <li> (https://javascript.ru/forum/events/21309-onclick-ehlementa-spiska-li.html)

eternal 04.09.2011 23:38

Onclick элемента списка <li>
 
После получения данных ajax обрабатываю xml, создаю список и каждому пункту присваиваю onclick. При этом если делать это через li.onclick (закомментировано) то работает некорректно: при нажатии на любой пункт списка - вызывается значение присваиваемое последнему пункту. Если делать через setAttrubite то работает правильно..
for (var i=0; i<listArray.length; i++)
     {
	     html = "";
		 li = document.createElement('li');
		 id = null;
	 	 id = listArray.item(i).getAttribute("id");

		 //li.onclick = function(){GetItem(id)};
		 li.setAttribute("onclick","GetItem("+id+")");
		 
		 if (!listArray.item(i).firstChild){
		 html += "-без названия-";
		 }
		 else{
		 html += listArray.item(i).firstChild.data;
		 }
 
li.innerHTML = html;
myUl.appendChild(li);
	 }

Как исправить?

devote 05.09.2011 06:45

for (var i=0; i<listArray.length; i++) 
     { 
         html = ""; 
         li = document.createElement('li'); 
         id = null; 
         id = listArray.item(i).getAttribute("id"); 
  
         (function( id ) {
             li.onclick = function(){
                 GetItem( id );
             }
         })( id );
           
         if (!listArray.item(i).firstChild){ 
         html += "-без названия-"; 
         } 
         else{ 
         html += listArray.item(i).firstChild.data; 
         } 
   
li.innerHTML = html; 
myUl.appendChild(li); 
     }

eternal 05.09.2011 20:18

Спасибо, работает. Скажите пожалуйста что надо почитать чтобы понять как это работает..

devote 05.09.2011 21:08

Замыкания

ваый 05.09.2011 22:04

а можно и без замыканий:
for (var i=0; i<listArray.length; i++)
     {
         html = "";
         li = document.createElement('li');
         id = null;
         id = listArray.item(i).getAttribute("id");
   
         *!*
         with ({id: id}) {
             li.onclick = function(){
                 GetItem( id );
             }
         }
*/!*
            
         if (!listArray.item(i).firstChild){
         html += "-без названия-";
         }
         else{
         html += listArray.item(i).firstChild.data;
         }
    
li.innerHTML = html;
myUl.appendChild(li);
     }

Прикольная тема :)

devote 05.09.2011 22:18

ну да тока вот with в strict режиме вроде как ошибку выдает... где-то я об этом читал... хотя может путаю.


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