0

我正在使用 JQuery UI 自动完成来填充地址搜索框,其中包含来自 Google 的地理编码服务的建议地址,如下所示:

$(function () {
  $("#address").autocomplete({
    //This bit uses the geocoder to fetch address values
    source: function (request, response) {
      geocoder.geocode({ 'address': request.term }, function (results, status) {
        response($.map(results, function (item) {
          return {
              label: item.formatted_address,
              value: item.formatted_address,
              latitude: item.geometry.location.lat(),
              longitude: item.geometry.location.lng()
              };
        }));
    });
},
//This bit is executed upon selection of an address
select: function (event, ui) {
    $("#latitude").val(ui.item.latitude);
    $("#longitude").val(ui.item.longitude);
}
});
});

第一次加载页面时,自动完成功能不起作用,并且在 JavaScript 控制台中出现此错误:

警告:您已在此页面上多次包含 Google Maps API。这可能会导致意外错误。

我已经检查过了,我肯定只调用了一次 API(它不包含在任何其他包含的脚本中)

奇怪的是,如果我在上述代码的第一行放置一个 Firebug 断点,我不会得到错误,并且自动完成工作正常。

有什么想法吗?

更新:这是页面主要代码的完整版本:

 <script type="text/javascript">     document.createElement('header'); document.createElement('nav'); document.createElement('section'); document.createElement('article'); document.createElement('aside'); document.createElement('footer'); document.createElement('banner'); document.createElement('menu'); document.createElement('hgroup'); document.createElement('figure'); document.createElement('figcaption'); document.createElement('details'); document.createElement('details');</script>
 <!-- IE 6/7/8/9 Fix Script Ends Here-->

    <link href="/css/mobile-normalize.css" rel="stylesheet">
    <link href="/css/mobile-styles.css" rel="stylesheet">
    <link href="/css/mobile-tradegothic-condeighteen.css" rel="stylesheet" type="text/css">
    <link href="/css/mobile-css.css" rel="stylesheet" type="text/css">
    <link href="/css/mobile-responsive.css" rel="stylesheet" type="text/css">
    <script src="/scripts/mobile/retina.js" type="text/javascript"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
    <script src="/scripts/mobile/jquery.mobile-menu.js" type="text/javascript"></script>
    <script src="/scripts/mobile/main.js" type="text/javascript"></script>


    <script>
        $(document).ready(function () {

            // hide #back-top first
            $("#back-top").hide();

            // fade in #back-top
            $(function () {
                $(window).scroll(function () {
                    if ($(this).scrollTop() > 100) {
                        $('#back-top').fadeIn();
                    } else {
                        $('#back-top').fadeOut();
                    }
                });

                // scroll body to 0px on click
                $('#back-top a').click(function () {
                    $('body,html').animate({
                        scrollTop: 0
                    }, 800);
                    return false;
                });

            });
        });
    </script>

</head>

<body>

    <section>


<!--<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>-->
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js" type="text/javascript"></script>
<script src="/scripts/purl.js" type="text/javascript"></script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB3Qs6Lp_YmhsC85fMfjHYaT5D4X_iwXZA&sensor=false"
    type="text/javascript"></script>
<script type="text/javascript">

    $(document).ready(function () {

        var suppliedAddress = $.url().param("address");

        if (suppliedAddress && (suppliedAddress != "")) {
            $("#address").val($.url().param("address"));
        }

        var selectedClasses = $.url().param("classes");

        if (selectedClasses != null) {
            var arrSelectedClasses = selectedClasses.split(',');

            for (i = 1; i < 15; i++) {
                var chk = $("#filter_" + i);
                if (chk != null) {
                    if ($.inArray(chk.val(), arrSelectedClasses) > -1) {
                        chk.attr('checked', 'checked');
                    } else {
                        chk.removeAttr('checked');
                    }
                }
            }
        }

        var geocoder = new google.maps.Geocoder();

        $(function () {
            $("#address").autocomplete({
                //This bit uses the geocoder to fetch address values
                source: function (request, response) {
                    geocoder.geocode({ 'address': request.term }, function (results, status) {
                        response($.map(results, function (item) {
                            return {
                                label: item.formatted_address,
                                value: item.formatted_address,
                                latitude: item.geometry.location.lat(),
                                longitude: item.geometry.location.lng()
                            };
                        }));
                    });
                },
                //This bit is executed upon selection of an address
                select: function (event, ui) {
                    $("#latitude").val(ui.item.latitude);
                    $("#longitude").val(ui.item.longitude);
                }
            });
        });

        $("form").submit(function () {
            var filter = [];
            for (i = 1; i < 15; i++) {
                var chk = $("#filter_" + i);
                if (chk != null && chk.is(':checked')) {
                    filter.push(chk.val());
                }
            }
            $("#selectedClasses").val(filter);
        });
    });

