Vô hiệu hóa thu phóng bánh xe chuột trên Google Maps được nhúng


198

Tôi đang làm việc trên một trang web WordPress nơi các tác giả thường nhúng Google Maps bằng iFrames trong hầu hết các bài đăng.

Có cách nào để vô hiệu hóa thu phóng qua bánh xe cuộn chuột trên tất cả chúng bằng Javascript không?


32
Đặt tùy chọn bản đồ scrollwheelthành false.
Anto Jurković

hoặc vô hiệu hóa nó trực tiếp thông qua JS: map.disableScrollWheelZoom ();
Th3Alchemist

4
Tôi sợ bạn không thể. Do các hạn chế về bảo mật, không có quyền truy cập tập lệnh vào bản đồ và AFAIK không có tham số URL nào cung cấp cho bạn tùy chọn để vô hiệu hóa nó.
Dr.Molle

Có vấn đề chính xác như nhau. Muốn tắt các sự kiện cuộn chuột trên nhúng với bản đồ iframe. Chưa tìm thấy nó.
Grzegorz

7
Đây là bản đồ nhúng, không chắc tại sao mọi người đăng giải pháp sử dụng thư viện JS của bản đồ
zanderwar

Câu trả lời:


255

Tôi gặp vấn đề tương tự: khi cuộn trang sau đó con trỏ trở nên trên bản đồ, nó bắt đầu phóng to / thu nhỏ bản đồ thay vì tiếp tục cuộn trang. :

Vì vậy, tôi giải quyết này đặt một divvới một .overlaychính xác trước mỗi GMap iframechèn, xem:

<html>
  <div class="overlay" onClick="style.pointerEvents='none'"></div>
  <iframe src="https://mapsengine.google.com/map/embed?mid=some_map_id" width="640" height="480"></iframe>
</html>

Trong CSS của tôi, tôi đã tạo lớp:

.overlay {
   background:transparent; 
   position:relative; 
   width:640px;
   height:480px; /* your iframe height */
   top:480px;  /* your iframe height */
   margin-top:-480px;  /* your iframe height */
}

Các div sẽ bao phủ bản đồ, ngăn chặn các sự kiện con trỏ đến nó. Nhưng nếu bạn nhấp vào div, nó sẽ trở nên trong suốt đối với các sự kiện con trỏ, kích hoạt lại bản đồ!

Tôi hy vọng được giúp đỡ bạn :)


9
Đây là một giải pháp tuyệt vời. Trong trường hợp của tôi, tôi đã phải xác định một z-indexthứ tự để nó phủ chính xác.
RCNeil

1
IMO giải pháp tốt nhất cho vấn đề này chưa! Chúng tôi đã phải đối mặt với vấn đề này trong một thời gian dài và điều này làm cho một sửa chữa tái sử dụng tốt đẹp và khá sạch sẽ!
Diego Paladino

11
điều này nên được đánh dấu là câu trả lời, mặc dù có thể dễ dàng hơn để đặt lớp phủ là vị trí tuyệt đối cho vùng chứa chính và sau đó chỉ cần chiều rộng 100% chiều cao 100%, cũng không cần thuộc tính nền.
ngày

3
Tôi đã tạo một plugin jQuery rất đơn giản để tự động hóa việc này. Kiểm tra nó tại github.com/diazemiliano/mapScroll Offer
Emiliano Díaz

8
Có cách nào đơn giản để mở rộng giải pháp này để các sự kiện của con lăn bị bỏ qua, nhưng nhấp chuột trái không được bỏ qua? Giải pháp này rất hay, nhưng yêu cầu người dùng nhấp hai lần vào siêu liên kết "Chỉ đường" ở đầu bản đồ (một lần để thâm nhập vào div và sau đó một lần nữa để nhấp vào chính siêu liên kết đó.)
jptsetme

136

Tôi đã thử câu trả lời đầu tiên trong cuộc thảo luận này và nó không hiệu quả với tôi cho dù tôi có làm gì đi nữa nên tôi đã đưa ra giải pháp của riêng mình:

Kết hợp iframe với một lớp (.maps trong ví dụ này) và mã nhúng một cách lý tưởng: http://embedresponsively.com/ - Thay đổi CSS của iframe thành pointer-events: nonevà sau đó sử dụng hàm nhấp chuột của jQuery thành phần tử cha, bạn có thể thay đổi iframes css đếnpointer-events:auto

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'></iframe>
</div>

CSS

.maps iframe{
    pointer-events: none;
}

jQuery

$('.maps').click(function () {
    $('.maps iframe').css("pointer-events", "auto");
});

$( ".maps" ).mouseleave(function() {
  $('.maps iframe').css("pointer-events", "none"); 
});

Tôi chắc chắn rằng chỉ có một cách JavaScript để làm điều này, nếu ai đó muốn thêm vào điều này cảm thấy miễn phí.

Cách JavaScript để kích hoạt lại các sự kiện con trỏ khá đơn giản. Chỉ cần cung cấp Id cho iFrame (tức là "iframe"), sau đó áp dụng một sự kiện onclick cho div cointainer:

onclick="document.getElementById('iframe').style.pointerEvents= 'auto'"

<div class="maps" onclick="document.getElementById('iframe').style.pointerEvents= 'auto'">
   <iframe id="iframe" src="" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>

