2017-03-16 70 views
0

我有什么样的表面看来是一个简单的问题,但是我在解决方案中遇到了一些麻烦。我正在使用jQuery1.8.3和jQuery确认的asp.net 3.5。在标签keydown事件拦截后改变焦点

我会说在这一点上,JavaScript和jQuery对我来说是相当新的,我不是特别有信心使用它们。

我正在拦截文本框上的keydown事件,如果tab键已被按下,则显示一个jQuery确认对话框。在对话框的动作之后,我希望移动到另一个文本框。看起来很简单,这里是我的代码。

$$("m_DiscountTextbox").on('keydown', function (e) { 
var key = e.which || e.keyCode; 
if (key == 9) { 
    PromptForDiscount(); 
    document.getElementById($$("m_MarkupTextbox").attr("id")).focus(); 
    } 
}); 

function PromptForDiscount() { 
$.confirm({ 
    title: 'Apply global discount', 
    content: 'Discount will be applied to all line items. Click Confirm to continue, or Cancel to exit.', 
    boxWidth: '30%', 
    theme: 'material', 
    buttons: { 
     formSubmit: { 
      text: 'Confirm', 
      keys: 'enter', 
      btnClass: 'btn-blue', 
      action: function() { 
       ApplyDiscount(); 
      } 
     }, 
     cancel: function() { 
     } 
    }, 
    useBootstrap: false 
}); 
return false; 

的$$调用到一个选择器功能,它允许我使用asp.net控件的ID,因为它们是.NET轧液在他们面前。

使用chrome开发人员工具我可以看到选择器始终在工作,甚至在目标文本框上使用它们来检查文本。这只是焦点变化不起作用。

最初焦点转到目标上,一旦对话框被确认,它将恢复到调用文本框。任何援助将与此赞赏。

在此先感谢。

另外的想法:

我现在想知道,如果它是对话控制传递回原调用时,它的操作完成,并在这个过程中撤消焦点的设置上的下一个文本框。我还没有证据支持这一点,但看起来它可能成为调查的候选人。

我还建立了一个演示这一问题的基本的jsfiddle: https://jsfiddle.net/8uap36fp/17/

+0

尽量集中()内确认/取消模式 – Ninjaneer

+0

感谢Rohith的回调,我已经试过了,并没有奏效。我可以看到焦点移动到目标框,然后它恢复到源框。我想知道这是否与事件模型有关 – Jason

+0

当模态被解散时,我想要关注下一个输入,而不是当它可见时。 – Jason

回答

0

已经花了很多时间在这,我问对话框开发商的问题。

事实证明,这是对话框的限制,将在未来的版本中解决。基本上要解决这个问题,您可以将对话框的lastFocussed属性设置为不存在的元素。

工作的jsfiddle是here

感谢Rohith所有支持的昨天。

代码为的jsfiddle

function PromptForDiscount() { 
$.confirm({ 
    title: 'Test confirm', 
    content: 'Lets hope this stays open.', 
    boxWidth: '30%', 
    buttons: { 
     formSubmit: { 
      text: 'Confirm', 
      keys: 'enter', 
      btnClass: 'btn-blue', 
      action: function() { 
       this._lastFocused = $('.thisElementDoesntExists'); 
       $("#arrivehere").focus(); 
      } 
     }, 
     cancel: function() { 
     } 
    }, 
    useBootstrap: false 
}); 
return false; 
};