</script>
<form method="post" action="/global/en/find-a-class-list/" id="classList">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUENTM4MQ9kFgJmD2QWAmYPZBYCZg9kFgJmD2QWAgIDD2QWAgIBD2QWAmYPZBYCAgEQZGQWAgIDDxYCHgRUZXh0BSFQbGVhc2UgZW50ZXIgYSBsb2NhdGlvbiB0byBzZWFyY2hkZFENvCYrrddI6iYEHYyK3WKiJInatX9zdzE8+DJIH4IF" />
</div>

<div class="search_form2">
    <div class="search_field2">
        <input name="ctl00$ctl00$ctl00$ContentPlaceHolderDefault$MainContent$ClassLocatorList_1$address" type="text" id="address" class="input12" />
        <span>
            <input name="submit" type="submit" value="" class="retina-sprite" /></span>
    </div>
    <div class="filter_box">
        <input name="filter" type="button" value="Filter" class="filter" onclick="$('#filterpanel, #addressSearch, #clubList').toggle();" />
    </div>
    <input id="latitude" type="hidden" name="lat" />
    <input id="longitude" type="hidden" name="lon" />
</div>
    Please enter a location to search


</form>


    </section>



</body>
</html>
4

1 回答 1

1

看起来像这个脚本:

<script src="/scripts/mobile/jquery.mobile-menu.js" type="text/javascript"></script>

它包含在 Google 地图 API 之前,以某种方式干扰了 Google 地图 API,如果我在包含 API之后立即包含脚本,问题就会消失。不确定为什么会发生这种情况,怀疑这可能与某些页面元素或事件被调用或绑定的顺序有关。以下是调用移动菜单脚本的方式(来自还包含的 main.js 脚本):

$("body").mobile_menu({ menu: ['#main-nav ul', '#secondary-nav ul'], menu_width: 275, prepend_button_to: '#mobile-bar' });

/* Mobile Menu jQuery Plugin
 *
 * Creates a side nav bar that mimics the native IOS nav slide drawer
 *
 * Author: Nick Brewer
 * Version: 0.5
 *
 * REQUIRES: jQuery
 */

var mobileApp = mobileApp || {};