4
Cảm ơn giải pháp "không có API". +1
Tra tấn nặng nề

21
Bạn cũng có thể thêm phần này để đưa nó trở về trạng thái ban đầu khi chuột rời khỏi: $ ('. Maps'). Mouseleave (function () {$ ('. Map iframe'). Css ("con trỏ sự kiện", " không ai"); });
Luis

5
Chỉ cần một lưu ý: sử dụng pointer-events: nonesẽ ngăn chặn mọi tương tác với bản đồ (kéo, điều hướng, nhấp chuột, v.v.).
LuBre

@LuBre vâng, điều đó được hiểu, đó là lý do tại sao có chức năng nhấp chuột jQuery để thay đổi nó thành tự động.
nathanielperales

1
Câu trả lời chính xác! Bạn muốn đảm bảo rằng bạn đang bật đúng bản đồ chứ không phải tất cả trên trang$(this).find('iframe').css("pointer-events", "auto");
Tom Prats

54

Tôi mở rộng giải pháp @nathanielperales.

Bên dưới mô tả hành vi:

  • nhấp vào bản đồ để kích hoạt cuộn
  • Khi chuột rời khỏi bản đồ, tắt cuộn

Bên dưới mã javascript:

// Disable scroll zooming and bind back the click event
var onMapMouseleaveHandler = function (event) {
  var that = $(this);

  that.on('click', onMapClickHandler);
  that.off('mouseleave', onMapMouseleaveHandler);
  that.find('iframe').css("pointer-events", "none");
}

var onMapClickHandler = function (event) {
  var that = $(this);

  // Disable the click handler until the user leaves the map area
  that.off('click', onMapClickHandler);

  // Enable scrolling zoom
  that.find('iframe').css("pointer-events", "auto");

  // Handle the mouse leave event
  that.on('mouseleave', onMapMouseleaveHandler);
}

// Enable map zooming with mouse scroll when the user clicks the map
$('.maps.embed-container').on('click', onMapClickHandler);

đây là một ví dụ jsFiddle .


1
Cảm ơn bạn đã bắn tỉa này. Tôi đã sử dụng nó với phần bổ sung sau đây:$('.maps.embed-container').find('iframe').css("pointer-events", "none");
lhermann

Cảm ơn mã. Nó thực sự giải quyết một vấn đề khác mà tôi có. Tôi đã nhúng một số biểu đồ từ Bảng tính Google và cuộn bằng bánh xe chuột đã ngừng hoạt động cho toàn bộ trang vì một số lý do. Mã của bạn làm cho nó cuộn lại với bánh xe chuột. Cảm ơn một lần nữa.
Scott M. Stolz

31

Tôi đang chỉnh sửa lại mã được viết bởi #nathanielperales nó thực sự hiệu quả với tôi. Đơn giản và dễ bắt nhưng công việc của nó chỉ một lần. Vì vậy, tôi đã thêm mouseleave () trên JavaScript. Ý tưởng chuyển thể từ #Bogdan Và bây giờ nó hoàn hảo. Thử cái này. Tín dụng vào #nathanielperales và #Bogdan. Tôi chỉ kết hợp cả hai ý tưởng. Cảm ơn các bạn. Tôi hy vọng điều này cũng sẽ giúp những người khác ...

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'>  </iframe>
</div>

CSS

.maps iframe{
    pointer-events: none;
}

jQuery

$('.maps').click(function () {
    $('.maps iframe').css("pointer-events", "auto");
});

$( ".maps" ).mouseleave(function() {
  $('.maps iframe').css("pointer-events", "none"); 
});

Ứng thích ứng vượt qua

Và đây là một ví dụ jsFiddle.


1
Giải pháp sạch nhất. Đẹp! Nhưng TẤT CẢ các giải pháp đều có vấn đề: Người dùng phải nhấp vào bản đồ hai lần. Làm thế nào có thể vượt qua nhấp chuột ngay lập tức, vì vậy chỉ mất một nhấp chuột?
Loren

1
Có lẽ bạn có thể tránh nhấp chuột bằng cách chuyển sang pointer-events: autochỉ sau khi chuột đã "di chuột" trên bản đồ trong một thời gian nhất định? tức là bắt đầu hẹn giờ khi chuột vào iframe và đặt lại khi chuột rời. Nếu bộ đếm thời gian đạt đến X mili giây, hãy chuyển sang pointer-events: auto. Và bất cứ khi nào chuột rời iframe bạn chỉ cần quay lại pointer-events: none.
cái vòi vào

Tôi thích sử dụng dblclick thay vì nhấp chuột, dù sao thì giải pháp tốt.
Moxet Khan

25

Vâng, nó khá dễ dàng. Tôi phải đối mặt với một vấn đề tương tự. Chỉ cần thêm thuộc tính css "con trỏ sự kiện" vào div iframe và đặt nó thành 'none' .

Ví dụ: <iframe style = "con trỏ-sự kiện: none" src = ........>

SideNote: Khắc phục sự cố này sẽ vô hiệu hóa tất cả các sự kiện chuột khác trên bản đồ. Nó hoạt động với tôi vì chúng tôi không yêu cầu bất kỳ tương tác người dùng nào trên bản đồ.


