ปิดใช้งานการซูมล้อเลื่อนของเมาส์บน Google Maps แบบฝัง


198

ฉันกำลังทำงานกับไซต์ WordPress ที่ผู้เขียนมักฝัง Google แผนที่โดยใช้ iFrames ในโพสต์ส่วนใหญ่

มีวิธีการปิดใช้งานการซูมผ่านล้อเลื่อนของเมาส์โดยใช้ Javascript หรือไม่?


32
ตั้งค่าตัวเลือกแผนที่จะscrollwheel false
Anto Jurković

หรือปิดการใช้งานโดยตรงผ่าน JS: map.disableScrollWheelZoom ();
เล่นแร่แปรธาตุ

4
ฉันเกรงว่าคุณทำไม่ได้ เนื่องจากข้อ จำกัด ด้านความปลอดภัยจึงไม่มีการเข้าถึงสคริปต์เพื่อเข้าถึงแผนที่และ AFAIK ไม่มีพารามิเตอร์ URL ที่ให้ตัวเลือกในการปิดการใช้งาน
Dr.Molle

มีปัญหาเดียวกัน ต้องการปิดการใช้งานเหตุการณ์การเลื่อนเมาส์เมื่อฝังด้วยแผนที่ iframe ยังไม่พบเลย
Grzegorz

7
นี่คือแผนที่แบบฝังไม่แน่ใจว่าทำไมคนถึงโพสต์วิธีแก้ปัญหาด้วยการใช้
ไลบรารี่

คำตอบ:


255

ฉันมีปัญหาเดียวกัน: เมื่อเลื่อนหน้าจากนั้นตัวชี้จะปรากฏบนแผนที่มันเริ่มซูมเข้า / ออกแผนที่แทนที่จะเลื่อนหน้าต่อไป :(

ดังนั้นฉันจึงแก้ไขการใส่divด้วย.overlayก่อนการiframeแทรกgmap แต่ละรายการดู:

<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>

ใน CSS ของฉันฉันสร้างชั้นเรียน:

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

div จะครอบคลุมแผนที่ป้องกันไม่ให้เหตุการณ์ที่เกิดขึ้นกับตัวชี้ แต่ถ้าคุณคลิกที่ div มันจะโปร่งใสต่อเหตุการณ์ของตัวชี้การเปิดใช้งานแผนที่อีกครั้ง!

ฉันหวังว่าจะช่วยคุณ :)


9
นี่เป็นทางออกที่ดี ในกรณีของฉันฉันต้องระบุ a z-indexเพื่อให้ซ้อนทับอย่างถูกต้องแม้ว่า
RCNeil

1
IMO ทางออกที่ดีที่สุดสำหรับปัญหานี้ยัง! เราเผชิญกับปัญหานี้มาเป็นเวลานานและสิ่งนี้ทำให้การแก้ไขที่สามารถนำกลับมาใช้ใหม่ได้ดีและสะอาด!
Diego Paladino

11
สิ่งนี้ควรถูกทำเครื่องหมายเป็นคำตอบแม้ว่าอาจจะง่ายกว่าในการตั้งค่าการวางซ้อนเป็นตำแหน่งอย่างแน่นอนกับคอนเทนเนอร์หลักแล้วเพียงแค่ความกว้าง 100% สูง 100% แต่ก็ไม่จำเป็นต้องมีคุณสมบัติพื้นหลัง
ค่าบริการ

3
ฉันได้สร้างปลั๊กอิน jQuery ง่าย ๆ เพื่อทำสิ่งนี้โดยอัตโนมัติ ตรวจสอบได้ที่github.com/diazemiliano/mapScrollOff
Emiliano Díaz

8
มีวิธีที่ตรงไปตรงมาในการขยายโซลูชันนี้เพื่อไม่ให้เหตุการณ์ล้อเลื่อนถูกละเว้น แต่การคลิกซ้ายไม่ได้ถูกละเว้น? วิธีนี้เป็นสิ่งที่ดี แต่ผู้ใช้ต้องคลิกสองครั้งที่ไฮเปอร์ลิงก์ "เส้นทาง" ที่ด้านบนของแผนที่ (หนึ่งครั้งเพื่อเจาะ div แล้วคลิกอีกครั้งเพื่อไฮเปอร์ลิงก์เอง)
jptsetme

136

ฉันลองคำตอบแรกในการสนทนานี้และมันก็ไม่ได้ผลสำหรับฉันไม่ว่าฉันจะทำอะไรฉันก็เลยคิดวิธีแก้ปัญหาของตัวเอง:

