代码陷入无限循环,除非我正在调试它/设置断点

时间:2016-06-17 13:00:39

标签: javascript jquery

我有一个包含多个DropDownList控件和一个TextBox的表单。根据{{​​1}}控件中的选定值,软件应该:

  • 将DDL的值相加并将其放在文本框中,并将其设为只读
  • 启用用户输入的文本框

当它们从文本框中跳出时,它会验证它们的输入,以确保它是一个有效值(必须是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电话上设置断点,它只会弹出一次而我可以将其解除,软件的行为与预期一致。

我在调用堆栈中看不到可能导致此无限循环的原因。必须有某种逻辑错误,但我无法识别它......

1 个答案:

答案 0 :(得分:0)

当然,当我最终决定提出问题时,我找到了解决方案:

显示弹出窗口会导致文本框失去焦点,调用Blur,它会看到值无效并显示弹出窗口...导致文本框失去焦点等等。

删除$("#txtMyTextBox").focus()调用会修复此行为,因为它不再尝试在关注文本框和弹出窗口之间切换。