20
Tại sao không chỉ sử dụng một hình ảnh sau đó? bạn đang tải rất nhiều tài sản bổ sung chỉ để vô hiệu hóa tất cả.
deweydb

2
Có nhưng tôi không thể nhấp vào các vật dụng
Jeffrey Nicholson Carré

1
xin lưu ý rằng điều này sẽ không hoạt động trên IE <11 - caniuse.com/#search=pulum-events
hoàn toànNotLizards

@deweydb - không phải là bất hợp pháp?
Matt Saunders

@MattSaunders không chắc chắn nếu đây là trường hợp, nhưng bây giờ là bây giờ. Bạn có thể tải hình ảnh bản đồ tĩnh trực tiếp từ Google API, có lẽ đây là những gì deweydb đã đề xuất? Chắc chắn sẽ là một cách khả thi xung quanh vấn đề.
azariah

19
var mapOptions = {
   scrollwheel: false,
   center: latlng,
   mapTypeId: google.maps.MapTypeId.ROADMAP
};

13

Sau khi thực hiện một số nghiên cứu, bạn có 2 lựa chọn. Vì api bản đồ mới với iframe nhúng dường như không hỗ trợ vô hiệu hóa con lăn chuột.

Đầu tiên sẽ là sử dụng bản đồ google cũ ( https://support.google.com/maps đá / 3045828? Hl = vi ).

Thứ hai sẽ là tạo một hàm javascript để đơn giản hóa việc nhúng bản đồ cho từng nhận xét và sử dụng các tham số (mã mẫu chỉ để vị trí điểm không hiển thị giải pháp chính xác)

function createMap(containerid, parameters) {
  var mymap = document.getElementById(containerid),
  map_options = {
    zoom: 13,
    scrollwheel: false,
    /* rest of options */
  },
  map = new google.maps.Map(mymap, map_options);

  /* 'rest of code' to take parameters into account */
}

8

Có một giải pháp tuyệt vời và dễ dàng.

Bạn cần thêm một lớp tùy chỉnh trong css của mình để đặt các sự kiện con trỏ thành ánh xạ canvas thành không:

.scrolloff{
   pointer-events: none;
}

Sau đó, với jQuery, bạn có thể thêm và xóa lớp đó dựa trên các sự kiện khác nhau, ví dụ:

    $( document ).ready(function() {

    // you want to enable the pointer events only on click;

        $('#map_canvas').addClass('scrolloff'); // set the pointer events to none on doc ready
        $('#canvas').on('click', function() {
            $('#map_canvas').removeClass('scrolloff'); // set the pointer events true on click
        });

    // you want to disable pointer events when the mouse leave the canvas area;

     $( "#map_canvas" ).mouseleave(function() {
          $('#map_canvas').addClass('scrolloff'); // set the pointer events to none when mouse leaves the map area
     });    
});

Tôi đã tạo một ví dụ trong jsfiddle , hy vọng điều đó có ích!


1
Điều này cũng hoạt động với API nhúng Google Maps - chỉ cần thay thế map_canvas bằng iframe nhúng. Lưu ý rằng sự kiện nhấp nằm ở phần tử bên ngoài , nhưng phần cuộn lại nằm ở phần tử bên trong (nó chính xác trong câu trả lời / jsfiddle, chỉ trong trường hợp bạn đang phiên mã thay vì sao chép / dán)
Jxtps

8

Tôi chỉ cần đăng ký một tài khoản trên developers.google.com và nhận mã thông báo để gọi API Bản đồ và chỉ cần vô hiệu hóa như thế này (scrollwheel: false):

    var map;
    function initMap() {
        map = new google.maps.Map(document.getElementById('container_google_maps'), {
            center: {lat: -34.397, lng: 150.644},
            zoom: 8,
            scrollwheel: false
        });
    }

Vì vậy, tốt hơn nhiều so với các bản hack jQuery!
Dániel Kis-Nagy

7

Đây là cách tiếp cận của tôi. Tôi thấy nó dễ thực hiện trên các trang web khác nhau và sử dụng nó mọi lúc

CSS và JavaScript:

<style type="text/css">
.scrolloff iframe   {
    pointer-events: none ;
}
</style>

<script type="text/javascript">
function scrollOn() {
    $('#map').removeClass('scrolloff'); // set the pointer events true on click

}

function scrollOff() {
    $('#map').addClass('scrolloff'); 

}
</script>

Trong HTML, bạn sẽ muốn bọc iframe theo div. <div id="map" class="scrolloff" onclick="scrollOn()" onmouseleave="scrollOff()" >

function scrollOn() {
    $('#map').removeClass('scrolloff'); // set the pointer events true on click
   
}

function scrollOff() {
    $('#map').addClass('scrolloff'); // set the pointer events true on click
    
}
.scrolloff iframe   {
        pointer-events: none ;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="map" class="scrolloff" onclick="scrollOn()" onmouseleave="scrollOff()" ><iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d23845.03946309692!2d-70.0451736316453!3d41.66373705082399!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89fb159980380d21%3A0x78c040f807017e30!2sChatham+Tides!5e0!3m2!1sen!2sus!4v1452964723177" width="100%" height="450" frameborder="0" style="border:0" allowfullscreen></iframe></div>

Hy vọng điều này sẽ giúp bất cứ ai tìm kiếm một giải pháp đơn giản.


5

Đây là một giải pháp đơn giản. Chỉ cần đặt pointer-events: noneCSS thành <iframe>để vô hiệu hóa cuộn chuột.

<div id="gmap-holder">
    <iframe width="100%" height="400" frameborder="0" style="border:0; pointer-events:none"
            src="https://www.google.com/maps/embed/v1/place?q=XXX&key=YYY"></iframe>
</div>

Nếu bạn muốn cuộn chuột được kích hoạt khi người dùng nhấp vào bản đồ, thì hãy sử dụng mã JS sau đây. Nó cũng sẽ vô hiệu hóa cuộn chuột một lần nữa, khi chuột di chuyển ra khỏi bản đồ.

$(function() {
    $('#gmap-holder').click(function(e) {
        $(this).find('iframe').css('pointer-events', 'all');
    }).mouseleave(function(e) {
        $(this).find('iframe').css('pointer-events', 'none');
    });
})

!!! Cũng lưu ý, các sự kiện con trỏ Imho đã vô hiệu hóa tất cả nhấp vào Sự kiện cho Iframe này.
stephanfriedrich

Các sự kiện nhấp chỉ bị vô hiệu hóa cho iframe. Nhưng nếu bạn đang sử dụng mã JS, ngay khi chuột vào ngăn chứa div.gmap, các sự kiện nhấp sẽ được kích hoạt lại.
manish_s

Điều này làm việc tuyệt vời cho tôi! Hầu hết các giải pháp không tương thích với WordPress: onclick bị loại bỏ và đôi khi độ rộng của iframe không được tôn vinh, nhưng điều này hoạt động như một nét quyến rũ. Sau khi đặt mã JS đi, tất cả những gì cần làm là tham chiếu id = "gmap-chủ". Hoàn hảo. Cảm ơn Manish.
usonianhoriz

4

Để tắt thu phóng bánh xe cuộn chuột trên Google Maps được nhúng, bạn chỉ cần đặt các sự kiện con trỏ thuộc tính css của iframe thành không:

<style>
#googlemap iframe {
    pointer-events:none;
}
</style>

Đó là tất cả .. Khá gọn gàng hả?

<div id="googlemap">
    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3648.6714814904954!2d90.40069809681577!3d23.865796688563787!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x3755c425897f1f09%3A0x2bdfa71343f07395!2sArcadia+Green+Point%2C+Rd+No.+16%2C+Dhaka+1230%2C+Bangladesh!5e0!3m2!1sen!2sin!4v1442184916780" width="400" height="300" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>

2
Nó cũng sẽ vô hiệu hóa thu phóng nhấp đúp :)
w3debugger