ล้อม iframe ด้วยคลาส (.maps ในตัวอย่างนี้) และโค้ดที่ดีเลิศ embedresponsively: http://embedresponsively.com/ - เปลี่ยน CSS ของ iframe เป็นpointer-events: noneแล้วใช้ฟังก์ชั่นการคลิก jQuery ขององค์ประกอบหลักคุณสามารถเปลี่ยน iframes css ถึงpointer-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"); 
});

ฉันแน่ใจว่ามีเพียงวิธี JavaScript ในการทำเช่นนี้หากมีคนต้องการเพิ่มความรู้สึกแบบนี้ฟรี

วิธี JavaScript เพื่อเปิดใช้งานตัวชี้เหตุการณ์นั้นค่อนข้างง่าย เพียงแค่ให้รหัสกับ iFrame (เช่น "iframe") จากนั้นใช้เหตุการณ์ onclick กับ cointainer div:

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
ขอบคุณสำหรับโซลูชัน "ไม่มี API" +1
ทรมานอย่างรุนแรง

21
นอกจากนี้คุณยังสามารถเพิ่มสิ่งนี้เพื่อนำมันกลับสู่สถานะเดิมเมื่อเมาส์ออก: $ ('. maps'). mouseleave (ฟังก์ชั่น () {$ ('. แผนที่ iframe'). css ("ตัวชี้เหตุการณ์", " ไม่มี"); });
หลุยส์

5
เพียงทราบ: การใช้pointer-events: noneจะป้องกันการมีปฏิสัมพันธ์กับแผนที่ (ลากการนำทางการคลิก ฯลฯ )
LuBre

@LuBre ใช่เป็นที่เข้าใจแล้วนั่นเป็นเหตุผลว่าทำไมจึงมีฟังก์ชั่นการคลิก jQuery เพื่อเปลี่ยนเป็นอัตโนมัติ
nathanielperales

1
คำตอบที่ดี! คุณต้องการตรวจสอบให้แน่ใจว่าคุณเปิดใช้งานแผนที่ที่ถูกต้องไม่ใช่ทุกอย่างในหน้านี้$(this).find('iframe').css("pointer-events", "auto");
Tom Prats

54

ฉันขยายโซลูชัน @nathanielperales

ด้านล่างคำอธิบายพฤติกรรม:

  • คลิกที่แผนที่เพื่อเปิดใช้งานการเลื่อน
  • เมื่อเมาส์ออกจากแผนที่ให้ปิดการใช้งานการเลื่อน

ด้านล่างรหัสจาวาสคริปต์:

// 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);

และนี่เป็นตัวอย่างที่ jsFiddle


1
ขอบคุณสำหรับข้อความนี้ ฉันใช้มันพร้อมกับการเพิ่มดังต่อไปนี้ในท้ายที่สุด:$('.maps.embed-container').find('iframe').css("pointer-events", "none");
lhermann

ขอบคุณสำหรับรหัส จริง ๆ แล้วมันแก้ปัญหาที่แตกต่างฉันมี ฉันฝังแผนภูมิบางส่วนจาก Google Spreadsheet และการเลื่อนด้วยวงล้อเมาส์หยุดทำงานทั้งหน้าด้วยเหตุผลบางอย่าง รหัสของคุณทำให้มันเลื่อนอีกครั้งด้วยล้อเลื่อนของเมาส์ ขอบคุณอีกครั้ง.
Scott M. Stolz

31

ฉันจะแก้ไขโค้ดที่เขียนโดย #nathanielperales อีกครั้งมันทำงานได้ดีสำหรับฉัน เรียบง่ายและง่ายต่อการจับ แต่ใช้งานได้เพียงครั้งเดียว ดังนั้นฉันจึงเพิ่ม mouseleave () บน JavaScript ไอเดียดัดแปลงมาจาก #Bogdan และตอนนี้มันสมบูรณ์แบบ ลองสิ่งนี้ เครดิตไปที่ #nathanielperales และ #Bogdan ฉันแค่รวมความคิดทั้งสองเข้าด้วยกัน ขอบคุณทุกคน. ฉันหวังว่านี่จะช่วยผู้อื่นเช่นกัน ...

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"); 
});

Improvise - Adapt - เอาชนะ

และนี่คือตัวอย่าง jsFiddle


