Как правильно повесить функцию при цикличном создании div блоков?
Доброго времени суток. Подскажите пожалуйста, как нужно правильно повесить функцию в данном примере, чтобы в алерт вывелось название элемента по которому создался блок?
Никак не могу допетрить. Можно, конечно, присвоить создаваемому блоку id с одноименным названием из массива, и потом послать его в алерт - но этот вариант не подходит.
<style type="text/css">
.div_class{position:relative; display: inline-block; background-color:gray; border:1px solid red; width:30px; height:30px; margin-left:5px; cursor:pointer;}
.div_class:hover{background-color:green;}
</style>
<body>
<script>
var arr = ["raz","dva","tri"]
for(i=0; i<arr.length; i++){
var box_div = document.createElement('div')
box_div.className='div_class'
document.body.appendChild(box_div)
box_div.onmouseup=function(){alert(arr[i])}
}
</script>
|
<style type="text/css">
.div_class{position:relative; display: inline-block; background-color:gray; border:1px solid red; width:30px; height:30px; margin-left:5px; cursor:pointer;}
.div_class:hover{background-color:green;}
</style>
<body>
<script>
var arr = ["raz","dva","tri"]
for(i=0; i<arr.length; i++){
var box_div = document.createElement('div');
box_div.className='div_class';
document.body.appendChild(box_div);
addHandler.call(box_div, arr[i]);
}
function addHandler(num) {
this.onmouseup=function(){alert(num);};
};
</script>
Не буду претендавать на то что мое решение самое верное. |
Классическая ошибка. Ваша функция onmouseup будет вызвана уже после окончания цикла, по событию mouseup. А к этому времени значение i проитерируется с 0 до 4 и четверкой так и останется. В итоге arr[4] == undefined.
Вариант:
<style type="text/css">
.div_class{position:relative; display: inline-block; background-color:gray; border:1px solid red; width:30px; height:30px; margin-left:5px; cursor:pointer;}
.div_class:hover{background-color:green;}
</style>
<body>
<script>
var arr = ["raz","dva","tri"]
var fn = function(i, e) {
alert(arr[i])
}
var ret = function(i) {
return function(e) {
fn.apply(this, [i, e])
}
}
for(var i=0; i<arr.length; i++){
var box_div = document.createElement('div')
box_div.className='div_class'
document.body.appendChild(box_div)
box_div.onmouseup= ret(i)
}
</script>
|
Всё верно, всё правильно :) Я уже понял что нужно в алерт выводить другой функцией, открыл для себя интересный метод call )) Спасибо вам ребята :)
|
| Часовой пояс GMT +3, время: 19:47. |