如何获得与输入内联的jQuery UI Datepicker按钮?

Pro*_*ofK 17 css jquery-ui twitter-bootstrap twitter-bootstrap-3

在MVC 5项目中,使用默认的引导程序布局,我使用以下代码将某个类的所有输入设置为jQuery UI Datepicker窗口小部件:

$(".jqueryui-marker-datepicker").datepicker({
    dateFormat: "yy-mm-dd",
    changeYear: true,
    showOn: "button"
}).next("button").button({
    icons: { primary: "ui-icon-calendar" },
    label: "Select a date",
    text: false
});
Run Code Online (Sandbox Code Playgroud)

以下是在执行上述调用后由Razor和jQuery UI呈现的HTML,减去了一些aria和验证data属性:

<div class="form-group">
    <label class="control-label col-md-2" for="Time">Date</label>
    <div class="col-md-10">
        <input class="form-control jqueryui-marker-datepicker hasDatepicker valid" id="Time" name="Time" type="text" value="2015-05-02">
        <button type="button" class="ui-datepicker-trigger ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only" role="button" title="Select a date">
            <span class="ui-button-icon-primary ui-icon ui-icon-calendar"></span><span class="ui-button-text">Select a date</span>
        </button>
        <span class="text-danger field-validation-valid" data-valmsg-for="Time" data-valmsg-replace="true"></span>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

这个问题是datepicker按钮出现在日期输入下方.这是因为bootstrap .form-control类使得输入a display: block.如果我在Chrome控制台中对此进行编辑,则inline-block该按钮会立即显示在输入右侧,正好位于我想要的位置.

现在我可以添加一个新的css规则如下:

.form-control.jqueryui-marker-datepicker {
  display: inline-block;
}
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否是最好的方法,对引导程序所做的所有布局魔法的影响最小.

Kyl*_*Mit 13

用于显示输入旁边按钮的引导隐喻是使用input-group如下所示:

<div class="input-group">
  <input type="date" class="form-control" placeholder="Date" />
  <span class="input-group-btn">
    <button class="btn btn-default" type="button">
        <span class="glyphicon glyphicon-calendar" ></span>
    </button>
  </span>
</div>
Run Code Online (Sandbox Code Playgroud)

你可以调整你的脚本来格式化输出,通过包装这样的内容来添加这些类和html结构:

$(".jqueryui-marker-datepicker")
  .wrap('<div class="input-group">')
  .datepicker({
    dateFormat: "yy-mm-dd",
    changeYear: true,
    showOn: "button"
  })
  .next("button").button({
    icons: { primary: "ui-icon-calendar" },
    label: "Select a date",
    text: false
  })
  .addClass("btn btn-default")
  .wrap('<span class="input-group-btn">')
  .find('.ui-button-text')
  .css({
    'visibility': 'hidden',
    'display': 'inline'
  });
Run Code Online (Sandbox Code Playgroud)
<link href="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.css" rel="stylesheet"/>
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.4/jquery-ui.js"></script>

<input type="text" class="jqueryui-marker-datepicker form-control">
Run Code Online (Sandbox Code Playgroud)


替代w/Bootstrap

话虽如此,这是一个非常复杂的方式来做到这一点.我添加了一个原生的bootstrap glyphicon,而不是试图强制按钮正确显示.混合jQuery-UI和Bootstrap也很常见,因为功能上存在很多重叠,并且它们并不总能很好地结合在一起.我建议只考虑使用datepicker插件扩展bootstrap.

这是使用的示例

$('.datepicker').datepicker({});

// 
$('.datepicer-icon').on('click', '.btn', function(e) {
  $(e.delegateTarget).find('.datepicker').focus();
});
Run Code Online (Sandbox Code Playgroud)
<link href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/css/bootstrap.css" rel="stylesheet"/>
<link href="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/css/datepicker.css" rel="stylesheet"/>

<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.2/js/bootstrap.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.1/js/bootstrap-datepicker.js"></script>

<div class="container" >

  <h3>With Input Group</h3>
  <div class="input-group datepicer-icon">
    <input type="text" class="form-control datepicker" placeholder="Date" />
    <span class="input-group-btn">
      <button class="btn btn-default" type="button">
        <span class="glyphicon glyphicon-calendar" ></span>
      </button>
    </span>
  </div>

  <h3>With Feedback</h3>
  <div class="form-group has-feedback">
    <input type="text" class="form-control datepicker" placeholder="Date" />
    <i class="glyphicon glyphicon-calendar form-control-feedback"></i>
  </div>

</div>
Run Code Online (Sandbox Code Playgroud)