1
ทางออกที่สะอาดที่สุด ดี! แต่วิธีแก้ไขทั้งหมดมีปัญหา: ผู้ใช้ต้องคลิกแผนที่สองครั้ง จะสามารถส่งผ่านการคลิกได้ทันทีดังนั้นใช้เวลาเพียงคลิกเดียวเท่านั้น?
Loren

1
บางทีคุณอาจหลีกเลี่ยงการคลิกโดยสลับไปที่pointer-events: autoหลังจากที่เมาส์ "โฮเวอร์" อยู่เหนือแผนที่ในช่วงระยะเวลาหนึ่งหรือไม่ เช่นเริ่มจับเวลาเมื่อเมาส์เข้าสู่ iframe และรีเซ็ตเมื่อเมาส์ออก หากได้รับการจับเวลามิลลิวินาที X pointer-events: autoสลับไป และเมื่อใดก็ตามที่ใบเมาส์ iframe pointer-events: noneที่คุณเพิ่งเปลี่ยนกลับไป
stucampbell

ฉันชอบที่จะใช้ dblclick แทนการคลิกวิธีแก้ปัญหาที่ดีอยู่แล้ว
Moxet Khan

25

ใช่มันค่อนข้างง่าย ฉันประสบปัญหาคล้ายกัน เพียงเพิ่มคุณสมบัติ css "pointer-events"ใน iframe div และตั้งค่าเป็น'none' 'ไม่มี'

ตัวอย่าง: <iframe style = "pointer-events: none" src = ........ >

SideNote: การแก้ไขนี้จะปิดการใช้งานกิจกรรมเมาส์อื่น ๆ ทั้งหมดบนแผนที่ มันใช้งานได้สำหรับฉันเนื่องจากเราไม่ต้องการการโต้ตอบกับผู้ใช้บนแผนที่


20
ทำไมไม่ลองใช้ภาพดูล่ะ? คุณกำลังโหลดเนื้อหาพิเศษจำนวนมากเพื่อปิดใช้งานทั้งหมด
deweydb

2
ใช่ แต่ฉันไม่สามารถคลิกที่วิดเจ็ต
Jeffrey Nicholson Carré

1
โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับ IE <11 - caniuse.com/#search=pointer-events
totallyNotLizards

@deweydb - นั่นมันผิดกฎหมายเหรอ?
Matt Saunders

@ MattSaunders ไม่แน่ใจว่าเป็นกรณีนี้ในเวลา แต่ตอนนี้ คุณสามารถโหลดภาพแผนที่แบบคงที่โดยตรงจาก Google API บางทีนี่อาจเป็นสิ่งที่ deweydb แนะนำ จะเป็นวิธีที่เป็นไปได้ในการแก้ไขปัญหา
อาซาริยา


13

หลังจากทำวิจัยคุณมี 2 ตัวเลือก เนื่องจาก api แผนที่ใหม่พร้อมฝัง iframe ดูเหมือนจะไม่สนับสนุนการปิดใช้งานเมาส์วีล

เป็นครั้งแรกคือใช้ google maps แบบเก่า ( https://support.google.com/maps/answer/3045828?hl=th )

ข้อที่สองคือการสร้างฟังก์ชั่นจาวาสคริปต์เพื่อทำให้การฝังแผนที่ง่ายขึ้นสำหรับแต่ละความคิดเห็นและการใช้พารามิเตอร์ (เป็นโค้ดตัวอย่างเท่านั้นเพื่อชี้ตำแหน่งไม่แสดงวิธีแก้ปัญหาที่แน่นอน)

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

มีวิธีการแก้ปัญหาที่น่ากลัวและง่ายคือ

คุณต้องเพิ่มคลาสที่กำหนดเองใน css ของคุณที่ตั้งค่าตัวชี้เหตุการณ์เพื่อแมป Canvas เป็น none:

.scrolloff{
   pointer-events: none;
}

จากนั้นด้วย jQuery คุณสามารถเพิ่มและลบคลาสนั้นตามเหตุการณ์ต่าง ๆ ตัวอย่างเช่น

    $( 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
     });    
});

ฉันได้สร้างตัวอย่างในjsfiddleหวังว่าจะช่วยได้!


1
สิ่งนี้ยังใช้งานได้กับ Google Maps Embed API - เพียงแทนที่ map_canvas ด้วย iframe ฝัง โปรดทราบว่าเหตุการณ์คลิกที่อยู่บนด้านนอกองค์ประกอบ แต่ scrolloff อยู่บนชั้นองค์ประกอบ (มันถูกต้องในคำตอบ / jsfiddle เพียงในกรณีที่คุณกำลังถ่ายทอดมากกว่าคัดลอก / วาง)
Jxtps

