jQuery选择器控制台验证正确,但Kendo MaskedTextBox仍被错误追加打印div
问题原因
核心问题是打印预处理逻辑的执行时机早于Kendo组件初始化时机:
- Kendo组件的初始化逻辑是在
kendo.syncReady事件中执行的,MaskedTextBox初始化时会做两件事:给原生input添加k-textbox类、将input包裹到<span class="k-widget k-maskedtextbox">容器中。 - 你将打印预处理函数绑定在了jQuery的
$(document).ready()中执行,这个时机早于kendo.syncReady,此时MaskedTextBox的input还没有被添加k-textbox类,也没有外层的.k-maskedtextbox容器,因此会被选择器input:not(.k-textbox)匹配到,顺利进入追加div的逻辑,div直接被添加到了外层的表单列容器中。 - 等Kendo初始化完成后,input才被加上
k-textbox类和外层容器,因此你后续在控制台调试时拿到的判断结果都是符合预期的,但多余的div已经被提前追加完成了。
修复方案
1. 调整执行时机(核心修复)
将打印媒体模式下的beforePrint调用从$(document).ready()迁移到kendo.syncReady()中,保证所有Kendo组件初始化完成后再执行打印预处理:
kendo.syncReady(function(){ if(window.matchMedia('print').matches) { beforePrint(); } });
window.onbeforeprint的绑定无需修改,事件触发时Kendo组件已经初始化完成,不会出现时序问题。
2. 选择器加双重保险
在选择器层面直接排除MaskedTextBox内的input,避免时序问题导致的误匹配,同时可以去掉each内部的父级判断简化代码:
function beforePrint() { // 直接排除k-textbox类和MaskedTextBox下的所有input $("input:not(.k-textbox, .k-maskedtextbox input)").each(function () { const $input = $(this); const $printDiv = $input.siblings(".inputPrint"); if ($printDiv.length) { $printDiv.text($input.val()); } else { $input.parent().append(`<div class='inputPrint'>${$input.val()}</div>`); } }); }
3. 兜底CSS修复
如果不想修改JS逻辑,可以直接加一行CSS隐藏MaskedTextBox对应的多余打印div:
.k-maskedtextbox ~ .inputPrint { display: none !important; }
内容的提问来源于stack exchange,提问作者CarenRose
相关产品推荐
相关产品推荐

