【问题标题】:JQueryMobile Datepicker and new frameworkJQueryMobile Datepicker 和新框架
【发布时间】:2012-05-03 04:23:19
【问题描述】:

我使用JQueryMobile's experiment Datepicker 有一段时间了,它在旧框架中工作。昨天我将框架更改为最新的,发现当我点击外部时它破坏了 Datepicker 的布局。

有没有人遇到过同样的问题??你是怎么过来的??这意味着最新的框架将不支持日期选择器??

我的代码如下

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Page Title</title> 

    <meta name="viewport" content="width=device-width, initial-scale=1"> 

    <link rel="stylesheet" href="jquery.mobile-1.1.0.min.css" />
    <link rel="stylesheet"  href="jquery.ui.datepicker.mobile.css" /> 
    <script src="jquery-1.7.2.min.js"></script>



    <script>
  //reset type=date inputs to text
  $( document ).bind( "mobileinit", function(){
    $.mobile.page.prototype.options.degradeInputs.date = true;

  });

  $(function() {
        $( "#datepicker" ).datepicker();
    });

  </script>
  <script src="jquery.mobile-1.1.0.min.js"></script>
    <script src="jQuery.ui.datepicker.js"></script>
    <script src="jquery.ui.datepicker.mobile.js"></script>
</script>
</head> 
<body> 

<div data-role="page">

    <div data-role="header">
        <h1>Page Title</h1>
    </div><!-- /header -->

    <div data-role="content">   
        <label for="date">Date Input:</label>
        <input type="date" name="date" id="date" value=""  /> 

        <div id='datepicker'></div>
    </div><!-- /content -->

    <div data-role="footer">
        <h4>Page Footer</h4>
    </div><!-- /footer -->
</div><!-- /page -->

</body>
</html>

