使用本机输入类型=“日期”的jQuery UI的协议相对URL方法

时间:2013-09-18 21:22:13

标签: javascript jquery html5

使用以下函数,此脚本会询问浏览器本地是否<input type="date">可用。如果没有,它将从CDN加载jQuery UI。

$(document).ready(function(event){
    // Date Picker with fallback
    // http://diveintohtml5.info/forms.html#type-date
    var i = document.createElement("input");
    i.setAttribute("type", "date");
    if (i.type == "text") {

        // No native date picker support :(
        // Use jQuery UI to create one then dynamically replace that <input> element.
        var jQueryUICSS = document.createElement('link');
        jQueryUICSS.href = "http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css";
        jQueryUICSS.rel = "stylesheet";
        document.getElementsByTagName('head')[0].appendChild(jQueryUICSS);

        $.getScript("http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js", function() {
            $.datepicker.setDefaults(
                $.extend($.datepicker.regional[''])
            );
        });
    }
});

我想要做的是确保使用Paul Irish defined的协议相对方法对CSS和JS进行本地回退,但使用与HTML5 Boilerplate类似的更新版本:< / p>

<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-ui.min.js"><\/script>')</script>

在原始示例中,Javascript正在创建一个仅指向jquery网站的link元素。我不太确定如何编写此协议相关方法的第二行并使用javascript创建它。

同样,getScript()方法正在添加jQuery UI js文件。如何添加此文件的本地版本仍然允许$.datepicker()按预期加载?我不得不使用getScript(),因为如果我不这样做,则会发出一个控制台错误,说它未定义。

如何将本地文件的这种回退方法包含在我已编写的代码中?

1 个答案:

答案 0 :(得分:1)

您可以使用Promise pattern

$.getScript("//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js")
  .then(null, function handleError() {
      console.log("first try failed, loading local version");
      return $.getScript("js/vendor/jquery-ui.min.js");
  }).done(function() {
      console.log("succeeded to load jQuery UI");
      $.datepicker.setDefaults(
          $.extend($.datepicker.regional[''])
      );
  }).fail(function(_, status, error) {
      console.error("both attempts to load jQuery UI failed", status, error);
  });

然而,在某些jQuery版本中似乎$.getScript function never fails on crossdomain scripts所以你可能需要使用超时。