Làm cách nào tôi có thể kiểm tra xem Google Maps đã được tải đầy đủ chưa?


293

Tôi đang nhúng Google Maps vào trang web của mình. Khi Google Maps được tải, tôi cần khởi động một vài quy trình JavaScript.

Có cách nào để tự động phát hiện khi Google Maps đã được tải đầy đủ, bao gồm cả tải xuống ô xếp và tất cả không?

Một tilesloaded()phương thức tồn tại được cho là hoàn thành chính xác nhiệm vụ này nhưng nó không hoạt động .


2
Sự kiện "xếp gạch" dường như có tác dụng với tôi. Nó kích hoạt khi trang tải và khi tôi di chuyển bản đồ xung quanh. Trên bản đồ của bạn, nó chỉ không nhất quán, hoặc nó không bao giờ hoạt động?
Chris B

Không, nhất quyết không. "gạch được tải" như đã nói sẽ được bắn mỗi lần tải mới, điều đó có nghĩa là nó sẽ không chỉ bắn vào lần tải đầu tiên mà còn mỗi khi bạn kéo bản đồ đến vị trí mà gạch của bạn chưa được tải.
Aivus

Phụ thuộc nếu bạn sử dụng addListener () hoặc addListenerOnce (). Bạn nói đúng về addListener () - đó là lý do tại sao tôi sử dụnggoogle.maps.event.addListenerOnce(map, 'tilesloaded', function() {
vchrizz

Câu trả lời:


608

Điều này đã làm phiền tôi trong một thời gian với GMaps v3.

Tôi tìm thấy một cách để làm điều đó như thế này:

google.maps.event.addListenerOnce(map, 'idle', function(){
    // do something only the first time the map is loaded
});

Sự kiện "nhàn rỗi" được kích hoạt khi bản đồ chuyển sang trạng thái không hoạt động - mọi thứ được tải (hoặc không tải được). Tôi thấy nó đáng tin cậy hơn sau đó xếp gạch / bound_changed và sử dụng addListenerOncephương thức mã trong bao đóng được thực thi lần đầu tiên "không hoạt động" được kích hoạt và sau đó sự kiện được tách ra.

Xem thêm phần sự kiện trong Tài liệu tham khảo Google Maps.


15
Nó được bắn khi bản đồ chuyển sang trạng thái không hoạt động (sẽ không tải thêm gì nữa). Đôi khi, có thể có một số ô không tải do kết nối kém, vì vậy ngay cả khi có những phần bị thiếu như vậy, nó sẽ kích hoạt sự kiện nhàn rỗi cuối cùng. Nếu bạn cần đảm bảo rằng bản đồ đã hoàn tất, không thiếu các ô, v.v., bạn nên tìm kiếm một số cách khác (ví dụ: sự kiện "xếp gạch").
ddinchev

15
nó không hoạt động với tôi .. kích hoạt trước khi mọi thứ xuất hiện trên bản đồ của tôi
zsitro

16
-1: Kích hoạt sớm hơn gạch được tải / hiển thị.
zbr 27/12/13

11
-1: đối với tôi trong chrome và firefox, nó liên tục kích hoạt ngay khi tập lệnh được tải nhưng trước khi bất kỳ ô nào hiển thị. Có thể nó không rõ ràng trên một kết nối nhanh, nhưng tôi may mắn có một kết nối rất chậm. 'gạch tải' dường như làm việc mặc dù.
Xananax

1
Cảm ơn giải pháp đó - tôi nghĩ đây chính xác là những gì tôi cần. Điều tôi chỉ đơn giản là không thể quấn đầu, đó là lý do tại sao google không đặt một cái móc đơn giản? : -O
hasse

55

Tôi đang tạo các ứng dụng di động html5 và tôi nhận thấy rằng idle, bounds_changedtilesloadedcác sự kiện sẽ kích hoạt khi đối tượng bản đồ được tạo và hiển thị (ngay cả khi nó không hiển thị).

Để làm cho bản đồ của tôi chạy mã khi nó được hiển thị lần đầu tiên tôi đã làm như sau:

google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
    //this part runs when the mapobject is created and rendered
    google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
        //this part runs when the mapobject shown for the first time
    });
});

