Проблема с вашим исходным кодом заключается в том, что вы создаете замыкание для переменной n
.Когда вызывается обработчик события, он вызывается со значением n
в точке вызова, а не в точке объявления.Вы можете увидеть это, добавив предупреждение:
$(document).ready(function() {
var numSpans = $("span").length;
for (n = 1; n <= numSpans; n++) {
$("a#update" + n).click(function(e) {
alert(n); //Alerts '6'
$('span#sp' + n).replaceWith('this');
e.preventDefault();
});
}
})
Один из способов исправить это - создать замыкание на значение n в каждой итерации, например:
$(document).ready(function() {
var numSpans = $("span").length;
for (n = 1; n <= numSpans; n++) {
$("a#update" + n).click(
(function(k) {
return function(e) {
alert(k);
$('span#sp' + k).replaceWith('this');
e.preventDefault();
}
})(n)
);
}
})
Тем не менее, это грязно, и вам лучше использовать более jQuery-y метод.
Один из способов сделать это - удалить id
s из вашего кода.Если они вам не нужны для чего-то другого, они не требуются:
<p><span>that1</span> <a href="#" class="update">Update1</a></p>
<p><span>that2</span> <a href="#" class="update">Update2</a></p>
<p><span>that3</span> <a href="#" class="update">Update3</a></p>
<p><span>that4</span> <a href="#" class="update">Update4</a></p>
<p><span>that5</span> <a href="#" class="update">Update5</a></p>
jQuery:
$(function() {
$('a.update').live('click', function() {
$(this).siblings('span').replaceWith("Updated that!");
});
});
jsFiddle