Đồng thời vô hiệu hóa phóng to, thu nhỏ, chỉ đường, v.v.
zanderwar

4

Đối với tôi, giải pháp tốt nhất là sử dụng đơn giản như thế này:

HTML:

<div id="google-maps">
<iframe frameborder="0" height="450" src="***embed-map***"  width="100"</iframe>
</div>

CSS:

#google-maps iframe { pointer-events:none; }

JS:

<script>
  $(function() {
    $('#google-maps').click(function(e) {
        $(this).find('iframe').css('pointer-events', 'auto');
    }).mouseleave(function(e) {
        $(this).find('iframe').css('pointer-events', 'none');
    });
  })
</script>

KẾT QUẢ

Cân nhắc:

Cách tốt nhất là thêm lớp phủ có độ trong suốt tối hơn bằng văn bản: " Nhấp để duyệt " khi bánh xe chuột bị vô hiệu hóa Nhưng khi được kích hoạt (sau khi bạn nhấp vào nó) thì độ trong suốt của văn bản sẽ biến mất và người dùng có thể duyệt bản đồ như mong đợi. Bất kỳ manh mối làm thế nào để làm điều đó?


3

Thêm phong cách pointer-events:none;này hoạt động tốt

<iframe style="pointer-events:none;" src=""></iframe>

3

Cách đơn giản nhất để làm điều đó là sử dụng phần tử giả như :beforehoặc :after.
Phương pháp này sẽ không yêu cầu bất kỳ phần tử html hoặc jquery bổ sung nào.
Nếu chúng ta có ví dụ về cấu trúc html này:

<div class="map_wraper">

    <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d405689.7826944034!2d-122.04109805!3d37.40280355!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x808fb68ad0cfc739%3A0x7eb356b66bd4b50e!2sSilicon+Valley%2C+CA!5e0!3m2!1sen!2sro!4v1438864791455" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>

</div>

Sau đó, tất cả những gì chúng ta cần làm là tạo trình bao bọc liên quan đến phần tử giả mà chúng ta sẽ tạo để ngăn cuộn

.map_wraper{
    position:relative;
}

Sau đó, chúng ta sẽ tạo phần tử giả sẽ được định vị trên bản đồ để ngăn việc cuộn:

.map_wraper:after{
    background: none;
    content: " ";
    display: inline-block;
    font-size: 0;
    height: 100%;
    left: 0;
    opacity: 0;
    position: absolute;
    top: 0;
    width: 100%;
    z-index: 9;
}

