Jquery选择改变事件未触发

71
我需要捕获下拉框的变化,应该很简单!
    $('#multiid').change(function(){
    alert('Change Happened');
});

但它不起作用,我怀疑问题在于选择框在文档准备就绪时不存在,只有在需要时才会创建,因此我将其在HTML中为空创建,在代码中进行了填充测试,但那也没有起作用。

function buildmulti(id,name,price) {
    // build action items for action bar
    var optlist = $('<select></select>').attr('id', 'multiid').attr('name', 'multiid');
    optlist.append('<option value="0">Select Size</option>');
    $.each(option, function(index, val) {
        if(val.prodID *1  == id * 1) {
            v = val.ID;
            fprice = price * 1 + val.pricechange * 1;
            t = name + ' - ' + val.variation +  ' - ' + currency + (fprice).toFixed(2);
            optlist.append('<option value="' + v + '">' + t + '</option>');
        }
    })
    $('#addbasket').append(optlist);
};

可能是括号放错了位置,但我找不到它!


可能是与jQuery On <select> Change Event Not Firing重复的问题。 - Ram
7个回答

204
尝试
 $(document).on('change','#multiid',function(){
    alert('Change Happened');
});

由于您的选择框是通过代码生成的,因此您需要使用事件委托,在其中替换$(document)为最近的父元素。

或者

$(document.body).on('change','#multiid',function(){
    alert('Change Happened');
});

更新:

第二个方法可以正常工作,还需要更改选择器才能使其生效。

$('#addbasket').on('change','#multiid',function(){
    alert('Change Happened');
});

理想情况下,我们应该使用$("#addbasket"),因为它是最近的父元素[如我上面提到的]。


是的...你可以使用$('body'),不管怎样很高兴能帮到你 :-) - Dhaval Marthak
第二个现在可用。其他的都不行了。查找文档中所做的更改需要太多时间。 - MaXi32

11

试一试

$('body').on('change', '#multiid', function() {
    // your stuff
})
请检查 .on() 选择器

11

您可以通过以下方法触发“change”事件:

第一种方法:

$('#selectid').change(function () {
    alert('This works');
}); 

第二个

$(document).on('change', '#selectid', function() {
    alert('This Works');
});

第三

$(document.body).on('change','#selectid',function(){
    alert('This Works');
});
如果这种方法不起作用,请检查你的jQuery是否正常工作:
$(document).ready(function($) {
   alert('Jquery Working');
});

第二个方法是最好的,它适用于所有情况。在页面第一次加载时,使用ajax或jquery动态更改页面,它可以正常工作。谢谢。 - Assad Yaqoob

3
$(document).on('change','#multiid',function(){
  // you desired code 
});

reference on


1

这对我很有效!

$('#<%= ddlstuff.ClientID %>').change(function () {
    alert('Change Happened');
     $('#<%= txtBoxToClear.ClientID %>').val('');
});

请注意,ID部分(例如<%= ddlstuff.ClientID %>)是特定于ASPX Razor语法的。 - vapcguy

0

你可以尝试以下方法,应该可以正常工作

$(document).on('change','#fieldid',function(){
    alert('change triggered');
});

0

对我来说,将此代码完美地分叉。

$('#dom_object_id').on('change paste keyup', function(){
    console.log($("#dom_object_id").val().length)
});

.on()函数的关键事件是"paste",用于动态获取更改


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接