04.05.2011, 18:32
|
|
Кандидат Javascript-наук
|
|
Регистрация: 28.06.2009
Сообщений: 120
|
|
Добавление события в цикле
Здравсвуйте.
Подскажите пожалуйста, почему не работает код.
Если добавляю событие для одного элемента по getElementById то все ок, а когда добавляю в цикле для елементов getElementByTagName то не работает
<script type="text/javascript">
window.onload = function()
{
var aTag = document.getElementsByTagName("A");
for( var i = 0; i <= aTag.length; i ++ )
{
var links = aTag[i];
addEvent( links, 'click', handler );
}
var handler = function() { alert("Hello") }
}
function addEvent(elem, evType, fn) {
if (elem.addEventListener) {
elem.addEventListener(evType, fn, false);
}
else if (elem.attachEvent) {
elem.attachEvent('on' + evType, fn);
}
else {
elem['on' + evType] = fn;
}
}
</script>
<body>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
</body>
|
|
04.05.2011, 18:44
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Нужно в цикле for проверять не <=, а <.
UPD: А еще было бы неплохо присвоить функцию переменной handler перед тем, как передавать ее, а то ж undefined передаешь.
Последний раз редактировалось Sweet, 04.05.2011 в 18:47.
|
|
04.05.2011, 20:22
|
|
Кандидат Javascript-наук
|
|
Регистрация: 28.06.2009
Сообщений: 120
|
|
Сообщение от Sweet
|
Нужно в цикле for проверять не <=, а <.
UPD: А еще было бы неплохо присвоить функцию переменной handler перед тем, как передавать ее, а то ж undefined передаешь.
|
Но почему тогда, когда я добавляю ф-ю по id все работает и undefined не выводиться?
|
|
04.05.2011, 20:35
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от Armen
|
Но почему тогда, когда я добавляю ф-ю по id все работает и undefined не выводиться?
|
А можно код?
|
|
04.05.2011, 21:25
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Armen, вы написали полный бред...
я понимаю, если нужно несколько событий повестить на элемент:
<script type="text/javascript">
window.onload = function() {
var event = ['keyup', 'change'],
forma = document.forms['forma'],
i = forma.elements.length;
while(i--) {
forma['on'+event[i]] = function(i) {
return function() {
var input = this.elements[0].value;
this.elements[1].value = input == '' ? '' : input;
};
}(i);
}
};
</script>
<form name="forma">
<input type="text" value="" />
<input type="text" value="" />
</form>
однако в вашем случае, я уверен больше чем на 100% что вы пытаетесь получить примерно это:
<script type="text/javascript">
window.onload = function() {
var div = document.getElementById('div').getElementsByTagName('a'), i = div.length;
while(i--) {
div[i].onclick = function(i) {
return function() {
alert(i);
};
}(i);
}
};
</script>
<div id="div">
<a href="#">click</a>
<a href="#">click</a>
<a href="#">click</a>
</div>
|
|
04.05.2011, 22:33
|
|
Кандидат Javascript-наук
|
|
Регистрация: 28.06.2009
Сообщений: 120
|
|
Сообщение от monolithed
|
Armen, вы написали полный бред...
я понимаю, если нужно несколько событий повестить на элемент:
<script type="text/javascript">
window.onload = function() {
var event = ['keyup', 'change'],
forma = document.forms['forma'],
i = forma.elements.length;
while(i--) {
forma['on'+event[i]] = function(i) {
return function() {
var input = this.elements[0].value;
this.elements[1].value = input == '' ? '' : input;
};
}(i);
}
};
</script>
<form name="forma">
<input type="text" value="" />
<input type="text" value="" />
</form>
однако в вашем случае, я уверен больше чем на 100% что вы пытаетесь получить примерно это:
<script type="text/javascript">
window.onload = function() {
var div = document.getElementById('div').getElementsByTagName('a'), i = div.length;
while(i--) {
div[i].onclick = function(i) {
return function() {
alert(i);
};
}(i);
}
};
</script>
<div id="div">
<a href="#">click</a>
<a href="#">click</a>
<a href="#">click</a>
</div>
|
Тоесть вы хотите сказать, что addEventListener и attachEvent нужно использовать только тогда, когда необходимо "весить" несколько событий на один элемент?
и вы считаете, что этот код полная чушь ?
<script type="text/javascript">
window.onload = function()
{
var aTag = document.getElementsByTagName("A");
var handler = function() { alert("Hello") }
addEvent( aTag, 'click', handler );
for( var i = 0; i <= aTag.length; i ++ )
{
var links = aTag[i];
addEvent( links, 'click', handler );
}
}
function addEvent(elem, evType, fn) {
if (elem.addEventListener) {
elem.addEventListener(evType, fn, false);
}
else if (elem.attachEvent) {
elem.attachEvent('on' + evType, fn);
}
else {
elem['on' + evType] = fn;
}
}
</script>
<body>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
<a href="#">Click</a>
</body>
Я новичек в js поэтому буду крайне признателен, если вы объясните, почему. Спасибо большое за помощь
Последний раз редактировалось monolithed, 05.05.2011 в 14:25.
|
|
04.05.2011, 22:41
|
|
Кандидат Javascript-наук
|
|
Регистрация: 28.06.2009
Сообщений: 120
|
|
Сообщение от Sweet
|
А можно код?
|
Спасибо, помогло, переставил ф-ю в начало, кода, как вы и сказали
|
|
04.05.2011, 23:11
|
|
Кандидат Javascript-наук
|
|
Регистрация: 28.06.2009
Сообщений: 120
|
|
Сообщение от Sweet
|
А можно код?
|
Работает везде, кроме IE8 и ниже, подскажите пожалуйста, в чем проблема
|
|
05.05.2011, 06:48
|
|
prodigy
|
|
Регистрация: 01.11.2010
Сообщений: 503
|
|
Сообщение от Armen
|
or( var i = 0; i <= aTag.length; i ++ )
|
не может везде работать так как нет элемента aTag[aTag.length], уберите знак равно, вам же сказали.
Сообщение от Armen
|
Тоесть вы хотите сказать, что addEventListener и attachEvent нужно использовать только тогда, когда необходимо "весить" несколько событий на один элемент?
|
Если обработчик один то какой смысл пользоваться addEvent?
__________________
readOnly
|
|
|
|