jquery创建了select,并在更改时触发

我似乎无法让这个工作。 我正在使用jquery创建一个html选择,我想要一些代码在其值发生变化时执行。

代码如下:

 var firstweddingturn = '400'; $('#weddingturn').change(function() { alert ("Wedding select change triggered!"); //var wedturn = $('#weddingturnselectid').val(); //$('#div3').append('
Wedding turn selected, ' + wedturn + '
') }); $(document).ready(function() { var html = []; html[html.length] = ''; var a = firstweddingturn; var b = Number(firstweddingturn) + 16; while (a < b) { // do some code html[html.length] = '' + a + ''; a++; } // end while html[html.length] = ''; $('#div1').append(html.join('')); });

我究竟做错了什么?

您需要使用.delegate() (或.live() ),因为您要动态添加select。 当您使用.change()附加onChange处理程序时,它仅附加到现有的匹配元素,而不是稍后添加的元素。 要将事件附加到所有匹配的元素(包括稍后添加到页面中的元素),请使用.delegate()函数,如下所示:

 $('body').delegate('#weddingturn','change', function(){ alert('Wedding select changed to ' + $(this).find('option:selected').val() ); }); 

但是,正如一些人所指出的那样,只需在将添加到DOM后立即附加事件处理程序即可。 这样,你仍然可以使用.change() ,你的代码应该运行得更快。

包括这个:

  $('#weddingturn').live('change', function() { alert ("Wedding select change triggered!"); //var wedturn = $('#weddingturnselectid').val(); //$('#div3').append('
Wedding turn selected, ' + wedturn + '') });

在你的$(document).ready

并将其更改为使用live

绑定.change()事件时,该元素尚不存在。 你有2个选择:

  1. 创建元素后绑定事件( 最简单和推荐的选项
  2. 使用.delegate() (或.live() )告诉jQuery在将事件添加到DOM时将事件绑定到与选择器匹配的任何元素。 如果选择此选项,如果您使用的是最新版本的jQuery > 1.4.2 ,则delegate()是首选方法,因为它比live()> 1.4.2

你需要使用live绑定,因为它是在DOM加载后加载的:

 $("#weddingturn").live("change", function() { }); 

另外,我会将它放在$(document).ready范围内,最好是在加载它的代码之后(仅为了逻辑线性)。

在创建元素之前,您正在连接事件处理程序。

(你可以使用.live()或者你可以只交换操作的顺序)

你正在动态地将select添加到DOM中,在声明你的事件处理程序时, select doest不存在所以事件处理程序没有绑定到元素使用.live将事件处理程序附加到动态添加的元素

 $('#weddingturn').live('change',function() { alert ("Wedding select change triggered!"); //var wedturn = $('#weddingturnselectid').val(); //$('#div3').append('
Wedding turn selected, ' + wedturn + '') });

DEMO

jquery live

您正在对尚不存在的选择设置changefunction。 将.change调用移到.append