gpt4 book ai didi

jquery-ui - knockoutjs 提交绑定(bind)未正确处理输入键

转载 作者:行者123 更新时间:2023-12-02 23:21:29 25 4
gpt4 key购买 nike

我有一个 jquery ui 对话框,在表单上有一个 knockoutjs 提交绑定(bind)。可以通过按取消按钮、按对话框标题栏上的关闭按钮、按转义键或按保存按钮来关闭对话框。我的意图是取消、转义和标题栏关闭事件应该关闭对话框而不应用任何操作,而按 Enter 或单击“保存”应该执行对话框操作。一切都按预期工作,除了 Enter 键之外,它会导致取消事件,而不是提交事件。

我创建了一个 jsfiddle为了说明这一点,并包含以下代码以供引用。

我对冗长的代码表示歉意......

基因

<!-- ko with: dialog -->
<div id="taskdlg" class="resizeableDialog"
data-bind="dialog: {autoOpen: false, title: 'Edit task', height: 200, width: 500, modal: true, close: updateCloseState}, openWhen: open">
<form data-bind="submit: update">
<table>
<tr>
<td style="width: 100px;"><label for="tasktitle">Title</label></td>
<td width="*">
<input id="tasktitle" type="text" placeholder="Task name" data-bind="value: titletext, valueUpdate: 'afterkeydown'" />
</td>
</tr>
<tr>
<td><button style="float: left;" data-bind="click: cancel">Cancel</button></td>
<td><button style="float: right;" type="submit">Save</button></td>
</tr>
</table>
</form>
</div>
<!-- /ko -->

<button data-bind="click: editTask">Edit</button>
<span data-bind="text: task"></span>

JavaScript 如下:

ko.bindingHandlers.dialog = {
init: function(element, valueAccessor, allBindingsAccessor) {
var options = ko.utils.unwrapObservable(valueAccessor());
setTimeout(function() { $(element).dialog(options || {}); }, 0);

//handle disposal (not strictly necessary in this scenario)
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$(element).dialog("destroy");
});
},
update: function(element, valueAccessor, allBindingsAccessor) {
var shouldBeOpen = ko.utils.unwrapObservable(allBindingsAccessor().openWhen);
$(element)
.dialog(shouldBeOpen ? "open" : "close");
}
};

function Task(name) {
var self = this;
this.title = ko.observable(name);

this.toString = function() { return "Task: " + self.title(); };
}

function TaskDialog(viewModel) {
var self = this;

this.viewModel = viewModel;
this.task = ko.observable();
this.open = ko.observable(false);
this.titletext = ko.observable();

this.editTask = function(task) {
self.task(task);
self.titletext(task.title());
self.open(true);
}

this.update = function() {
var task = self.task();
task.title(self.titletext());
self.open(false);
}

this.updateCloseState = function() {
if (self.open())
self.open(false);
}

this.cancel = function() {
self.open(false);
}
}


function viewModel() {
var self = this;
this.dialog = ko.observable(new TaskDialog(self));
this.task = ko.observable(new Task('sample task'));

this.editTask = function() {
self.dialog().editTask(self.task());
}
};

ko.applyBindings(new viewModel());

最佳答案

如果按钮没有类型,则浏览器会假设它可以被视为提交按钮。因此,当您按下 enter 时,取消按钮的方法就会被执行,并阻止默认提交的实际发生。因此,如果您将“保存”按钮移到“取消”按钮之前,它将正常工作。

但是,解决此问题的真正方法是将 type="button" 添加到“取消”中:

<button type="button" style="float: left;" data-bind="click: cancel">Cancel</button>

http://jsfiddle.net/rniemeyer/HwbD2/11/

关于jquery-ui - knockoutjs 提交绑定(bind)未正确处理输入键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8652915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com