判断Kendo UI控件类型:现有方法是否唯一?有无更优方案?
问题:获取Kendo UI控件类型的方法是否唯一?有没有更优实现?
我目前使用下面的工具函数来检测Kendo UI控件类型(仅覆盖我需要的5种):
util.getKendoControlType = function(controlId) { let controlTypes = ['kendoAutoComplete','kendoMultiSelect','kendoDatePicker','kendoDropDownList','kendoNumericTextBox']; for(let i = 0; i < controlTypes.length; i++) { let control = $('#' + controlId).data(controlTypes[i]); if (typeof(control) !== 'undefined' && control !== null) { return controlTypes[i]; } } return null; };
我的疑问是:这是否是获取Kendo UI控件类型的唯一方法?是否存在更优的实现方式?(注:我知道可以抛出错误替代返回null)
回答
这绝对不是获取Kendo UI控件类型的唯一方法!针对你的需求,有几种更简洁、高效的实现方式可以参考:
1. 简化现有逻辑:用数组find替代手动循环
你当前的核心逻辑是没问题的,但用ES6的数组方法能让代码更简洁易读,不用再手动维护循环索引:
util.getKendoControlType = function(controlId) { const controlTypes = ['kendoAutoComplete','kendoMultiSelect','kendoDatePicker','kendoDropDownList','kendoNumericTextBox']; const element = $('#' + controlId); return controlTypes.find(type => element.data(type)) || null; };
find会自动遍历数组,返回第一个匹配的控件类型(只要元素上存在该控件实例),找不到就返回undefined,最后用|| null保持和原函数一致的返回值风格。
2. 通用型实现:无需预设控件列表,自动识别所有Kendo控件
如果你以后可能需要支持更多Kendo控件,不想每次都修改控件列表,可以通过获取控件实例来推导类型:
util.getKendoControlType = function(controlId) { const element = $('#' + controlId); // 两种方式获取通用控件实例:优先用data('kendoWidget'), fallback到kendo.widgetInstance const widgetInstance = element.data('kendoWidget') || kendo.widgetInstance(element[0]); if (!widgetInstance) return null; // 遍历元素的data属性,找以"kendo"开头的键(代码压缩也不会失效,最可靠) const dataKeys = Object.keys(element.data()); return dataKeys.find(key => key.startsWith('kendo')) || null; // 另一种方式:从构造函数名称获取(注意:代码压缩混淆后,constructor.name可能变成无意义的短名称,慎用) // return widgetInstance.constructor.name; };
这种方法不用预设控件列表,自动适配所有Kendo控件,其中遍历data属性的方式最可靠,不会受代码压缩的影响。
3. 小优化:批量检查data对象,减少方法调用开销
原实现里每次循环都调用data(),其实可以一次性获取元素的所有data属性,再批量检查:
util.getKendoControlType = function(controlId) { const controlTypes = ['kendoAutoComplete','kendoMultiSelect','kendoDatePicker','kendoDropDownList','kendoNumericTextBox']; const elementData = $('#' + controlId).data(); return controlTypes.find(type => type in elementData) || null; };
这种方式减少了多次调用data()的开销,性能上会比原实现略优,代码也更简洁。
最后给点小建议
- 如果就固定用那5种控件,简化后的
find版本或者批量检查data对象的版本是最优选择,兼顾可读性和性能; - 如果需要支持任意Kendo控件,通用型实现更灵活;
- 关于返回null还是抛错误,完全看你的业务场景:如果这个函数调用时,控件必须存在,抛错误能更早发现问题;如果允许控件不存在,返回null更友好。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