8

ฉันเพิ่งลงทะเบียนหนึ่งบัญชีในdevelopers.google.comและรับโทเค็นสำหรับเรียกใช้ Maps API และเพียงปิดการใช้งานเช่นนี้ (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
        });
    }

ดียิ่งกว่า jQuery hacks!
Dániel Kis-Nagy

7

นี่คือแนวทางของฉัน ฉันพบว่ามันง่ายที่จะนำไปใช้กับเว็บไซต์ต่างๆและใช้งานได้ตลอดเวลา

CSS และ 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>

<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>

หวังว่านี่จะช่วยให้ทุกคนกำลังมองหาทางออกที่ง่าย


5

นี่เป็นวิธีง่ายๆ เพียงตั้งค่าpointer-events: noneCSS เป็น<iframe>เพื่อปิดการเลื่อนเมาส์

<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>

หากคุณต้องการให้เปิดใช้งานการเลื่อนเมาส์เมื่อผู้ใช้คลิกเข้าไปในแผนที่ให้ใช้รหัส JS ต่อไปนี้ นอกจากนี้ยังจะปิดการใช้งานการเลื่อนเมาส์อีกครั้งเมื่อเมาส์เลื่อนออกจากแผนที่

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

!!! นอกจากนี้โปรดทราบว่าตัวชี้ Imho ปิดการใช้งานทั้งหมดคลิกเหตุการณ์สำหรับ Iframe นี้
stephanfriedrich

กิจกรรมคลิกถูกปิดใช้งานสำหรับ iframe เท่านั้น แต่ถ้าคุณใช้รหัส JS ทันทีที่เมาส์เข้าสู่ div.gmap-holder กิจกรรมการคลิกจะเปิดใช้งานอีกครั้ง
manish_s

มันใช้งานได้ดีสำหรับฉัน! โซลูชันส่วนใหญ่ไม่เข้ากันกับ WordPress: onclick ถูกขัดและบางครั้งความกว้างของ iframe ก็ไม่ได้รับเกียรติ แต่สิ่งนี้ทำงานได้อย่างมีเสน่ห์ หลังจากวางรหัส JS ออกไปสิ่งที่ต้องทำทั้งหมดคือการอ้างอิง id = "gmap-holder" สมบูรณ์ ขอบคุณ Manish
usonianhorizon

4

หากต้องการปิดใช้งานการซูมล้อเลื่อนของเมาส์บน Google Maps แบบฝังตัวคุณเพียงแค่ต้องตั้งค่าตัวชี้คุณสมบัติ css ของเหตุการณ์ iframe เป็น none:

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

นั่นคือทั้งหมด .. ค่อนข้างเรียบร้อยเหรอ?

<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
นอกจากนี้ยังจะปิดการใช้งานการคลิกสองครั้งที่ซูมด้วย :)
w3debugger

ปิดใช้งานการซูมเข้าซูมออกทิศทาง ฯลฯ ด้วย
zanderwar

4

สำหรับฉันทางออกที่ดีที่สุดคือใช้แบบนี้:

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>

ผลลัพธ์

การพิจารณา:

วิธีที่ดีที่สุดคือเพิ่มการซ้อนทับด้วยความโปร่งใสที่เข้มกว่าด้วยข้อความ: " คลิกเพื่อเรียกดู " เมื่อล้อเลื่อนของเมาส์ถูกปิดการใช้งาน แต่เมื่อเปิดใช้งาน (หลังจากคุณคลิกที่มัน) ความโปร่งใสพร้อมข้อความจะหายไปและผู้ใช้สามารถเรียกดู แผนที่ตามที่คาดไว้ เบาะแสใด ๆ วิธีการทำเช่นนั้น?



3

วิธีที่ง่ายที่สุดที่จะทำคือการใช้องค์ประกอบหลอกเหมือนหรือ:before วิธีนี้จะไม่ต้องใช้องค์ประกอบ html เพิ่มเติมหรือ jQuery ถ้าเรามีตัวอย่างโครงสร้าง HTML นี้::after

<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>

จากนั้นสิ่งที่เราต้องทำคือทำให้เสื้อคลุมสัมพันธ์กับองค์ประกอบเทียมที่เราจะสร้างขึ้นเพื่อป้องกันการเลื่อน

.map_wraper{
    position:relative;
}

