2016-03-27 16 views
5

Tôi đang sử dụng các tab để hiển thị nội dung rõ ràng, nhưng một trong số chúng ngừng tải xuống tốt vì nó nằm trong tab chuyển đổi dữ liệu. Nó là một bản đồ Leaflet. Đây là mã: MãTab Chuyển đổi dữ liệu không tải xuống bản đồ Leaflet


Navbar:

<ul class="nav nav-tabs"> 
    <li class="active"><a data-toggle="tab" href="#home">Données principales</a></li> 
    <li><a data-toggle="tab" href="#carte">Carte</a></li> 
</ul> 
<div class="tab-content"> 
    <div id="home" class="tab-pane fade in active">Lorem ipsum</div> 
    <div id="carte" class="tab-pane fade"> **//see script below\\** </div> 
</div> 

Script:

<div id="carteBenef"></div> 
     <script type="text/javascript"> 
      $(document).ready(function() { 
       var map = new L.Map('carteBenef'); 
       var cloudmadeUrl = 'http://{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png', 
        subDomains = ['otile1', 'otile2', 'otile3', 'otile4'], 
        cloudmadeAttrib = 'Data, imagery and map information provided by <a href="http://open.mapquest.co.uk" target="_blank">MapQuest</a>, <a href="http://www.openstreetmap.org/" target="_blank">OpenStreetMap</a> and contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/" target="_blank">CC-BY-SA</a>'; 
       var cloudmade = new L.TileLayer(cloudmadeUrl, {maxZoom: 18, attribution: cloudmadeAttrib, subdomains: subDomains}); 
       var iades = new L.LatLng(<?php echo $beneficiaire->latitude . ', ' . $beneficiaire->longitude; ?>) 
       map.addLayer(cloudmade).setView(iades, 15); 
       var benefLocation = new L.LatLng(<?php echo $beneficiaire->latitude . ', ' . $beneficiaire->longitude; ?>); 
       var benef = new L.Marker(benefLocation); 
       map.addLayer(benef); 
       benef.bindPopup("<?php echo htmlspecialchars($beneficiaire->nom) . ' ' . htmlspecialchars($beneficiaire->prenom); ?>").openPopup(); 
      }); 
     </script> 

bản đồ được xuất hiện khá lâu trước khi tôi đặt nó trong tab, không một người nào đó có một ý tưởng tại sao nó không hoạt động ngay bây giờ? Cảm ơn bạn =)

Trả lời

12

Chào mừng bạn đến với SO!

Nếu bạn Leaflet mapđột nhiên hoạt động chính xác sau khi bạn thay đổi kích thước cửa sổ trình duyệt của bạn, sau đó bạn trải nghiệm cổ điển "kích thước container đồ không hợp lệ vào bản đồ khởi": để làm việc một cách chính xác, Leaflet đọc kích thước thùng chứa đồ khi bạn khởi tạo bản đồ (L.map("mapContainerId")).

Nếu ứng dụng của bạn ẩn vùng chứa đó (thường thông qua CSS display: none;, hoặc một số tab khung/phương thức/bất kỳ ...) hoặc sau này thay đổi kích thước của nó, Leaflet sẽ không biết kích thước mới. Do đó nó sẽ không hiển thị chính xác. Thông thường, nó chỉ tải xuống các phần của vùng chứa mà nó cho là được hiển thị. Đây có thể là một ô duy nhất ở góc trên cùng bên trái trong trường hợp vùng chứa được ẩn hoàn toàn vào thời gian khởi tạo bản đồ.

Lỗi này thường phát sinh khi nhúng vùng chứa bản đồ vào bảng "tab" hoặc "phương thức", có thể sử dụng các khung phổ biến (Bootstrap, Góc, Ionic, v.v.).

Tờ rơi lắng nghe sự kiện thay đổi kích thước cửa sổ trình duyệt và đọc lại kích thước vùng chứa khi điều đó xảy ra. Điều này giải thích vì sao bản đồ đột nhiên hoạt động khi thay đổi kích thước cửa sổ. Bạn cũng có thể kích hoạt bản cập nhật này theo cách thủ công bằng cách gọi số map.invalidateSize() khi bảng điều khiển tab được hiển thị (ví dụ: thêm người nghe trên nhấp vào nút tab), ít nhất là lần đầu tiên vùng chứa được hiển thị với thứ nguyên chính xác của nó.

Để triển khai trình nghe nhấp nút tab, hãy thực hiện tìm kiếm mới trên SO về chủ đề đó: bạn nên có nhiều tài nguyên sẵn có cho vấn đề đó, đối với hầu hết các khung phổ biến.

+0

Đó chính là vấn đề tôi gặp phải, cảm ơn bạn! – Ned

+0

@Ned, vui lòng đính kèm mã sửa chữa, với 'map.invalidateSize()' cho câu hỏi của bạn – HAYMbl4

1

Đầu tiên, cảm ơn bạn @ghybs vì lời giải thích tốt của bạn về lý do bản đồ Leaflet không được hiển thị đúng trong những trường hợp này.

Đối với những người cố gắng không thành công câu trả lời của @ ghybs, bạn nên cố gắng để thay đổi kích thước trình duyệt của bạn thay vì gọi một phương thức của đối tượng bản đồ:

window.dispatchEvent(new Event('resize')); 

mà sửa chữa làm việc cho tôi, và nó sẽ làm việc trong mọi các trường hợp.

+0

Làm việc cho tôi, cảm ơn bạn! – Flo

+0

Bạn được chào đón! –

Các vấn đề liên quan