我有一个包含多个DropDownList
控件和一个TextBox
的表单。根据{{1}}控件中的选定值,软件应该:
当它们从文本框中跳出时,它会验证它们的输入,以确保它是一个有效值(必须是X,Y或Z,如果它是Z,它有一些'额外'逻辑)。
我的DropDownList
个控件在其所选值发生更改时会调用方法DropDownList
。
SumValues()
执行上述项目符号中规定的逻辑。在将总和分配给文本框或将其用于自由格式用户数据输入后,它会调用SumValues()
(也会将其分配给文本框的BlurMyTextbox
事件/属性),因为当此值更改时,它将根据文本框的值修改另一个控件集。
onblur
执行以下操作:
BlurMyTextbox()
因此它会检查分配给它的值,然后它会:
当我运行我的软件时,只要我更改了调用function BlurMyTextbox()
{
var cmb = $("#cmbV14").data("kendoDropDownList"); //get reference to 'child' drop down
var val = $("#txtMyTextbox").val(); //get this value
if (val == 'x' || val == 'y')
{
//set data source on child drop down if textbox value is valid
// this condition occurs when SumValues() auto-enters the value
// this functionality works fine
var OneAndDash = [{ "Text": "1", "Value": "1" }, { "Text": "-", "Value": "-" }];
cmb.dataSource.data(OneAndDash);
}
else
{
if (val != someGlobalVar && someOtherGlobalVar > 0)
{
// if value is outside of a particular range, show error
var template = kendo.template(validationTemplate)({
text: 'Invalid input; field must be X, Y, or Z'
, buttons: [{ id: 'btnOk', text: 'Ok', click: 'ClosePopup("Validation");' }]
});
OpenWindow('Validation', 'Information', { content: template, actions: '', confirm: true, draggable: true });
//clear textbox and give it focus so they enter the correct value
$("#txtMyTextbox").val('');
$("#txtMyTextbox").focus();
}
// assign different datasource to dependent drop down
var ZeroToOneAndDashData = [{ "Text": "0", "Value": "0" }, { "Text": "1", "Value": "1" }, { "Text": "-", "Value": "-" }];
cmb.dataSource.data(ZeroToOneAndDashData);
// this drop down does not effect the textbox in any way
// nor does it call BlurMyTextbox or anything like that
}
}
(反过来调用SumValues()
)的任何下拉列表中的值,它就会反复显示弹出窗口并且我不能点击它来解雇它。如果我在BlurMyTextbox
中的OpenWindow
电话上设置断点,它只会弹出一次而我可以将其解除,软件的行为与预期一致。
我在调用堆栈中看不到可能导致此无限循环的原因。必须有某种逻辑错误,但我无法识别它......
答案 0 :(得分:0)
当然,当我最终决定提出问题时,我找到了解决方案:
显示弹出窗口会导致文本框失去焦点,调用Blur,它会看到值无效并显示弹出窗口...导致文本框失去焦点等等。
删除$("#txtMyTextBox").focus()
调用会修复此行为,因为它不再尝试在关注文本框和弹出窗口之间切换。