Как указывалось ранее, если вы хотите получить список li, вы должны использовать getElementsByTagName на вашем ul, потому что childNodes может получать некоторые текстовые узлы, а также узлы li.
Теперь, если вам нужно использовать индекс в обработчике событий, вам лучше напрямую использовать замыкание для повторного использования переменной цикла внутри обработчика событий.
var lis = document.getElementById("list").getElementsByTagName("li");
for( var i = 0, l = lis.length; i < l; ++i )
{
(function(){
// As a new variable will be created for each loop,
// you can use it in your event handler
var li = lis[i];
li.addEventListener("click", function()
{
li.className = "clicked";
}, false);
})();
}
Но вы можете рассмотреть делегирование событий для этой цели. Вам нужно только прикрепить обработчик событий к родительскому элементу и найти элемент, по которому щелкнули, используя атрибут target.
document.getElementById("list").addEventListener("click", function(event)
{
var li = event.target;
if( li.nodeName.toLowerCase() == "li" )
{
...
}
}, false);