如何将挖空"onEnter"与 $(document).on( "keypress" , "form" 一起使用



我只是想知道如何将 knockout 的onEnter与 jQuery 的$(document).on("keypress", "form"...一起使用

因为每次我在form中按回车键时,它都会将公式器提交到服务器。

使用event.preventDefault()会阻止提交表单,但这也可以防止淘汰onEnter......?!

$(document).on("keypress", "form", function (event)
{
    if ($(event.target).closest("input[data-bind*='onEnter']")[0])
    {
         event.preventDefault(); //preventing form to be submitted
         return true;//but the function behind 'onEnter' will not be trigered
    }
    if (event.keyCode == 13)//Enter
    {
         event.preventDefault();
         return false;
    }
});

在上述代码之后,onEnter将如何触发?

谢谢

首先,如果你打算使用 JQuery,你需要把它放在 Knockout 的上下文中,否则你的绑定会遇到重大问题,并在事情发生变化时更新你的视图。此外,在当前代码中,您必须调用 viewmodel.yourMethod - 这并不理想。

话虽如此,值得创建自己的bindingHandler来处理这个问题,然后将处理程序添加到您想要的任何元素中。

这还没有经过测试,但会让你接近某个地方。

// the custom binding handler, its called executeOnEnter
ko.bindingHandlers.executeOnEnter = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var allBindings = allBindingsAccessor();
        // in this case, element is the html element you bound the handler - so perhaps your form tag
        $(element).keypress(function (event) {
            var keyCode = (event.which ? event.which : event.keyCode);
            // the enter key
            if (keyCode === 13) {
                allBindings.executeOnEnter.call(viewModel);
                event.preventDefault();
                return false;
            }
            return true;
        });
    }
};

然后,您可以将其附加到表单中,如下所示:

<form data-bind="executeOnEnter:theFunctionInYourViewModelToCall" >

您必须让 Knockout 在应用程序中执行所有顶级事件处理。

有一个内置的submit绑定,用于捕获窗体的submit事件:

<form data-bind="submit: captureEnter"></textarea>

它与各种其他事件的内置event绑定的工作方式相同:

<textarea data-bind="event: {keypress: captureEnter}"></textarea>

在视图模型的 captureEnter 方法中,您可以查看键代码并对 Enter 键做出反应:

self.captureEnter = function (vm, event) {
    var keyCode = event.keyCode || event.which;
    if (keyCode === 13) {
        // do something...
    } else {
        return true; // let the event do what it normally would do
    }
});

默认情况下,"挖空"会阻止事件的默认操作。使用 return true; 允许默认操作(即"表单已提交"或"字符出现在文本区域中"等)。

最新更新