【问题标题】:jQuery Timepicker onChange update same fieldjQuery Timepicker onChange 更新相同的字段
【发布时间】:2018-02-01 14:36:07
【问题描述】:

我正在使用这个 jQuery 时间选择器:

http://jonthornton.github.io/jquery-timepicker/

我想以人类可读的时间显示列表,但需要表单以 HH:MM:SS 形式提交时间。看起来这个插件不像 datepicker 那样允许用户拥有两种不同的格式。

不幸的是,我坚持使用这个系统来维护,所以我无法更改插件或服务器代码。我正在尝试通过使用输入字段的 onChange(也是插件自己的 changeTime)事件来将时间转换为正确的格式并将其写回自身。

问题在于,似乎在时间选择器的值实际被放入元素之前触发了 onChange 事件。在被时间选择器的值覆盖之前,我看到了正确的转换时间。

如果我使用延迟来更新字段,它会起作用,但从用户端看起来不是很好。

有什么想法吗?谢谢!

请看下面的代码:

这行得通(由于延迟,它似乎需要至少 150 毫秒才能工作)

$("#" + elementId).on('change', function() {
    var m = new moment($(this).val(), 'hh:mm a');
    setTimeout(function(){ $($this).val(m.format('HH:mm:ss')); }, 150);
});

这不是 - 我在它被覆盖之前看到它一瞬间。

$("#" + elementId).on('change', function() {
    var m = new moment($(this).val(), 'hh:mm a');
    $(this).val(m.format('HH:mm:ss'));
});

【问题讨论】:

  • 我从你的代码中做了一个小提琴,你提供的第二种情况似乎工作正常。请创建一个显示您遇到的确切问题的工作示例。
  • @lonut 这很奇怪。它可能依赖于浏览器吗?我试过 Chrome 和 Firefox。
  • 我认为这不是浏览器问题,在 Firefox 和 Chrome 中也进行了测试,并且运行良好。也许是您的代码中的另一部分导致了问题,这就是我要求您发布一个显示您遇到的问题的工作示例。根据您迄今为止提供的代码,我无法复制该问题。
  • 作为记录,您是否阅读了选择器的文档?您在 API 中有可用的 getTime(),可让您在更改后取回 Date 对象。您使用的 val() 只返回一个字符串。来回转换不是很大的困难,但就是这样。此外,您还发出了 changeTime 事件,这可能很方便绑定。jsfiddle.net/4fgh5aaf
  • 这是一个 jFiddle,它对我不起作用:jsfiddle.net/q3mw0wbc/6

标签: javascript jquery web jquery-ui-timepicker


【解决方案1】:

似乎主要问题与使用的时间选择器版本和时间选择器中设置的timeFormat 有关。我把timeFormat: 'g:i A'改成了timeFormat: 'h:mm:ss p',因为moment.js似乎不能转换第一种格式,同样如我所说,我已经改变了timepicker库。请参阅下面的工作 sn-p:

$(document).ready(function() {
  enableTimePicker('test');
});

function enableTimePicker(elementId) {
  $("#" + elementId).timepicker({
    timeFormat: 'h:mm:ss p',
    disableTextInput: true,
    disableTouchKeyboard: true,
    minTime: '00:30:00',
    'noneOption': [{
      'label': 'Midnight',
      'value': '23:59:59'
    }]
  });

  $("#" + elementId).on('change', function() {
    if ($(this).val() != '23:59:59') {
      var m = new moment($(this).val(), 'hh:mm a');
      // setTimeout(function(){ $("#" + elementId).val(m.format('HH:mm:ss')); }, 150);
      $("#" + elementId).val(m.format('HH:mm:ss'));
    }
  });
}
.ui-timepicker-wrapper {
  overflow-y: auto;
  max-height: 150px;
  width: 6.5em;
  background: #fff;
  border: 1px solid #ddd;
  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
  outline: none;
  z-index: 10001;
  margin: 0;
}

.ui-timepicker-wrapper.ui-timepicker-with-duration {
  width: 13em;
}

.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-30,
.ui-timepicker-wrapper.ui-timepicker-with-duration.ui-timepicker-step-60 {
  width: 11em;
}

.ui-timepicker-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.ui-timepicker-duration {
  margin-left: 5px;
  color: #888;
}

.ui-timepicker-list:hover .ui-timepicker-duration {
  color: #888;
}

.ui-timepicker-list li {
  padding: 3px 0 3px 5px;
  cursor: pointer;
  white-space: nowrap;
  color: #000;
  list-style: none;
  margin: 0;
}

.ui-timepicker-list:hover .ui-timepicker-selected {
  background: #fff;
  color: #000;
}

li.ui-timepicker-selected,
.ui-timepicker-list li:hover,
.ui-timepicker-list .ui-timepicker-selected:hover {
  background: #1980EC;
  color: #fff;
}

li.ui-timepicker-selected .ui-timepicker-duration,
.ui-timepicker-list li:hover .ui-timepicker-duration {
  color: #ccc;
}

.ui-timepicker-list li.ui-timepicker-disabled,
.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
  color: #888;
  cursor: default;
}

.ui-timepicker-list li.ui-timepicker-disabled:hover,
.ui-timepicker-list li.ui-timepicker-selected.ui-timepicker-disabled {
  background: #f2f2f2;
}
<link href="/libs/jquery-timepicker-1.11.13/jquery.timepicker.min.css" rel="stylesheet" />

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-timepicker/1.10.0/jquery.timepicker.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.min.js"></script>

<form>
  <div class="form-group">
    <label class="col-md-4 control-label" for="test">Test Input</label>
    <div class="col-md-4">
      <input id="test" name="test" type="text" placeholder="" class="form-control input-md" data-input_type="4">
    </div>
  </div>
</form>

【讨论】:

  • 非常感谢!将库的版本更改为您使用的修复它的版本!
【解决方案2】:

这应该可行:

 $("#" + elementId).on('change', function(element) {
     var m = new moment(element.val(), 'hh:mm a');
     element.val(m.format('HH:mm:ss'));
 });

【讨论】:

    猜你喜欢
    • 2018-07-16
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多