我的 bootbox.js 确认对话框需要点击两次才能保存
My bootbox.js confirm dialogue requires two clicks to save
为了在 bootbox.confirm 框中显示两个输入字段,我在消息字段中嵌入了一个 HTML 表单。一切正常,但如果我在文本区域中输入文本,“保存”按钮将失去焦点,并且需要单击两次“保存”按钮才能执行保存和清除模式。不过,问题出在下面的代码之外。这个 jsfiddle 一键就可以正常使用了。我实际上无法分享它所在的数千行代码,有人知道可能导致这种情况的原因以及我该如何解决它吗?
bootbox.confirm({
title: "Save Foo",
message: '<div class="row"> ' +
'<div class="col-md-12"> ' +
'<div class="text-center">Save</div>' +
'<form class="form-horizontal"> ' +
'<div class="form-group"> ' +
'<label class="col-md-4 control-label" for="Question">Question</label> ' +
'<div class="col-md-4"> ' +
'<input id="name" name="name" type="text" value="Question" class="form-control input-md"> ' +
'<span class="help-block">You can edit your question before saving</span> </div> ' +
'</div> ' +
'<div class="form-group"> ' +
'<label class="col-md-4 control-label" for="notesbox">Notes:</label> ' +
'<div class="col-md-4"> <div class="textarea"> <label for="notesbox"> ' +
'<textarea name="notesbox" id="notesbox" rows="10" cols="30"></textarea></form></div> ' +
'</label> ' +
'</div>' +
'</div> ' +
'</div> </div>' +
'</form> </div> </div>',
buttons: {
'cancel': {
label: 'Don\'t save',
className: 'btn-danger pull-left'
},
'confirm': {
label: 'Save',
className: 'btn-success pull-right',
}
},callback: function (result) { if (result == true)
{ alert('Success')}
}
}
);
我将从使用脚本模板开始,而不是使用字符串连接来构建您的消息 - 这会使您当前的消息显然包含一些无效标记,这对您没有任何好处。这是一种方法:
<script type="text/template" id="form-template">
<div class="text-center">Save</div>
<form class="form-horizontal">
<div class="form-group">
<label class="col-md-4 control-label" for="Question">Question</label>
<div class="col-md-4">
<input id="name" name="name" type="text" value="Question" class="form-control input-md">
<span class="help-block">You can edit your question before saving</span>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="notesbox">Notes:</label>
<div class="col-md-4">
<div class="textarea">
<textarea class="form-control" name="notesbox" id="notesbox" rows="10" cols="30"></textarea>
</div>
</div>
</div>
</form>
</script>
script 标签上的type="text/template"
属性意味着您的浏览器不会将标签的内容视为JavaScript 来执行。你几乎可以在那里使用任何东西,但是 text/template
很好地表达了意思,所以我坚持使用它。
使用该模板标签,您可以通过执行以下操作获取对话的消息:
let message = $('#form-template').html();
有了它,我会更新您的 Bootbox 用法以使用 bootbox.dialog
帮助器,而不是尝试将 bootbox.confirm
用于它不适合的用途。这是您的代码,已更新:
let message = $('#form-template').html();
let msgbox = bootbox.dialog({
title: "Save Foo",
message: message,
buttons: {
'cancel': {
label: "Don't save",
className: 'btn-danger pull-left'
},
'confirm': {
label: 'Save',
className: 'btn-success pull-right',
callback: function () {
let form = msgbox.find('form');
if(form.valid()){
alert('Valid!');
msgbox.modal('hide');
}
return false;
}
}
}
});
使用对话框助手时,不再执行全局回调;相反,每个按钮都有自己的回调,如图所示。在这个例子中,我将 return false;
作为最后一行,这样模式就不会自动关闭。这让我可以验证表单(这里,我假设 jQuery Validate 正在使用)以及我想做的任何其他事情(例如通过 AJAX 提交表单等)。然后,我们使用 Bootstrap 的 modal()
函数关闭我们的对话框。
为了在 bootbox.confirm 框中显示两个输入字段,我在消息字段中嵌入了一个 HTML 表单。一切正常,但如果我在文本区域中输入文本,“保存”按钮将失去焦点,并且需要单击两次“保存”按钮才能执行保存和清除模式。不过,问题出在下面的代码之外。这个 jsfiddle 一键就可以正常使用了。我实际上无法分享它所在的数千行代码,有人知道可能导致这种情况的原因以及我该如何解决它吗?
bootbox.confirm({
title: "Save Foo",
message: '<div class="row"> ' +
'<div class="col-md-12"> ' +
'<div class="text-center">Save</div>' +
'<form class="form-horizontal"> ' +
'<div class="form-group"> ' +
'<label class="col-md-4 control-label" for="Question">Question</label> ' +
'<div class="col-md-4"> ' +
'<input id="name" name="name" type="text" value="Question" class="form-control input-md"> ' +
'<span class="help-block">You can edit your question before saving</span> </div> ' +
'</div> ' +
'<div class="form-group"> ' +
'<label class="col-md-4 control-label" for="notesbox">Notes:</label> ' +
'<div class="col-md-4"> <div class="textarea"> <label for="notesbox"> ' +
'<textarea name="notesbox" id="notesbox" rows="10" cols="30"></textarea></form></div> ' +
'</label> ' +
'</div>' +
'</div> ' +
'</div> </div>' +
'</form> </div> </div>',
buttons: {
'cancel': {
label: 'Don\'t save',
className: 'btn-danger pull-left'
},
'confirm': {
label: 'Save',
className: 'btn-success pull-right',
}
},callback: function (result) { if (result == true)
{ alert('Success')}
}
}
);
我将从使用脚本模板开始,而不是使用字符串连接来构建您的消息 - 这会使您当前的消息显然包含一些无效标记,这对您没有任何好处。这是一种方法:
<script type="text/template" id="form-template">
<div class="text-center">Save</div>
<form class="form-horizontal">
<div class="form-group">
<label class="col-md-4 control-label" for="Question">Question</label>
<div class="col-md-4">
<input id="name" name="name" type="text" value="Question" class="form-control input-md">
<span class="help-block">You can edit your question before saving</span>
</div>
</div>
<div class="form-group">
<label class="col-md-4 control-label" for="notesbox">Notes:</label>
<div class="col-md-4">
<div class="textarea">
<textarea class="form-control" name="notesbox" id="notesbox" rows="10" cols="30"></textarea>
</div>
</div>
</div>
</form>
</script>
script 标签上的type="text/template"
属性意味着您的浏览器不会将标签的内容视为JavaScript 来执行。你几乎可以在那里使用任何东西,但是 text/template
很好地表达了意思,所以我坚持使用它。
使用该模板标签,您可以通过执行以下操作获取对话的消息:
let message = $('#form-template').html();
有了它,我会更新您的 Bootbox 用法以使用 bootbox.dialog
帮助器,而不是尝试将 bootbox.confirm
用于它不适合的用途。这是您的代码,已更新:
let message = $('#form-template').html();
let msgbox = bootbox.dialog({
title: "Save Foo",
message: message,
buttons: {
'cancel': {
label: "Don't save",
className: 'btn-danger pull-left'
},
'confirm': {
label: 'Save',
className: 'btn-success pull-right',
callback: function () {
let form = msgbox.find('form');
if(form.valid()){
alert('Valid!');
msgbox.modal('hide');
}
return false;
}
}
}
});
使用对话框助手时,不再执行全局回调;相反,每个按钮都有自己的回调,如图所示。在这个例子中,我将 return false;
作为最后一行,这样模式就不会自动关闭。这让我可以验证表单(这里,我假设 jQuery Validate 正在使用)以及我想做的任何其他事情(例如通过 AJAX 提交表单等)。然后,我们使用 Bootstrap 的 modal()
函数关闭我们的对话框。