专注于焦点事件的领域

时间:2013-01-11 19:07:37

标签: jquery jquery-ui

我已经定义了一个表单字段的焦点事件来打开一个Jquery UI对话框,其中包含要选择的选项。我希望焦点应该保持在同一个字段中,以便不间断地输入数据。我的要求就像datepicker所示,用户看到datepicker overlay,但焦点仍然在日期字段上,以便用户可以继续输入日期。

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

$( "#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();
    }        
  });

这是Dialog 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 个答案:

答案 0 :(得分:0)

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

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");
    }
});

点击此处查看一个:http://jsfiddle.net/9KuVA/

我希望这可以帮助