หลังจากนี้เราจะสร้างองค์ประกอบเทียมที่จะอยู่เหนือแผนที่เพื่อป้องกันการเลื่อน:

.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;
}

และคุณก็เสร็จสิ้นแล้วไม่มี jquery ไม่มีองค์ประกอบ html เพิ่มเติม! นี่คือตัวอย่าง jsfiddle ที่ใช้งานได้: http://jsfiddle.net/e6j4Lbe1/


ความคิดที่ฉลาด อย่างไรก็ตามเช่นเดียวกับคำตอบอื่น ๆ สิ่งนี้จะรวบรวมทุกอย่างไม่ใช่แค่เหตุการณ์ล้อเลียน
likeitlikeit

ฉันดีใจที่มันช่วยคุณออกไป!
อังเดร

3

นี่คือทางออกที่ง่ายของฉัน

ใส่ iframe ของคุณใน div ด้วยคลาสที่เรียกว่า "maps"

นี่จะเป็น CSS สำหรับ iframe ของคุณ

.maps iframe { pointer-events: none }

และนี่คือจาวาสคริปต์เล็ก ๆ ที่จะตั้งค่าคุณสมบัติตัวชี้เหตุการณ์ของ iframe เป็น "อัตโนมัติ" เมื่อคุณเลื่อนองค์ประกอบ div เป็นเวลาอย่างน้อย 1 วินาที (ทำงานได้ดีที่สุดสำหรับฉัน - ตั้งค่าเป็นอะไรก็ได้ที่คุณต้องการ) และล้างหมดเวลา / ตั้งค่าเป็น "ไม่มี" อีกครั้งเมื่อเมาส์ออกจากองค์ประกอบ

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");
});

ไชโย


3

ฉันได้สร้างปลั๊กอิน jQuery ง่าย ๆ เพื่อแก้ไขปัญหา ตรวจสอบได้ที่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

การใช้คำตอบจาก @nathanielperales ฉันได้เพิ่มฟังก์ชั่นโฮเวอร์ไว้สำหรับฉันแล้วมันจะทำงานได้ดีขึ้นเมื่อผู้ใช้ขาดโฟกัสบนแผนที่เพื่อหยุดเลื่อนอีกครั้ง :)

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

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

ประเด็นก็คือเราปล่อยฟังก์ชั่นการนำทางสำหรับฉันมันสำคัญมากสำหรับอุปกรณ์มือถือ ฉันได้สร้างปลั๊กอิน jQuery ที่ง่ายมากที่คุณสามารถแก้ไขได้หากคุณต้องการ ตรวจสอบได้ที่github.com/diazemiliano/mapScrollOff
Emiliano Díaz

2

การเปลี่ยนแปลงในชุดรูปแบบ: โซลูชันอย่างง่ายพร้อม jQuery ไม่จำเป็นต้องแก้ไข 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
});

Hover listener นั้นแนบมากับอิลิเมนต์พาเรนต์ดังนั้นหากพาเรนต์ปัจจุบันมีขนาดใหญ่กว่าคุณเพียงแค่ล้อม iframe ด้วย div ก่อนบรรทัดที่ 3

หวังว่ามันจะมีประโยชน์สำหรับใครบางคน


1

ฉันสะดุดกับปัญหานี้ด้วยตัวเองและใช้ตอบโต้กับผู้ใช้ได้สองคำตอบที่มีประโยชน์มากกับคำถามนี้: คำตอบของczeraszและmassa ' s คำตอบ

พวกเขาทั้งคู่มีความจริงมากมาย แต่อยู่ที่ไหนสักแห่งในการทดสอบของฉันฉันพบว่าหนึ่งไม่ทำงานสำหรับมือถือและมีการสนับสนุน IE ที่ไม่ดี (ทำงานได้เฉพาะบน IE11) นี่คือวิธีการแก้ปัญหาโดย nathanielperales จากนั้นขยายโดย czerasz ซึ่งอาศัยตัวชี้เหตุการณ์ css และไม่ทำงานบนมือถือ (ไม่มีตัวชี้ในมือถือ) และไม่ทำงานบน IE เวอร์ชันใด ๆ ที่ไม่ใช่ v11 . โดยปกติฉันจะไม่สนใจน้อยลง แต่มีผู้ใช้จำนวนมากออกไปข้างนอกและเราต้องการฟังก์ชั่นที่สอดคล้องกันดังนั้นฉันจึงใช้โซลูชันโอเวอร์เลย์โดยใช้ wrapper เพื่อทำให้โค้ดง่ายขึ้น

