我似乎无法让这个工作。我正在使用jquery来创建一个html选择,我想要一些代码在其值发生变化时执行。
代码如下:
<script type ="text/javascript">
var firstweddingturn = '400';
$('#weddingturn').change(function() {
alert ("Wedding select change triggered!");
//var wedturn = $('#weddingturnselectid').val();
//$('#div3').append('<br>Wedding turn selected, ' + wedturn + '</br>')
});
$(document).ready(function() {
var html = [];
html[html.length] = '<select name="weddingturn" id="weddingturn">';
var a = firstweddingturn;
var b = Number(firstweddingturn) + 16;
while (a < b) {
// do some code
html[html.length] = '<option name="asdf" value = "1">' + a + '</option>';
a++;
} // end while
html[html.length] = '</select>';
$('#div1').append(html.join(''));
});
</script>
我做错了什么?
答案 0 :(得分:2)
您需要使用.delegate()
(或.live()
),因为您要动态添加选择。当您使用.change()
附加onChange处理程序时,它仅附加到<strong>现有匹配元素,而不是稍后添加的元素。要将事件附加到所有匹配的元素(包括稍后添加到页面中的元素),请使用.delegate()
函数,如下所示:
$('body').delegate('#weddingturn','change', function(){
alert('Wedding select changed to ' + $(this).find('option:selected').val() );
});
但是,正如一些人指出的那样,您只需在将<select>
添加到DOM后立即附加事件处理程序。这样,您仍然可以使用.change()
,并且您的代码应该运行得更快。
答案 1 :(得分:1)
包括这个:
$('#weddingturn').live('change', function() {
alert ("Wedding select change triggered!");
//var wedturn = $('#weddingturnselectid').val();
//$('#div3').append('<br>Wedding turn selected, ' + wedturn + '</br>')
});
在$(document).ready
并将其更改为使用live
答案 2 :(得分:1)
绑定.change()
事件时,该元素尚不存在。你有两个选择:
.delegate()
(或.live()
)告诉jQuery在将事件添加到DOM时将事件绑定到与选择器匹配的任何元素。如果您选择此选项,如果您使用的是最新版本的jQuery delegate()
,> 1.4.2
是首选方法,因为它比live()
更高效。答案 3 :(得分:0)
您正在动态地将select
添加到DOM中,在声明事件处理程序时,select
doest不存在,因此事件处理程序不会绑定到元素use {{ 1}}将事件处理程序附加到动态添加的元素
.live
答案 4 :(得分:0)
您需要使用live
进行绑定,因为它是在DOM加载后加载的:
$("#weddingturn").live("change", function() {
});
另外,我会把它放在$(document).ready
的范围内,最好是在加载它的代码之后(仅为了逻辑线性)。
答案 5 :(得分:0)
在创建元素之前,你正在连接事件处理程序。
(您可以使用.live()或者您只需交换操作顺序)
答案 6 :(得分:-1)
您正在一个尚不存在的选择上设置change
功能。将.change
来电转移到.append