;(function(mobileApp,$){
  function getAndroidVersion() {
    var user = window.navigator.userAgent.toLowerCase();
    var android = user.indexOf("android") != -1;
    if (android) {
      var android2 = user.indexOf("android 2") != -1;
      var android4 = user.indexOf("android 4") != -1;
      if (android2) {
        return false;
      }
      if (android4) {
        var pointVersion = user.indexOf("android 4.") != -1;
        if (pointVersion) {
          var pVer = parseInt(user.substr(user.indexOf("android 4.") + 10, 1), 10);
          if (pVer >= 2) {
            return true;
          }
        }
        return false;
      }
    }
    else {
      return true;
    }
  }


    var goodBrowser = getAndroidVersion();
  if (!goodBrowser) {
    $("html").addClass("old-android");
  }
  var MobileMenu = function(elem, options){
    this.elem = elem;
    this.$elem = $(elem);
    this.options = options;
  };

  MobileMenu.prototype = {
    defaults: {
      page_id: 'build-menu-page',
      menu: '', // set as an array for multiple menus
      menu_width: 260,
      menu_id: "mobile-nav",
      button_content: 'Open menu',
      prepend_button_to: '',
      menu_bar: ''
    },

    /*
     * Initiate app. Set Layout.
     *
     * @return this
     */
    init: function(){
      var _this = this;
      _this.config = $.extend({}, _this.defaults, _this.options);

      if($(_this.config.menu_id).length === 0){
        this.setLayout();
      }

      return _this;
    },

    /*
     * Clone site navigation and set it as mobile nav, set Class on each new menu
     *
     * @return false if no menu option is provided
     */

    buildMenu: function(){
      var _this = this;
      _this.config = $.extend({}, _this.defaults, _this.options);
      var menu = _this.config.menu,
          mobile_menu = $("#build-menu"),
          menu_collection = [];

      // GET MENU AND BUILD MOBILE NAV
      if(menu){
        if($.isArray(menu)){
          $(menu).each(function(i, e){
            mobile_menu.append($(e).clone().addClass(_this.config.menu_id+"-"+i));
            $(e).hide();
          });
        } else {
          mobile_menu.append($(menu).clone().addClass(_this.config.menu_id+"-0").removeAttr("id"));
          $(menu).hide();
        }
      } else {
        return false;
      }
    },

    /*
     * Set CSS for new layout.
     *
     * @return void
     */
    setCSS: function(){
      var _this = this;
      _this.config = $.extend({}, _this.defaults, _this.options);

      $("#build-menu-overlay").css({
        position: "absolute",
        top: 0,
        bottom: 0,
        right: 0,
        left: 0,
        "z-index": 99,
        opacity: 0,
        display: "none"
      });

      $("html,body").css("height","100%");

      if(_this.config.menu_bar){
        if (goodBrowser) {
        $(_this.config.menu_bar).css({
            position: "fixed"
          });
        }
      else {
          $(_this.config.menu_bar).css({
            position: "absolute"
          });
        }
      }

      //$("<style />").appendTo("head").html('#'+_this.config.page_id+' { position: relative; min-height: 100% }');
      //$("style").append('html.build-menu-open #'+_this.config.page_id+' { position: fixed; overflow: hidden; width: 100%; left: 0; top: 0; bottom: 0 }');
    },

    /*
     * Set Layout, Build Menu, Set CSS. Set event handler for menu.
     *
     * @return void
     */
    setLayout: function(){
      var _this = this;
          _this.config = $.extend({}, _this.defaults, _this.options);

      // If prepend_button_to is not set to something custom, then just prepend to the page setting
      if(_this.config.prepend_button_to == ''){
        var prepend_button_to = "#"+_this.config.page_id;
      } else {
        var prepend_button_to = _this.config.prepend_button_to;
      }

      // SET HTML FRAMEWORK
      _this.$elem.wrapInner('<div id="'+_this.config.page_id+'" />').find("#"+_this.config.page_id).before('<div id="build-menu" />');
      $(prepend_button_to).prepend('<a href="#" id="build-menu-button">'+_this.config.button_content+'</a>');
      $("#"+_this.config.page_id).prepend('<div id="build-menu-overlay" />');

      this.buildMenu();
      this.setCSS();

      var element = document.getElementById(_this.config.page_id);
      element.addEventListener("oTransitionEnd", remove_animation_class,false);
      element.addEventListener("transitionend", remove_animation_class,false);
      element.addEventListener("webkitTransitionEnd", remove_animation_class,false);
      element.addEventListener("MSTransitionEnd", remove_animation_class,false);

      function remove_animation_class(){
        if($("html").hasClass("build-menu-close")){
          $("html").removeClass("build-menu-animating");
        }
      }

      // EVENT HANDLER FOR MENU BUTTON
      $("#build-menu-button, #build-menu-overlay").on("click", function(e){
        e.preventDefault();
        var html = $("html");
        var page = $("#"+_this.config.page_id);
        var overlay = $("#build-menu-overlay");

        html.addClass("build-menu-animating");

        if(html.hasClass("build-menu-open")){
          html.removeClass("build-menu-open");
          html.addClass("build-menu-close");

        if (goodBrowser) {
          page.css({
            "-webkit-transform": "translateX(0px)",
            "-moz-transform": "translateX(0px)",
            "-o-transform": "translateX(0px)",
            "-ms-transform": "translateX(0px)",
            "transform": "translateX(0px)"
          });
        }
      else {
          page.css("left", "0px");
        }

          overlay.fadeTo("slow",0, function(){
            $(this).css("visibility", "hidden");
          });
        } else {
          html.addClass("build-menu-open");
          html.removeClass("build-menu-close");

      if (goodBrowser) {

        page.css({
        "-webkit-transform": "translateX("+_this.config.menu_width+"px"+")",
        "-moz-transform": "translateX("+_this.config.menu_width+"px"+")",
        "-o-transform": "translateX("+_this.config.menu_width+"px"+")",
        "-ms-transform": "translateX("+_this.config.menu_width+"px"+")",
        "transform": "translateX("+_this.config.menu_width+"px"+")"
        });

      }
      else {
      page.css("left", _this.config.menu_width+"px");
      }

          overlay.css("visibility", "visible").fadeTo("slow",0.5);
        }
      });
    }
  };

  MobileMenu.defaults = MobileMenu.prototype.defaults;

  $.fn.mobile_menu = function(options) {
    return this.each(function() {
      new MobileMenu(this, options).init();
    });
  };

  mobileApp.MobileMenu = MobileMenu;
})(mobileApp,jQuery);
于 2013-08-21T03:22:08.487 回答