Và bạn đã hoàn thành, không jquery không có yếu tố html bổ sung! Dưới đây là một ví dụ jsfiddle hoạt động: http://jsfiddle.net/e6j4Lbe1/


Ý tưởng thông minh. Tuy nhiên, giống như một số câu trả lời khác, điều này nắm bắt tất cả mọi thứ, không chỉ các sự kiện của chuột.
likeitlikeit

Tôi rất vui vì nó đã giúp bạn ra ngoài!
Andrei

3

Đây là giải pháp đơn giản của tôi.

Đặt iframe của bạn trong div với một lớp gọi là "maps" chẳng hạn.

Đây sẽ là CSS cho iframe của bạn

.maps iframe { pointer-events: none }

Và đây là một javascript nhỏ sẽ đặt thuộc tính sự kiện con trỏ của iframe thành "tự động" khi bạn di chuột phần tử div trong ít nhất 1 giây (hoạt động tốt nhất với tôi - đặt thành bất cứ điều gì bạn thích) và xóa thời gian chờ / đặt lại thành "none" một lần nữa khi chuột rời khỏi phần tử.

var maptimer;

$(".maps").hover(function(){
    maptimer = setTimeout(function(){
        $(".maps").find("iframe").css("pointer-events", "auto");
    },1000);
},function(){
    clearTimeout(maptimer);
    $(".maps").find("iframe").css("pointer-events", "none");
});

Chúc mừng.


3

Tôi đã tạo một plugin jQuery rất đơn giản để giải quyết vấn đề. Kiểm tra nó tại https://diazemiliano.github.io/googlemaps-scrollprevent

(function() {
  $(function() {
    $("#btn-start").click(function() {
      $("iframe[src*='google.com/maps']").scrollprevent({
        printLog: true
      }).start();
      return $("#btn-stop").click(function() {
        return $("iframe[src*='google.com/maps']").scrollprevent().stop();
      });
    });
    return $("#btn-start").trigger("click");
  });
}).call(this);
Edit in JSFiddle Result JavaScript HTML CSS .embed-container {
  position: relative !important;
  padding-bottom: 56.25% !important;
  height: 0 !important;
  overflow: hidden !important;
  max-width: 100% !important;
}
.embed-container iframe {
  position: absolute !important;
  top: 0 !important;
  left: 0 !important;
  width: 100% !important;
  height: 100% !important;
}
.mapscroll-wrap {
  position: static !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://cdn.rawgit.com/diazemiliano/googlemaps-scrollprevent/v.0.6.5/dist/googlemaps-scrollprevent.min.js"></script>
<div class="embed-container">
  <iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d12087.746318586604!2d-71.64614110000001!3d-40.76341959999999!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x9610bf42e48faa93%3A0x205ebc786470b636!2sVilla+la+Angostura%2C+Neuqu%C3%A9n!5e0!3m2!1ses-419!2sar!4v1425058155802"
  width="400" height="300" frameborder="0" style="border:0"></iframe>
</div>
<p><a id="btn-start" href="#">"Start Scroll Prevent"</a>  <a id="btn-stop" href="#">"Stop Scroll Prevent"</a>
</p>


2

Sử dụng câu trả lời từ @nathanielperales tôi đã thêm chức năng di chuột cho tôi, nó hoạt động tốt hơn khi người dùng mất tập trung vào bản đồ để dừng cuộn lại :)

$(function(){
    $('.mapa').hover(function(){
        stopScroll();},
                     function () {
    $('.mapa iframe').css("pointer-events", "none");
    });
});

function stopScroll(){
$('.mapa').click(function () {
    $('.mapa iframe').css("pointer-events", "auto");
});
}

Có điều là chúng tôi mất chức năng điều hướng, đối với tôi là rất quan trọng trong các thiết bị di động. Tôi đã tạo một plugin jQuery rất đơn giản mà bạn có thể sửa đổi nếu muốn. Kiểm tra nó tại github.com/diazemiliano/mapScroll Offer
Emiliano Díaz

2

Biến thể về một chủ đề: một giải pháp đơn giản với jQuery, không cần chỉnh sửa CSS.

// make iframe active on click, disable on mouseleave
$('iframe.google_map').each( function(i, iframe) {
    $(iframe).parent().hover( // make inactive on hover
        function() { $(iframe).css('pointer-events', 'none');
    }).click( // activate on click
        function() { $(iframe).css('pointer-events', 'auto');
    }).trigger('mouseover'); // make it inactive by default as well
});

Trình nghe Hover được gắn vào phần tử cha, vì vậy nếu cha mẹ hiện tại lớn hơn, bạn có thể chỉ cần bọc iframe bằng div trước dòng thứ 3.

Hy vọng nó sẽ hữu ích cho ai đó.


1

Tôi đã tự mình vấp phải vấn đề này và đã sử dụng một số bản hòa âm của hai câu trả lời rất hữu ích cho câu hỏi này: câu trả lời của czerasz và câu trả lời của massa .

