Kendo DropDownList(DDL)Change事件触发不一致问题求助
我碰到过类似的Kendo DropDownList绑定Change事件失效的情况,先把问题梳理清楚,再聊聊可能的原因和解决思路:
问题详情
我创建了两个绑定Change事件的Kendo下拉列表(DDL),出现了诡异的触发差异:
- 其中一个DDL的事件触发完全正常,但另一个DDL的事件毫无反应,控制台也没有报错
- 测试发现:如果把失效DDL的事件指向不存在的函数,控制台会正常报错;但指向已存在的函数时就没任何动静
- 目前临时解决办法是:直接给Kendo DDL对应的底层文本输入框绑定原生
onchange事件
正常工作的DDL代码
<span class="wideitemtitle">Working DDL:</span> @Html.Kendo().DropDownListFor(m => m.WorkingDDLID) .DataValueField("ID") .DataTextField("Text") .BindTo(Model.DDLWorking) .OptionLabel("Select Working DDL") .HtmlAttributes(new { style = "width:300px;" }) .Events(ev => ev.Change("workingDDLChanged"))
无法触发事件的DDL代码
<span class="wideitemtitle">Broken DDL:</span> @Html.Kendo().DropDownListFor(m => m.BrokenDDLID) .DataValueField("ID") .DataTextField("Text") .BindTo(Model.DDLBroken) .OptionLabel("Select Broken DDL") .HtmlAttributes(new { style = "width:300px;" }) .Events(ev => ev.Change("brokenDDLChanged"))
绑定的事件函数(仅做日志输出)
function workingDDLChanged(e) { console.log('in workingDDLChanged'); } function brokenDDLChanged(e) { console.log('in brokenDDLChanged'); }
临时解决代码
$(document).ready(function () { document.getElementById('WorkingDDLID').onchange = brokenDDLChanged; });
注:
WorkingDDLID是Kendo DDL对应的底层文本输入框ID
可能的原因与更规范的修复方案
- 脚本加载顺序排查:虽然指向不存在的函数会报错,但可以确认下
brokenDDLChanged函数的定义是否在Kendo DDL初始化脚本之后——如果函数定义在后,控件初始化时可能无法正确绑定(不过你的测试结果大概率排除了这个,但还是可以检查下) - 控件初始化冲突检查:查看页面中是否存在重复的
BrokenDDLID元素,或者有没有其他脚本重新初始化了这个DDL,覆盖了原本的事件绑定 - 用Kendo原生方式重新绑定事件:替代临时的底层输入框绑定,直接获取Kendo控件实例重新绑定事件,更符合框架规范:
$(document).ready(function() { // 获取失效DDL的Kendo控件实例 var brokenDDL = $("#BrokenDDLID").data("kendoDropDownList"); // 重新绑定Change事件 brokenDDL.bind("change", function(e) { console.log('in brokenDDLChanged'); // 这里可以直接写业务逻辑,或者调用你的brokenDDLChanged函数 // brokenDDLChanged(e); }); });
- Model数据格式校验:确认
Model.DDLBroken的数据结构、内容是否和Model.DDLWorking完全一致——比如是否存在空值、数据类型不匹配等问题,导致控件初始化异常,间接影响事件触发
内容的提问来源于stack exchange,提问作者Legion




