提问者:小点点

关注具有焦点事件的字段


我定义了一个表单字段的焦点事件,以打开一个Jquery UI对话框,其中包含可选择的选项。我希望焦点应该停留在相同的字段,以便不间断地输入数据。我的需求就像datepicker显示的那样,用户看到datepicker覆盖,但焦点停留在日期字段上,这样用户就可以继续输入日期。

下面是相关字段和对话框的代码。

$( "#pmt_code" ).focus(function(){
    $( "#pmtcodes" ).dialog( "open" );
    // Keep focus stayed on this field somehow
  });


$( "#pmtcodes" ).dialog({
    autoOpen: false,
    position: { my: "left top", at: "left bottom", of: $("#pmt_code") },
    closeOnEscape: true,
    open: function(){
      listPmtCodes();
    }        
  });

下面是对话框Div with table。我正在使用jquery datatable插件填充这个表。

<div id="pmtcodes" title="payment Codes">
      <table cellpadding="0" cellspacing="0" border="0" class="display" id="pmtCodesTable">
        <thead>
          <tr>
            <th>Code</th>
            <th>Description</th>
          </tr>
        </thead>
        <tbody>
        </tbody>
      </table>        
    </div>

共1个答案

匿名用户

必须在打开的回调中将焦点再次设置为控件:

var $pmt_code = $("#pmt_code"),
    $pmtcodes = $("#pmtcodes");

$pmt_code.focus(function(){
    !$pmtcodes.dialog( "isOpen" ) && $pmtcodes.dialog( "open" );
});

$pmtcodes.dialog({
    autoOpen: false,
    position: { 
        my: "left top", 
        at: "left bottom", 
        of: $pmt_code 
    },
    closeOnEscape: true,
    open: function(){
        listPmtCodes();
        setTimeout(function () { // Workaround for Internet Explorer
            $pmt_code.focus(); //<---- Keep focus stayed on this field somehow
        }, 10);
    }
 });

我只是稍微修改了一下代码,以避免在DOM上对每个元素进行多次搜索。

您还需要实现keyup事件来捕获为关闭对话框而按下的ESC:

$pmt_code.keyup(function (e) {
    if (e.keyCode == 27 && $pmtcodes.dialog("isOpen")) // ESC pressed
    {
        $pmtcodes.dialog("close");
    }
});

在此查看一个live:http://jsfidle.net/9kuva/

希望这能有所帮助