Cả hai đều có rất nhiều sự thật, nhưng ở đâu đó trong các thử nghiệm của tôi, tôi phát hiện ra rằng một người không làm việc cho thiết bị di động và có hỗ trợ IE kém (chỉ hoạt động trên IE11). Đây là giải pháp của nathanielperales, sau đó được mở rộng bởi czerasz, dựa trên css sự kiện con trỏ và không hoạt động trên thiết bị di động (không có con trỏ trong thiết bị di động) và nó không hoạt động trên bất kỳ phiên bản IE nào không phải là v11 . Thông thường tôi sẽ không quan tâm, nhưng có rất nhiều người dùng ở ngoài đó và chúng tôi muốn có chức năng phù hợp, vì vậy tôi đã sử dụng giải pháp lớp phủ, sử dụng trình bao bọc để mã hóa dễ dàng hơn.

Vì vậy, đánh dấu của tôi trông như thế này:

<div class="map embed-container">
  <div id="map-notice" style="display: block;"> {Tell your users what to do!} </div>
  <div class="map-overlay" style="display: block;"></div>
  <iframe style="width:100%" src="https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d3785.684302567802!2d-66.15578327375803!3d18.40721382009222!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x8c036a35d02b013f%3A0x5962cad95b9ec7f8!2sPlaza+Del+Sol!5e0!3m2!1sen!2spr!4v1415284687548" width="633" height="461" frameborder="0"></iframe>
</div>

Sau đó, các phong cách là như thế này:

.map.embed-container {
  position:relative;
}

.map.embed-container #map-notice{
  position:absolute;
  right:0;
  top:0;
  background-color:rgb(100,100,100);/*for old IE browsers with no support for rgba()*/
  background-color: rgba(0,0,0,.50);
  color: #ccc;
  padding: 8px;
}
.map.embed-container .map-overlay{
  height:100%;
  width:100%;
  position:absolute;
  z-index:9999;
  background-color:rgba(0,0,0,0.10);/*should be transparent but this will help you see where the overlay is going in relation with the markup*/
}

Cuối cùng là kịch bản:

//using jquery...
var onMapMouseleaveHandler = function (event) {
  $('#map-notice').fadeIn(500);
  var elemento = $$(this);
  elemento.on('click', onMapClickHandler);
  elemento.off('mouseleave', onMapMouseleaveHandler);
  $('.map-overlay').fadeIn(500);
}

var onMapClickHandler = function (event) {
  $('#map-notice').fadeOut(500);
  var elemento = $$(this);
  elemento.off('click', onMapClickHandler);
  $('.map-overlay').fadeOut(500);
  elemento.on('mouseleave', onMapMouseleaveHandler);
}
$('.map.embed-container').on('click', onMapClickHandler);

Tôi cũng đã thêm giải pháp đã thử nghiệm của mình vào một ý chính GitHub , nếu bạn muốn lấy đồ từ đó ...


1

Đây là một giải pháp với CSS và Javascript (tức là Jquery nhưng cũng hoạt động với Javascript thuần túy). Đồng thời bản đồ là đáp ứng. Tránh bản đồ để phóng to khi cuộn, nhưng bản đồ có thể được kích hoạt bằng cách nhấp vào nó.

Javascript / JQuery Javascript

<div id="map" onclick="$('#googlemap').css('pointerEvents','auto'); return true;"> 
    <iframe id="googlemap" src="http://your-embed-url" height="350"></iframe>
</div>

CSS

#map {
    position: relative; 
    padding-bottom: 36%; /* 16:9 ratio for responsive */ 
    height: 0; 
    overflow: hidden; 
    background:transparent; /* does the trick */
    z-index:98; /* does the trick */
}
#map iframe { 
    pointer-events:none; /* does the trick */
    position: absolute; 
    top: 0; 
    left: 0; 
    width: 100% !important; 
    height: 100% !important; 
    z-index:97; /* does the trick */
} 

Chúc vui vẻ !


1

Trong Google Maps v3, giờ đây bạn có thể vô hiệu hóa cuộn để thu phóng, điều này dẫn đến trải nghiệm người dùng tốt hơn nhiều. Các chức năng bản đồ khác sẽ vẫn hoạt động và bạn không cần thêm div. Tôi cũng nghĩ rằng nên có một số phản hồi cho người dùng để họ có thể thấy khi cuộn được bật, vì vậy tôi đã thêm một đường viền bản đồ.

// map is the google maps object, '#map' is the jquery selector
preventAccidentalZoom(map, '#map'); 

// Disables and enables scroll to zoom as appropriate. Also
// gives the user a UI cue as to when scrolling is enabled.
function preventAccidentalZoom(map, mapSelector){
  var mapElement = $(mapSelector);

  // Disable the scroll wheel by default
  map.setOptions({ scrollwheel: false })

  // Enable scroll to zoom when there is a mouse down on the map.
  // This allows for a click and drag to also enable the map
  mapElement.on('mousedown', function () {
    map.setOptions({ scrollwheel: true });
    mapElement.css('border', '1px solid blue')
  });

  // Disable scroll to zoom when the mouse leaves the map.
  mapElement.mouseleave(function () {
    map.setOptions({ scrollwheel: false })
    mapElement.css('border', 'none')
  });
};

1

Điều này sẽ cung cấp cho bạn Bản đồ Google phản hồi sẽ dừng cuộn trên iframe, nhưng khi nhấp vào sẽ cho phép bạn phóng to.