ดังนั้นมาร์กอัปของฉันมีลักษณะเช่นนี้:

<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>

จากนั้นสไตล์จะเป็นดังนี้:

.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*/
}

สุดท้ายสคริปต์:

//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);

ฉันยังเพิ่มโซลูชันที่ผ่านการทดสอบของฉันในส่วนสำคัญของ GitHubหากคุณต้องการรับข้อมูลจากที่นั่น ...


1

นี่เป็นวิธีแก้ปัญหาด้วย CSS และ Javascript (เช่น Jquery แต่ใช้ได้กับ Javascript บริสุทธิ์ด้วย) ในขณะเดียวกันแผนที่ก็ตอบสนองได้ หลีกเลี่ยงแผนที่เพื่อซูมขณะเลื่อน แต่สามารถเปิดใช้งานแผนที่ได้ด้วยการคลิก

HTML / 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 */
} 

มีความสุข !


1

ใน Google Maps v3 ตอนนี้คุณสามารถปิดการเลื่อนเพื่อซูมซึ่งนำไปสู่ประสบการณ์การใช้งานที่ดีขึ้นมาก ฟังก์ชั่นแผนที่อื่น ๆ ยังคงใช้งานได้และคุณไม่จำเป็นต้องมี div เพิ่มเติม ฉันคิดว่าควรมีข้อเสนอแนะสำหรับผู้ใช้เพื่อให้พวกเขาเห็นเมื่อเปิดใช้งานการเลื่อนดังนั้นฉันจึงเพิ่มเส้นขอบแผนที่

// 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

สิ่งนี้จะทำให้คุณตอบสนอง Google Map ที่จะหยุดการเลื่อนบน iframe แต่เมื่อคลิกไปแล้วจะช่วยให้คุณซูมได้

คัดลอกและวางสิ่งนี้ลงใน html ของคุณ แต่แทนที่ลิงค์ iframe ด้วยตัวคุณเอง เขาเป็นบทความเกี่ยวกับเรื่องนี้ด้วยตัวอย่าง: ปิดใช้งานการซูมล้อเลื่อนของเม้าส์บน iframes แผนที่ Google ฝังตัว

<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

นี่จะเป็นแนวทางของฉันในเรื่องนี้

เปิดไฟล์นี้ใน main.js ของฉันหรือไฟล์ที่คล้ายกัน:

// 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');

จากนั้นใส่ div ว่างที่คุณต้องการให้แผนที่ปรากฏบนหน้าของคุณ

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

เห็นได้ชัดว่าคุณจะต้องโทรหาใน Google Maps API เช่นกัน ฉันเพิ่งสร้างไฟล์ชื่อ mapi.js และขว้างมันในโฟลเดอร์ / js ของฉัน ไฟล์นี้จะต้องมีการเรียกก่อน javascript ข้างต้น

`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");
})();`

เมื่อคุณเรียกไฟล์ mapi.js ต้องแน่ใจว่าคุณได้ส่งผ่านคุณสมบัติของเซ็นเซอร์ที่ผิดพลาด

เช่น: <script type="text/javascript" src="js/mapi.js?sensor=false"></script>

API เวอร์ชัน 3 ใหม่ต้องมีการรวมเซ็นเซอร์ด้วยเหตุผลบางประการ ตรวจสอบให้แน่ใจว่าคุณใส่ไฟล์ mapi.js ไว้ก่อนหน้าไฟล์ main.js ของคุณ



0

หากคุณมี iframe โดยใช้ Google map API แบบฝัง:

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

คุณสามารถเพิ่มรูปแบบ css นี้: ตัวชี้เหตุการณ์: 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

ต่อไปนี้เป็นคำตอบสำหรับฉันใน @nathanielperales ที่ขยายโดย @chams ซึ่งตอนนี้ฉันขยายอีกครั้ง

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

ที่ง่ายที่สุด :

<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

เพิ่มลงในสคริปต์ของคุณ:

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
คำถามเกี่ยวกับ Embed API (ใช้ iframe) ไม่ใช่ JavaScript API
GreatBlakes

0

นี่คือวิธีแก้ไขปัญหาของฉันฉันสร้างเว็บไซต์ WP ดังนั้นจึงมีรหัส php เล็กน้อยที่นี่ แต่ที่สำคัญคือscrollwheel: false,ในวัตถุแผนที่

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
        });
    }

หวังว่าจะช่วยได้ ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.