排除 JQuery 选择器在控制台中正确,代码仍然运行
Excluding on JQuery selector correct in console, code still runs
我正在研究使用 Kendo 的网络应用程序中表单的打印样式。简而言之:在打印之前,我附加了包含每个 input
值的 <div>
标签,并隐藏了 input
标签。 Kendo MaskedTextBox 例外,因为掩码按预期显示数据,其原始值不包含掩码。
其他所有内容均按预期工作 - input
已隐藏,仅显示附加的 div
。
但是,对于屏蔽的文本框,显示了 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.syncReady
事件中的 kendo 控件,该事件运行 after $(document).ready
完成。
所以在我初始页面加载时,我检查的输入看起来像这样:
<input id="maskTest" name="maskTest" style="width:100%" value="1234567890" />
我正在研究使用 Kendo 的网络应用程序中表单的打印样式。简而言之:在打印之前,我附加了包含每个 input
值的 <div>
标签,并隐藏了 input
标签。 Kendo MaskedTextBox 例外,因为掩码按预期显示数据,其原始值不包含掩码。
其他所有内容均按预期工作 - input
已隐藏,仅显示附加的 div
。
但是,对于屏蔽的文本框,显示了 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.syncReady
事件中的 kendo 控件,该事件运行 after $(document).ready
完成。
所以在我初始页面加载时,我检查的输入看起来像这样:
<input id="maskTest" name="maskTest" style="width:100%" value="1234567890" />