javascript - 排除在控制台中正确的 JQuery 选择器,代码仍然运行
问题描述
我正在使用 Kendo 的 Web 应用程序中的表单打印样式。简而言之:在打印之前,我附加<div>
包含每个input
值的标签,并隐藏input
标签。Kendo MaskedTextBox 例外,因为掩码按预期显示数据,其原始值不包含掩码。
它对其他所有东西都按预期工作 - input
s 被隐藏,只显示附加div
的 s。
但是,对于被屏蔽的文本框,input
显示(正确),但div
仍在附加(不正确)。
HTML 结构(从 Edge Dev Tools (F12)复制):
<div class="mws-form-col-2-8">
<label>Masked TextBox</label>
<span class="k-widget k-maskedtextbox" style="width: 100%;">
<input class="k-textbox" id="maskTest" name="maskTest"
value="1234567890" data-role="maskedtextbox"
style="width:100%" autocomplete="off">
<span class="k-icon k-i-warning"></span>
</span>
<script>kendo.syncReady(...)</script>
<!-- Appended div here: <div class="inputPrint">1234567890</div> -->
</div>
打印 css:
input:not(.k-textbox),
span.k-widget:not(.k-maskedtextbox) {
display: none!important;
}
Javascript:
此函数绑定到window.onbeforeprint
事件,并$(document).ready()
在媒体类型为“打印”时调用(Edge/Chrome 可以模拟 css 媒体类型,我正在使用它来调试它)。
function beforePrint() {
// exclude input.k-textbox
$("input:not(.k-textbox)").each(function () {
// exclude input with .k-maskedtextbox parent
//if (! $(this).parents(".k-maskedtextbox").length) {
if ($(this).parents(".k-maskedtextbox").length <= 0) {
// check if the .inputPrint div already exists
if ($(this).siblings(".inputPrint").length) {
// set text of existing
$(this).siblings(".inputPrint").text($(this).val());
}
else {
// append a div displaying its value to its parent
$(this).parent().append("<div class='inputPrint'>" + $(this).val() + "</div>");
}
}
});
}
如您所见,函数 ( input:not(.k-textbox)
) 第一行的选择器与 css 中的选择器相同。
显示:
Masked TextBox ←- Label
╭────────────────╮
| (123) 456-7890 | ←- input
╰────────────────╯
╭────────────────╮
| 1234567890 | ←- appended div
╰────────────────╯
当我试图通过检查控制台中的一些东西来弄清楚这可能是如何发生的时,这就是我得到的:
$("#maskTest").is("input:not(.k-textbox)")
false
$("#maskTest").is(".k-textbox")
true
这个输入甚至不应该包含在.each
.
$("#maskTest").parents(".k-maskedtextbox").length
1
$("#maskTest").parents(".k-maskedtextbox").length <= 0
false
如果它被包括在内,它不应该进入第一个if
语句。
这是怎么回事,我该如何解决?
解决方案
我发现 Kendo MVC 包装器在事件中将输入扩展为 kendo 控件,该kendo.syncReady
事件在完成后 $(document).ready
运行。
所以在我的初始页面加载时,我检查的输入看起来像这样:
<input id="maskTest" name="maskTest" style="width:100%" value="1234567890" />
推荐阅读
- scala - scala中的特别函数递归地连接两个列表:不使用“concat”
- python - Flask:如何将上传的文件作为输入传递给方法?AttributeError: '_io.BytesIO' 对象没有属性 'lower'
- reactjs - s.indexOf 不是 Function.n.fromString 的函数
- azure-active-directory - 图形 API 无法访问“https://graph.microsoft.com/v1.0/me/messages”端点
- html - 试图弄清楚如何使网站滚动
- python - 调用一个函数来打印一些东西
- visual-studio-code - Lua 与 VS 代码
- python - 在数据框中搜索字符串并将找到的数字增加 1
- angular - 没有互联网连接时如何显示自定义组件
- c# - 如何使用信号器允许 cors