javascript - e.preventDefault() 表现不同

标签 javascript jquery html jquery-ui

我有一个非常简单的 jQuery UI 旋转器,如下所示:

<input value="2" class="form-control ui-spinner-input" id="spinner" aria-valuemin="2" aria-valuemax="24" aria-valuenow="2" autocomplete="off" role="spinbutton" type="text">

使用 jQuery,我将上面的文本框设置为只读 true/false。只读和值是根据用户选择的复选框设置的,该函数如下所示

 function checkBoxes() {
    var $targetCheckBoxes = $("#BoxFailure,#InstallationFailure");
    $targetCheckBoxes.change(function () {
        var isChecked = this.checked;
        var currentElement = this;
        var $radioButton = $('.usage-failure-type-radio');
        $targetCheckBoxes.filter(function () {
            return this.id !== currentElement.id;
        }).prop('disabled', isChecked);
        $('#spinner').val(isChecked ? this.value : '').prop('readonly', isChecked);
        $radioButton.first().prop('checked', isChecked);
        $radioButton.not(':checked').toggle(!isChecked).parent('label').toggle(!isChecked);
        $('.usage-before-failure > div > span.ui-spinner > a').toggle(!isChecked);
    });
}

现在我想要实现的是,当 #spinner 输入为只读时,如果用户按下退格键,我想阻止默认行为,例如请离开该页面。为此,我想我会做以下事情:

$('.prevent-default').keydown(function (e) {
    e.preventDefault();
});

如果输入在页面加载时具有类 prevent-default ,则效果很好。但是,如果我将其添加到以下行的 checkBoxes 函数中

$('#spinner').val(isChecked ? this.value : '').prop('readonly', isChecked).toggleClass('prevent-default') 

然后我按退格键,它会忽略e.prevenDefault();

但如果我这样做

$('#spinner').val(isChecked ? this.value : '').prop('readonly', isChecked).keydown(function (e) { e.preventDefault(); });

然后就可以正常工作了。

有人可以告诉我为什么会发生这种情况吗?

我想使用带有类名的单独函数的原因是因为我有各种输入,这些输入根据不同的检查/单选值设置为只读。

最佳答案

Can someone tell me why this is happening please

这是由于 DOM 解析器和 JavaScript 执行时间的原因。

如果在执行 JS 之前,您的 DOM 中已经存在一个带有 prevent-default 类的元素,那么 JavaScript 将正确识别并处理它。如果您随后使用 JS 添加该类,则必须再次重新初始化 keydown-event 才能使其工作。

要重新初始化,您将需要这样的东西:

function checkBoxes() {
    var $targetCheckBoxes = $("#BoxFailure,#InstallationFailure");
    $targetCheckBoxes.change(function () {
        ...

        $('#spinner').val(isChecked ? this.value : '').prop('readonly', isChecked).toggleClass('prevent-default');
        // assign new keydown events
        handleKeyDown();
        ...

    });
}

function handleKeyDown() {
    // release all keydown events
    $('#spinner').off( "keydown", "**" );
    $('.prevent-default').keydown(function (e) {
            e.preventDefault();
            // do more stuff...
        });
}

关于javascript - e.preventDefault() 表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43468900/

相关文章:

javascript - Thymeleaf 替换表属性中的文本

javascript - nodeValue 和过滤字符?

jquery - 使用此现有代码时如何在没有滚动条时显示 div

javascript - 重定向后执行函数 - javascript

javascript - 创建一个通用类以将挖空对象与页面绑定(bind)

javascript - 在 Javascript 中从二维数组返回字符串

javascript windows.open() 方法失败

javascript - 使用多个选择器查找 prev() 标签

html - 将 HTML 代码作为输入的 Angular 组件

php - php 文件的 500 内部服务器错误,而不是 html