Sao chép và dán mã này vào html của bạn nhưng thay thế liên kết iframe bằng liên kết của riêng bạn. Đây là một bài viết về nó với một ví dụ: Vô hiệu hóa thu phóng bánh xe cuộn chuột trên iframe Google Map được nhúng

<style>
    .overlay {
    background:transparent;
    position:relative;
    width:100%; /* your iframe width */
    height:480px; /* your iframe height */
    top:480px; /* your iframe height */
    margin-top:-480px; /* your iframe height */
    }
</style>
<div class="overlay" onClick="style.pointerEvents='none'"></div>
<iframe src="https://mapsengine.google.com/map/embed?mid=some_map_id" width="100%" height="480"></iframe>

0

Đây sẽ là cách tiếp cận của tôi với điều này.

Đưa tệp này vào tệp main.js hoặc tệp tương tự của tôi:

// Create an array of styles.
var styles = [
                {
                    stylers: [
                        { saturation: -300 }

                    ]
                },{
                    featureType: 'road',
                    elementType: 'geometry',
                    stylers: [
                        { hue: "#16a085" },
                        { visibility: 'simplified' }
                    ]
                },{
                    featureType: 'road',
                    elementType: 'labels',
                    stylers: [
                        { visibility: 'off' }
                    ]
                }
              ],

                // Lagitute and longitude for your location goes here
               lat = -7.79722,
               lng = 110.36880,

              // Create a new StyledMapType object, passing it the array of styles,
              // as well as the name to be displayed on the map type control.
              customMap = new google.maps.StyledMapType(styles,
                  {name: 'Styled Map'}),

            // Create a map object, and include the MapTypeId to add
            // to the map type control.
              mapOptions = {
                  zoom: 12,
                scrollwheel: false,
                  center: new google.maps.LatLng( lat, lng ),
                  mapTypeControlOptions: {
                      mapTypeIds: [google.maps.MapTypeId.ROADMAP],

                  }
              },
              map = new google.maps.Map(document.getElementById('map'), mapOptions),
              myLatlng = new google.maps.LatLng( lat, lng ),

              marker = new google.maps.Marker({
                position: myLatlng,
                map: map,
                icon: "images/marker.png"
              });

              //Associate the styled map with the MapTypeId and set it to display.
              map.mapTypes.set('map_style', customMap);
              map.setMapTypeId('map_style');

Sau đó, chỉ cần chèn một div trống nơi bạn muốn bản đồ xuất hiện trên trang của mình.

<div id="map"></div>

Rõ ràng bạn cũng sẽ cần gọi API Google Maps. Tôi chỉ đơn giản là tạo một tệp có tên mapi.js và ném nó vào thư mục / js của tôi. Tập tin này cần được gọi trước javascript trên.

`window.google = window.google || {};
google.maps = google.maps || {};
(function() {

  function getScript(src) {
    document.write('<' + 'script src="' + src + '"' +
                   ' type="text/javascript"><' + '/script>');
  }

  var modules = google.maps.modules = {};
  google.maps.__gjsload__ = function(name, text) {
    modules[name] = text;
  };

  google.maps.Load = function(apiLoad) {
    delete google.maps.Load;
    apiLoad([0.009999999776482582,[[["http://mt0.googleapis.com/vt?lyrs=m@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=m@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"m@228000000"],[["http://khm0.googleapis.com/kh?v=135\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=135\u0026hl=en-US\u0026"],null,null,null,1,"135"],[["http://mt0.googleapis.com/vt?lyrs=h@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=h@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"h@228000000"],[["http://mt0.googleapis.com/vt?lyrs=t@131,r@228000000\u0026src=api\u0026hl=en-US\u0026","http://mt1.googleapis.com/vt?lyrs=t@131,r@228000000\u0026src=api\u0026hl=en-US\u0026"],null,null,null,null,"t@131,r@228000000"],null,null,[["http://cbk0.googleapis.com/cbk?","http://cbk1.googleapis.com/cbk?"]],[["http://khm0.googleapis.com/kh?v=80\u0026hl=en-US\u0026","http://khm1.googleapis.com/kh?v=80\u0026hl=en-US\u0026"],null,null,null,null,"80"],[["http://mt0.googleapis.com/mapslt?hl=en-US\u0026","http://mt1.googleapis.com/mapslt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/ft?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/ft?hl=en-US\u0026"]],[["http://mt0.googleapis.com/vt?hl=en-US\u0026","http://mt1.googleapis.com/vt?hl=en-US\u0026"]],[["http://mt0.googleapis.com/mapslt/loom?hl=en-US\u0026","http://mt1.googleapis.com/mapslt/loom?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt?hl=en-US\u0026","https://mts1.googleapis.com/mapslt?hl=en-US\u0026"]],[["https://mts0.googleapis.com/mapslt/ft?hl=en-US\u0026","https://mts1.googleapis.com/mapslt/ft?hl=en-US\u0026"]]],["en-US","US",null,0,null,null,"http://maps.gstatic.com/mapfiles/","http://csi.gstatic.com","https://maps.googleapis.com","http://maps.googleapis.com"],["http://maps.gstatic.com/intl/en_us/mapfiles/api-3/14/0","3.14.0"],[2635921922],1,null,null,null,null,0,"",null,null,0,"http://khm.googleapis.com/mz?v=135\u0026",null,"https://earthbuilder.googleapis.com","https://earthbuilder.googleapis.com",null,"http://mt.googleapis.com/vt/icon",[["http://mt0.googleapis.com/vt","http://mt1.googleapis.com/vt"],["https://mts0.googleapis.com/vt","https://mts1.googleapis.com/vt"],[null,[[0,"m",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],0],[null,[[0,"m",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[47],[37,[["smartmaps"]]]]],3],[null,[[0,"h",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],0],[null,[[0,"h",228000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[50],[37,[["smartmaps"]]]]],3],[null,[[4,"t",131],[0,"r",131000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],0],[null,[[4,"t",131],[0,"r",131000000]],[null,"en-US","US",null,18,null,null,null,null,null,null,[[5],[37,[["smartmaps"]]]]],3],[null,null,[null,"en-US","US",null,18],0],[null,null,[null,"en-US","US",null,18],3],[null,null,[null,"en-US","US",null,18],6],[null,null,[null,"en-US","US",null,18],0]]], loadScriptTime);
  };
  var loadScriptTime = (new Date).getTime();
  getScript("http://maps.gstatic.com/intl/en_us/mapfiles/api-3/14/0/main.js");
})();`