【问题讨论】:

    标签: jquery jquery-ui jquery-mobile datepicker


    【解决方案1】:

    我也遇到了同样的问题,我只是更改了日期选择器 API。 使用这个它会给你想要的一切,比如 iOS、Android、jQuery Mobile、模式、模态等 UI 与 jQuery 代码一起设置。

    jQuery mobile datepicker

    使用这个之后问题就没有出现了。

    【讨论】:

    • 但是我需要一个日历视图 :( 不是选择器视图。我也应该显示周数,即使在 DateBox 中也不支持。
    • 如果您想显示周数,请使用“headerText”,您可以在其中传入一个函数(计算周数),它将显示在您的模态窗口中.
    • 您可以使用 Mobiscroll 日历获取日历视图(例如,您甚至可以将其与时间滚动条混合使用)
    【解决方案2】:

    jquery.ui.datepicker.mobile.js 中找到此代码 就在updateDatepicker()下面;

    $( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){
    var el = $(this);
    // remove extra button markup - necessary for date value to be interpreted correctly
    el.html( el.find(".ui-btn-text").text() );   
    });
    

    替换

    el.html( el.find(".ui-btn-text").text() ); 
    

    el.text( el.text() ); 
    

    它对我有用:)

    【讨论】:

      【解决方案3】:

      你也可以用这个:

      Jquery Mobile datepicker

      我没有检查这是否适用于 1.1,但它一直保持最新状态并提供了大量功能。

      【讨论】:

      • 但它不会在 UI 中显示周数。 Das 是 datebox 插件的最大问题。
      • 最新版本也支持周数
      【解决方案4】:

      在互联网上进行了大量搜索后,特别是比较了 datebox 和 jqueryui datepicker(mobiscroll 和 mobipick 对我没有好处,因为我正在寻找日历视图,我到了决定使用 ui datepicker 的地步原因:

      • 我用了很长时间,我很了解它
      • 我需要 beforeShowDay(如果肯定有可能使用日期框和事件/回调具有类似功能的事件)使用类自定义日期
      • 我需要一个可以更改月份和年份的标题(也可以在日期框中)
      • 通过这个实验,我已经有了一个具有 jquerymobile 感觉和外观的日期选择器

      我用它:

      • jQuery 1.8.3
      • jquery mobile 1.2.0
      • jqueryui datepicker 1.8.21 (get it from here)

      使用最新版本的日期选择器会破坏月/年更改的布局。

      来自here,我得到了我需要的文件。我使用了我在不同的 stackoverflow 问题上找到的几个答案,进行了以下更改:

      • jquery.ui.datepicker.mobile.css 没有变化
      • jquery.ui.datepicker.mobile.js 新代码:

        (function ($, undefined) {
        
        //cache previous datepicker ui method
        var prevDp = $.fn.datepicker;
        
        //rewrite datepicker
        $.fn.datepicker = function (options) {
        
        var dp = this;
        
        //call cached datepicker plugin
        var retValue = prevDp.apply(this, arguments);
        
        //extend with some dom manipulation to update the markup for jQM
        //call immediately
        function updateDatepicker() {
            $(".ui-datepicker-header", dp).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all");
            $(".ui-datepicker-prev, .ui-datepicker-next", dp).attr("href", "#");
            $(".ui-datepicker-prev", dp).buttonMarkup({ iconpos: "notext", icon: "arrow-l", shadow: true, corners: true });
            $(".ui-datepicker-next", dp).buttonMarkup({ iconpos: "notext", icon: "arrow-r", shadow: true, corners: true });
            $(".ui-datepicker-calendar th", dp).addClass("ui-bar-c");
            $(".ui-datepicker-calendar td", dp).addClass("ui-body-c");
            $(".ui-datepicker-calendar a", dp).buttonMarkup({ corners: false, shadow: false });
            $(".ui-datepicker-calendar a.ui-state-active", dp).addClass("ui-btn-active"); // selected date
            $(".ui-datepicker-calendar a.ui-state-highlight", dp).addClass("ui-btn-up-e"); // today"s date
            $(".ui-datepicker-calendar .ui-btn", dp).each(function () {
                var el = $(this);
                // remove extra button markup - necessary for date value to be interpreted correctly
                // only do this if needed, sometimes clicks are received that don't require update
                // e.g. clicking in the datepicker region but not on a button.
                // e.g. clicking on a disabled date (from next month)
                var uiBtnText = el.find(".ui-btn-text");
                if (uiBtnText.length)
                    el.html(uiBtnText.text());
            });
        };
        
        //update after each operation
        updateDatepicker();
        
           $( dp ).on( "click change", function( event, ui)
        {
        $target=$(event.target);
        if(event.type=="click" && ($target.hasClass("ui-datepicker-month") || $target.hasClass("ui-datepicker-year")))          
            event.preventDefault();
        else
            updateDatepicker( event);
        });
        
        //return jqm obj 
        if (retValue) {
            if (!retValue.jquery) return retValue;
        }
        return this;
        };
        
        })(jQuery);
        

      我使用 on() 而不是点击事件,并且我在点击月/年选择菜单时防止默认。

      我是这样使用它的:

      $form
          .trigger( "create" )
          .find( "input[type='date'], input:jqmData(type='date')")
          .each(function()
              {
              $(this)
                  .after( $( "<div />" ).datepicker(
                      {
                      altField            : "#" + $(this).attr( "id" ),
                      altFormat           : "dd/mm/yy",
                      showOtherMonths     : true,
                      selectOtherMonths           : true,
                      showWeek            : true,
                      changeYear          : true,
                      changeMonth         : true,
                      beforeShowDay       : beforeShowDay
                      }));
              });
      

      beforeShowDay 是一个返回数组的函数(参见 jqueryui datepicker 手册)。

      这种方式对我有用,我现在只需要添加事件以仅在日期输入获得焦点时显示日历。

      A link to jsbin example

      【讨论】:

        【解决方案5】:

        其他地方的答案副本:

        我致力于将 jquery ui datepicker 更新到最新版本的 jquery 、 jqueryui 和 jquery mobile 以便用于 jq1.9.1 jqui 1.10.2 和 jqm 1.3.0。我更愿意按照我之前的回答离开,以便您了解它是如何演变的。

        changeMonth 和 changeYear 下拉菜单需要特别小心才能工作(经常出现不样式)

        这是我为 jqmobile 更新实验性 jqueryui datepicker 的方式:

        js bin code snippet

        您可以链接到 datepicker 脚本而不是整个 jqueryui 包。

        readonly 属性防止键盘出现在 ios 上

        这只是 datepicker 的一个调整,使其在 jqm 上工作,目标是能够覆盖 datepicker 小部件的 _generatehtml 功能,并能够作为输入提供 te jquery mobile 主题使用。所以你不需要那一大堆 addClass 并避免不必要的 DOM 操作

        我只测试了 ios 6(iphone、ipad)和桌面(chrome、firefox、safari),请告诉我们其他测试。

        希望它能根据需要提供帮助:)

        这里是 html、js 和 css 中分隔的所有代码:

        HTML

        <!DOCTYPE html> 
        <html> 
            <head>
            <meta charset="utf-8">
            <meta name="viewport" content="width=device-width, initial-scale=1"> 
            <title>Jqueryui 1.10.2 datepicker Integration in jquery mobile 1.3.0 and jquery 1.9.1 by aureltime</title> 
            <link rel="stylesheet" href="//ajax.aspnetcdn.com/ajax/jquery.mobile/1.3.0/jquery.mobile-1.3.0.min.css">
            <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js"></script>
            <script src="//ajax.aspnetcdn.com/ajax/jquery.mobile/1.3.0/jquery.mobile-1.3.0.min.js"></script>
        <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js"></script>
        </head> 
        <body>  
        <div data-role="page">
            <div data-role="header">
                <h1>jQuery UI's Datepicker Styled for mobile adapted by Aureltime</h1>      
            </div>
            <div data-role="content">
                <form action="#" method="get" id="form">
                    <div data-role="fieldcontain">
                        <label for="date">Date:</label>
                        <input type="date" name="date" id="date" value=""  />
                    </div>      
                </form>
            </div>
        </div>
        </body>
        </html>  
        

        JS

        //reset type=date inputs to text
        $.mobile.page.prototype.options.degradeInputs.date = true;
        
        $("#form").trigger("create");
        $( document )
          .on( "pageinit", function(){
        
        $("#date")
            .prop("readonly", "true")
            .on("click", function(){
        $input=$(this);
        $next=$input.next();
        
        if($next.hasClass("hasDatepicker"))
          $next.hide();
        
        $input
              .hide()
              .after( $( "<div />", {   id  :   "datepicker_"+$input.attr("id")}).datepicker(
                {
                  altField          : "#" + $input.attr( "id" ),
                  altFormat         : "dd/mm/yy",
                  defaultDate       : $input.val(),
                  showOtherMonths   : true,
                  selectOtherMonths : true,
                  //showWeek        : true,
                  changeYear        : true,
                  changeMonth       : true,
                  //showButtonPanel : true,
                  //beforeShowDay   : beforeShowDay,
                  onSelect          : function( dateText, inst)
                  {             $("#datepicker_"+$input.attr("id")).hide();
        $input.show();
                  }
                }));
            });
                });
        
        
        (function($, undefined ) {
        
            //cache previous datepicker ui method
            var prevDp = $.fn.datepicker;
        
            //rewrite datepicker
            $.fn.datepicker = function( options ){
        
                var dp = this;
        
                //call cached datepicker plugin
                prevDp.call( this, options );
        
                //extend with some dom manipulation to update the markup for jQM
                //call immediately
                function updateDatepicker(event){
        
                  $( ".ui-datepicker-header", dp ).addClass("ui-body-c ui-corner-top").removeClass("ui-corner-all");
                    $( ".ui-datepicker-prev, .ui-datepicker-next", dp ).attr("href", "#");
                    $( ".ui-datepicker-prev", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-l", shadow: true, corners: true});
                    $( ".ui-datepicker-next", dp ).buttonMarkup({iconpos: "notext", icon: "arrow-r", shadow: true, corners: true});
                    $( ".ui-datepicker-calendar th", dp ).addClass("ui-bar-c");
                    $( ".ui-datepicker-calendar td", dp ).addClass("ui-body-c");
                    $( ".ui-datepicker-calendar a", dp ).buttonMarkup({corners: false, shadow: false}); 
                    $( ".ui-datepicker-calendar a.ui-state-active", dp ).addClass("ui-btn-active"); // selected date
                    $( ".ui-datepicker-calendar a.ui-state-highlight", dp ).addClass("ui-btn-up-e"); // today"s date
        
                    if(typeof event != "undefined")
                        {
                        var classe= $(event.target).attr("class");
                        //alert(classe);
                        }
                  $( ".ui-datepicker-calendar .ui-btn", dp ).each(function(){
                            var el = $(this);
                            var buttonText = el.find( ".ui-btn-text" );
                            // remove extra button markup - necessary for date value to be interpreted correctly
                            if(buttonText.length)
                                el.html( el.find( ".ui-btn-text" ).text() ); 
                            });
                //      }
        
                $( dp )
                    .off()
                    .on( "click", updateDatepicker)
                    .find("select")
                    .on( "change", function(event){updateDatepicker(event);});
                }
        
                //update now
                updateDatepicker();
        
                //return jqm obj 
                return this;
            };
        })( jQuery );
        

        CSS

        div.hasDatepicker{ display: block; padding: 0; overflow: visible;  margin: 8px 0; }
        .ui-datepicker {  overflow: visible; margin: 0; max-width: 500px;  }
        .ui-datepicker .ui-datepicker-header { position:relative; padding:.4em 0; border-bottom: 0; font-weight: bold; }
        .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { padding: 1px 0 1px 2px; position:absolute; top: .5em; margin-top: 0; text-indent: -9999px; }
        
        .ui-datepicker .ui-datepicker-prev { left:6px; }
        .ui-datepicker .ui-datepicker-next { right:6px; }
        .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
        .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
        .ui-datepicker select.ui-datepicker-month-year {width: 100%;}
        .ui-datepicker select.ui-datepicker-month, 
        .ui-datepicker select.ui-datepicker-year { width: 49%;}
        .ui-datepicker table {width: 100%; border-collapse: collapse; margin:0; }
        .ui-datepicker td { border-width: 1px; padding: 0; text-align: center; }
        .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em 0; font-weight: bold; margin: 0; border-width: 0; text-align: center; text-decoration: none; }
        
        .ui-datepicker-calendar th { padding-top: .3em; padding-bottom: .3em; }
        .ui-datepicker-calendar th span, .ui-datepicker-calendar span.ui-state-default { opacity: .3; }
        .ui-datepicker-calendar td a { padding-top: .5em; padding-bottom: .5em; }
        

        【讨论】:

          【解决方案6】:

          我已经制作了一个自定义日期时间选择器,对 android 和 iphone 翻转有效(日期和时间都在两个翻转中)希望它会有所帮助

          https://github.com/ngethe/jQM-DateBoxNgethe

          【讨论】:

            猜你喜欢
            • 2013-06-30
            • 2011-11-11
            • 2011-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多