javascript - 如何动态地将文本框连接到 jquery 事件?
问题描述
我有一个在编辑日期字段时使用 jquery 的应用程序。它适用于所有具有 css 类“日期”的字段。我正在将一些 HTML 代码从服务器读取到一个用作弹出窗口的 DIV 中。HTML 代码包含几个日期字段,我也想让 jquery 管理这些字段。该页面在下面的 head 元素中粘贴了代码,jquery 会自动附加到相应的字段。我需要在弹出窗口出现时向 jquery 添加字段,并在弹出窗口关闭时删除它们。搜索答案时,我只能找到 jquery 创建文本框的位置,但不能附加到现有文本框。
<script src="Include/jquery-latest.js" type="text/javascript"></script>
<script src="Include/jquery.maskedinput.js" type="text/javascript"></script>
<script type='text/javascript'>
$(function () {
// Define your mask (using 9 to denote any digit)
$('.phone').mask('(999)999-9999');
});
$(document).ready(function () {
$('.phone').change(function () {
var validnum = $(this).val().match(/^([01]?[0-9]|[0-9]|[0-9])[0-9]|[0-9]|[0-9]-[0-9]|[0-9]|[0-9]|[0-9]$/);
if (!validnum) {
$(this).val('').focus().css('background', '#fdd');
alert('Please enter a valid Phone Number (999)999-9999.');
} else {
$(this).css('background', 'transparent');
}
});
});
$(function () {
// Define your mask (using 9 to denote any digit)
$('.date').mask('99/99/9999');
});
$(document).ready(function () {
$('.date').change(function () {
var validnum = $(this).val().match(/^(0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4}$/);
if (!validnum) {
$(this).val('').focus().css('background', '#fdd');
alert('Please enter a valid Date mm/dd/yyyy.');
} else {
$(this).css('background', 'transparent');
}
});
});
</script>
解决方案
为什么您的解决方案不起作用?
通过使用$('.date').change(...
jQuery 将事件侦听器附加到 DOM 中的所有元素,在您执行此函数的那一刻。随着您的模态稍后添加,它不会收到侦听器。
解决方案:$(document).on('change', '.date', function () { ...
通过使用它,您将事件侦听器附加到文档根目录,因此每次文档中的任何内容发生更改时,jQuery 都会检查更改的元素是否与您作为第二个参数提供的选择器匹配(在本例中.date
)。因此,所有元素,即使是稍后添加到页面的元素,也会对更改做出反应。
但是:正如我所说,您在文档中附加了一个侦听器。由于 jQuery 在后台使用 shadow-DOM,它不会消耗太多性能,但是如果您构建一个包含许多此类侦听器的大型应用程序,您可能会在某些时候遇到性能问题。在这种情况下,您最好将侦听器专门添加到您刚刚添加的元素中。
推荐阅读
- flutter - Flutter Tabbarview 下划线颜色
- javascript - 滚动和窗口加载或调整大小时导航栏更改
- windows - 如何在 Windows 10 下的 Anaconda 中安装 PyGObject?
- cakephp-3.0 - 在 CakePHP3.6 中,如何将另一个控制器的函数调用到另一个控制器中?
- javascript - 自定义“import”与 webpack 的工作方式
- math - 在非线性尺度上映射点
- angular - 如何在使用 CLI 创建的 Angular 库中包含第三方模块
- jquery-mobile - jQueryMobile+PhoneGap+iOS 11:阻止尝试使用 history.replaceState() 更改会话历史 URL
- c# - 为什么我不能从此 DataRow 中获得 Byte[]?
- android - 房间持久性迁移指数