Khi bạn gọi tệp mapi.js, hãy chắc chắn rằng bạn chuyển thuộc tính sai của cảm biến.

I E: <script type="text/javascript" src="js/mapi.js?sensor=false"></script>

Phiên bản mới 3 của API yêu cầu bao gồm cảm biến vì một số lý do. Đảm bảo bạn bao gồm tệp mapi.js trước tệp main.js của bạn.


0

Đối với google maps v2 - GMap2:

ar map = new GMap2(document.getElementById("google_map"));
map.disableScrollWheelZoom();

0

nếu bạn có iframe sử dụng API nhúng của Google map như thế này:

 <iframe width="320" height="400" frameborder="0" src="https://www.google.com/maps/embed/v1/place?q=Cagli ... "></iframe>

bạn có thể thêm kiểu css này: con trỏ-sự kiện: none; ES.

<iframe width="320" height="400" frameborder="0" style="pointer-event:none;" src="https://www.google.com/maps/embed/v1/place?q=Cagli ... "></iframe>

0

Đây là câu trả lời của tôi về câu trả lời @nathanielperales được mở rộng bởi @chams, bây giờ lại được mở rộng bởi tôi.

HTML

<div class='embed-container maps'>
    <iframe width='600' height='450' frameborder='0' src='http://foo.com'></iframe>
</div> 

jQuery

// we're doing so much with jQuery already, might as well set the initial state
$('.maps iframe').css("pointer-events", "none");

// as a safety, allow pointer events on click
$('.maps').click(function() {
  $(this).find('iframe').css("pointer-events", "auto");
});


$('.maps').mouseleave(function() {
  // set the default again on mouse out - disallow pointer events
  $(this).find('iframe').css("pointer-events", "none");
  // unset the comparison data so it doesn't effect things when you enter again
  $(this).removeData('oldmousepos');
});

$('.maps').bind('mousemove', function(e){
  $this = $(this);
  // check the current mouse X position
  $this.data('mousepos', e.pageX);
  // set the comparison data if it's null or undefined
  if ($this.data('oldmousepos') == null) {
    $this.data('oldmousepos', $this.data('mousepos'));
  }
  setTimeout(function(){
    // some left/right movement - allow pointer events
    if ($this.data('oldmousepos') != $this.data('mousepos')) {
      $this.find('iframe').css("pointer-events", "auto");
    }
    // set the compairison variable
    $this.data('oldmousepos', $this.data('mousepos'));
  }, 300);
  console.log($this.data('oldmousepos')+ ' ' + $this.data('mousepos'));
});

0

Đơn giản nhất :

<div id="myIframe" style="width:640px; height:480px;">
   <div style="background:transparent; position:absolute; z-index:1; width:100%; height:100%; cursor:pointer;" onClick="style.pointerEvents='none'"></div>
   <iframe src="https://www.google.com/maps/d/embed?mid=XXXXXXXXXXXXXX" style="width:640px; height:480px;"></iframe>
</div>

0

Thêm phần này vào tập lệnh của bạn:

function initMap() {
    var uluru = {lat: -25.363, lng: 131.044};
    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 12,
        center: uluru,
        scrollwheel: false,
        disableDefaultUI: true,
        disableDoubleClickZoom: true
    });
    var marker = new google.maps.Marker({
        position: uluru,
        map: map
});
}

2
Câu hỏi liên quan đến API nhúng (sử dụng iframe), không phải API JavaScript.
GreatBlakes

0

Đây là giải pháp của tôi cho vấn đề này, tôi đang xây dựng một trang WP, vì vậy có một ít mã php ở đây. Nhưng chìa khóa là scrollwheel: false,trong đối tượng bản đồ.

function initMap() {
        var uluru = {lat: <?php echo $latitude; ?>, lng: <?php echo $Longitude; ?>};
        var map = new google.maps.Map(document.getElementById('map'), {
            zoom: 18,
            scrollwheel: false,
            center: uluru
        });
        var marker = new google.maps.Marker({
            position: uluru,
            map: map
        });
    }

Hy vọng điều này sẽ giúp. Chúc mừng

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.