You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:54:03