4
Chức năng xếp gạch đầu tiên hoạt động tốt đối với tôi, nhưng chức năng xếp gạch thứ hai không bao giờ chạy đối với tôi.
Ngỗng

Tôi đang nhận được Uncaught ReferenceError: map is not defined. Tôi đã thử chạy tập lệnh với độ trễ và ở phần cuối của tập lệnh khác nhưng dường như không có gì hoạt động.
Sam Willis

1
nếu bạn đang xác định trình xử lý sự kiện bên trong trình xử lý sự kiện, bạn sẽ có khoảng thời gian tồi tệ. Tôi thực sự khuyên bạn không nên làm điều này, đây là một sự thay thế ít hack hơn để đạt được điều tương tự: gist.github.com/cmawhorter/a1b0b6a6b73678b97920f748ebca244b
Cory Mawhorter

15

Nếu bạn đang sử dụng API Maps v3, điều này đã thay đổi.

Trong phiên bản 3, về cơ bản, bạn muốn thiết lập trình lắng nghe cho bounds_changedsự kiện, điều này sẽ kích hoạt khi tải bản đồ. Khi điều đó đã được kích hoạt, hãy xóa người nghe vì bạn không muốn được thông báo mỗi khi giới hạn khung nhìn thay đổi.

Điều này có thể thay đổi trong tương lai khi API V3 đang phát triển :-)


2
Tôi không tìm thấy điều này làm việc cho tôi đáng tin cậy như tìm kiếm tilesloadedsự kiện.
TMC


9

Nếu bạn đang sử dụng các thành phần web , thì chúng có ví dụ này:

map.addEventListener('google-map-ready', function(e) {
   alert('Map loaded!');
});

3
Nhận xét khủng khiếp, nó sai ở rất nhiều cấp độ không biết bắt đầu từ đâu.
đêm

1
Tại sao bạn nói "Nhận xét khủng khiếp, nó sai ở nhiều cấp độ mà tôi không biết bắt đầu từ đâu"?
Phillip Senn

3
Nhưng tại sao cung cấp một giải pháp bằng cách sử dụng một khung khác với chỉ bản đồ google?
đêm

Bởi vì nó có thể tốt hơn?
Phillip Senn

HAHAHAHA @nights
Juan

5

GMap2::tilesloaded() sẽ là sự kiện bạn đang tìm kiếm.

Xem GMap2.tilesloaded để tham khảo.


Tôi đã đọc rất nhiều về sự kiện gạch tải () và dường như nó cực kỳ không nhất quán khi nó phát sinh. Còn lựa chọn nào khác không?

3

Trong đó biến maplà một đối tượng của kiểu GMap2:

    GEvent.addListener(map, "tilesloaded", function() {
      console.log("Map is fully loaded");
    });

0

Trong trường hợp của tôi, Hình ảnh Ngói được tải từ url và tilesloadedsự kiện từ xa đã được kích hoạt trước khi hiển thị hình ảnh.

Tôi đã giải quyết bằng cách làm theo cách bẩn.

var tileCount = 0;
var options = {
    getTileUrl: function(coord, zoom) {
        tileCount++;
        return "http://posnic.com/tiles/?param"+coord;
    },
    tileSize: new google.maps.Size(256, 256),
    opacity: 0.5,
    isPng: true
};
var MT = new google.maps.ImageMapType(options);
map.overlayMapTypes.setAt(0, MT);
google.maps.event.addListenerOnce(map, 'tilesloaded', function(){
    var checkExist = setInterval(function() {
        if ($('#map_canvas > div > div > div:nth-child(1) > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div > div').length === tileCount) {
            callyourmethod();
            clearInterval(checkExist);
        }
    }, 100); // check every 100ms
});

-4

Bạn có thể kiểm tra GMap2.isLoaded()phương thức mỗi nmili giây để xem bản đồ và tất cả các ô của nó đã được tải chưa ( window.setTimeout()hoặc window.setInterval()là bạn bè của bạn).

Mặc dù điều này sẽ không cung cấp cho bạn sự kiện chính xác về việc hoàn thành tải, nhưng nó đủ tốt để kích hoạt Javascript của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.