【问题标题】:Bootstrap 3 Datepicker propagation keypress eventBootstrap 3 Datepicker传播按键事件
【发布时间】:2016-02-10 07:40:27
【问题描述】:

某些应用程序必须具有“下一个 gui-control on Enter press”功能。我们使用下面的代码来注册全局处理程序,但它不适用于 Bootstrap 3 Datepicker。有没有人建议我们可以“覆盖”默认行为的某种方式?

这里是为按键事件注册全局处理程序的核心:

jQuery.extend(jQuery.expr[':'], {
  focusable: function (el, index, selector) {
    return $(el).is('a, button, :input, [tabindex]');
  }
});
$(document).on('keypress', 'input,select,textarea', function (e) {
  if (e.which == 13) {
    e.preventDefault();
    // Get all focusable elements on the page
    var $canfocus = $(':focusable');
    var index = $canfocus.index(document.activeElement) + 1;
    if ($canfocus.eq(index).attr('tabindex') == -1) index++;
    if (index >= $canfocus.length) index = 0;
    $canfocus.eq(index).focus();
  }
});

我们使用这个 DP:https://eonasdan.github.io/bootstrap-datetimepicker/

jQuery JavaScript 库是 v2.1.4

引导 v3.3.5

Datapicker 页面上的代码是:

<form ...>
  <div class="form-horizontal">
    <div class="form-group">
      <label class="col-md-2 control-label" for="Date">Datum</label>
      <div class="col-md-10">

        <div class="input-group date" id="datetimepicker1">
          <input type="text" id="Date" name="Date" >
          <span class="input-group-addon">
            <span class="glyphicon glyphicon-calendar"></span>
          </span>
        </div>
        <script type="text/javascript">
          $(function () {
            $('#datetimepicker1').datetimepicker({ format: 'L' });
          });
        </script>

        <span class="text-danger field-validation-valid"></span>
      </div>
    </div>
  </div>
</form>

使用此代码,在数据选择器处于焦点的“Enter”上没有发生任何事情。

【问题讨论】:

  • 在这里工作正常jsfiddle.net/RR4hw/1220
  • 像你写的那样必须有 HTML 结构吗?这个问题可能出在 HTML 结构中吗?我们在数据选择器周围有不同的 HTML 结构?我将使用更多 HTML 更新问题 HTML。
  • 我无法想象影响按键的html结构
  • 为按键事件注册全局处理程序的代码在单独的文件中,我们在标题标签中加载它的脚本链接。在浏览器调试中,我们无法捕获 DataPicker 的事件。上面的代码在 jsfiddle.net 中运行良好。
  • 我们刚刚从eonasdan.github.io/bootstrap-datetimepicker下载了整页并在文件末尾添加了java-script代码,我们无法检测到按键事件。我在 jsfiddle.net 中举例说明的是某些 java-script lib 的不同版本。

标签: twitter-bootstrap datepicker


【解决方案1】:

datetimepicker 中有一个keydown 事件处理程序,它停止传播,因此停止keypress 事件。

一种选择是重载keydown 事件并调用自定义事件,同时传递which,然后为keydown 调用原始事件:-

// get original keydown event
var h = jQuery._data($('#datetimepicker1 input')[0], "events").keydown[0].handler;
// override keydown
jQuery._data($('#datetimepicker1 input')[0], "events").keydown[0].handler = function(e) {
  // create a new custom event and trigger it with 'which' passed
  var event = $.Event('dpkeydown');
  event.which = e.which;
  $(this).trigger(event);
  // call original keydown event 
  h(e);
}

// now watch for 'dpkeydown'
$(document).on('keypress dpkeydown', 'input,select,textarea', function(e) {
  if (e.which == 13) {
     .....

【讨论】:

  • 仅供参考,将上面的代码放在 jQuery(function () { });为了使用 jQuery._data().
猜你喜欢
  • 1970-01-01
  • 2014-07-03
  • 2016-09-13
  • 2015-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多