Yerleşik Google Haritalar'da fare kaydırma tekerleğini yakınlaştırmayı devre dışı bırak


198

Yazarların çoğu yazıda iFrames kullanarak Google Haritalar'ı gömdükleri bir WordPress sitesinde çalışıyorum.

Javascript kullanarak hepsinde fareyi kaydırma tekerleği ile yakınlaştırmayı devre dışı bırakmanın bir yolu var mı?


32
Harita seçeneğini scrollwheelolarak ayarlayın false.
Anto Jurković

veya doğrudan JS üzerinden devre dışı bırakın: map.disableScrollWheelZoom ();
Th3Alchemist

4
Korkarım yapamazsın. Güvenlik kısıtlamaları nedeniyle haritaya komut dosyası erişimi yoktur ve AFAIK, size devre dışı bırakma seçeneği sunan URL parametresi yoktur.
Dr.Molle

Tamamen aynı sorun var. İframe eşlemesine katıştırılmış fare kaydırma olaylarını devre dışı bırakmak istiyorum. Henüz bulamadım.
Grzegorz

7
Bu katıştırılmış haritalar, neden insanlar haritalar JS kitaplığını kullanmak için çözümler
yayınladığından

Yanıtlar:


255

Aynı sorunu yaşıyordum: sayfayı kaydırdığınızda imleç haritanın üzerine gelir, sayfayı kaydırmaya devam etmek yerine haritayı yakınlaştırır / uzaklaştırır. :(

Bu yüzden her gmap yerleştirmeden önce bir divile koyarak bu çözüldü , bkz:.overlayiframe

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

Benim CSS sınıf oluşturdu:

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

Div, haritayı kapsayacak ve işaretçinin olayların ona ulaşmasını önleyecektir. Ancak div'ı tıklatırsanız, haritayı tekrar etkinleştirerek işaretçi olaylarına şeffaf olur!

Umarım size yardımcı olur :)


9
Bu harika bir çözüm. Benim durumumda, z-indexdoğru şekilde bindirmek için bir belirtmek zorunda kaldım .
RCNeil

1
IMO bu soruna henüz en iyi çözüm! Uzun zamandır bu sorunla karşı karşıyayız ve bu güzel ve oldukça temiz bir yeniden kullanılabilir düzeltme sağlar!
Diego Paladino

11
kaplamayı kesinlikle bir üst konteynere yerleştirilmiş olarak ayarlamak ve daha sonra sadece genişlik% 100 yükseklik% 100 olsa da, daha kolay bir arka plan özelliğine ihtiyaç duymamakla birlikte, bu cevap olarak işaretlenmelidir.
8.04 Ağustos'ta

3
Bunu otomatikleştirmek için çok basit bir jQuery eklentisi oluşturdum. Github.com/diazemiliano/mapScrollOff
Emiliano Díaz

8
Bu çözümü, kaydırma tekerleği olaylarını yok saymak, ancak sol tıklamaları yok saymamak için genişletmenin kolay bir yolu var mı? Bu çözüm güzel, ancak kullanıcıların haritanın üst kısmındaki "Yol Tarifleri" köprüsüne iki kez tıklamasını gerektirir (bir kez
div'ye

136

Bu tartışmadaki ilk cevabı denedim ve ne yaptığımdan bağımsız olarak benim için çalışmadı, bu yüzden kendi çözümümü buldum:

İframe'i bir sınıfla sarın (bu örnekte .maps) ve ideal olarak kapsamlı bir şekilde kodlayın: http://embedresponsively.com/ - iframe'in CSS'sini değiştirin pointer-events: noneve sonra jQuery'nin click işlevini kullanarak üst öğeye iframes css içinpointer-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"); 
});

Eminim bunu yapmanın tek yolu JavaScript'tir, eğer birisi buna eklemek istiyorsa çekinmeyin.

İşaretçi olaylarını yeniden etkinleştirmenin JavaScript yolu oldukça basittir. Sadece iFrame'e bir id (yani "iframe") verin, ardından cointainer div öğesine bir onclick olayı uygulayın:

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'sız" çözüm için teşekkürler. +1
Şiddetli İşkence

21
Fare ayrıldığında orijinal durumuna geri getirmek için bunu da ekleyebilirsiniz: $ ('. Maps'). Mouseleave (function () {$ ('. Maps iframe'). Css ("pointer-events", " Yok"); });
Luis

5
Sadece bir not: kullanmak pointer-events: noneharita ile etkileşimi önleyecektir (sürükleme, gezinme, tıklamalar, vb.).
LuBre

@LuBre evet, anlaşıldı, bu yüzden otomatik olarak değiştirmek için jQuery click işlevi var.
nathanielperales

1
Mükemmel cevap! Tümü değil, doğru haritayı etkinleştirdiğinizden emin olmak istiyorsunuz$(this).find('iframe').css("pointer-events", "auto");
Tom Prats

54

@Nathanielperales çözümünü genişlettim.

Davranış açıklamasının altında:

  • kaydırmayı etkinleştirmek için haritayı tıklayın
  • fare haritayı terk ettiğinde, kaydırmayı devre dışı bırak

Javascript kodunun altında:

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

Ve işte bir jsFiddle örneği .


1
Bu snip için teşekkürler. Sonunda aşağıdaki ek ile kullandım:$('.maps.embed-container').find('iframe').css("pointer-events", "none");
lhermann

Kod için teşekkürler. Aslında farklı bir problemi çözdüm. Google E-Tablodaki bazı grafikleri katıştırdım ve fare tekerleği ile kaydırma, herhangi bir nedenle tüm sayfa için çalışmayı durdurdu. Kodunuz fare tekerleğiyle tekrar kaydırılmasını sağladı. Tekrar teşekkürler.
Scott M. Stolz

31

#Nathanielperales tarafından yazılan kodu gerçekten benim için çalıştı yeniden düzenleme. Basit ve yakalamak kolay ama sadece bir kez çalışır. Bu yüzden JavaScript'e mouseleave () ekledim. Fikir #Bogdan uyarlanmış Ve şimdi mükemmel. Bunu dene. Kredi #nathanielperales ve #Bogdan'a gidiyor. Her iki fikri de birleştirdim. Sağolun beyler. Umarım bu başkalarına da yardımcı olur ...

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

Doğaçlama - Uyum - Üstesinden Gelme

Ve işte bir jsFiddle örneği.


1
En temiz çözüm. Güzel! Ancak TÜM çözümlerin bir sorunu var: Kullanıcılar haritayı iki kez tıklamak zorunda. Tıklamadan hemen nasıl geçebilir, bu yüzden yalnızca bir tıklama alır?
Loren

1
Belki pointer-events: autosadece fareyi belirli bir süre için haritanın üzerine "getirdikten sonra" tıklamayı engelleyebilirsiniz. örn. fare iframe'e girdiğinde zamanlayıcıyı başlat ve fare kalktığında sıfırla. Zamanlayıcı X milisaniyeye ulaşırsa, seçeneğine geçin pointer-events: auto. Ve fare iframe'i terk ettiğinde sadece geri dönersiniz pointer-events: none.
stucampbell

Yine de iyi bir çözüm, tıklama yerine dblclick kullanmayı tercih ederim.
Moxet Khan

25

Evet, oldukça kolay. Benzer bir sorunla karşılaştım. Sadece iframe div'e css özelliğini "pointer-events" ekleyin ve 'none' olarak ayarlayın .

Örnek: <iframe style = "pointer-events: none" src = ........>

SideNote: Bu düzeltme, haritadaki diğer tüm fare olaylarını devre dışı bırakır. Harita üzerinde herhangi bir kullanıcı etkileşimi gerektirmediği için benim için çalıştı.


20
Neden sadece bir görüntü kullanmıyorsunuz? tümünü devre dışı bırakmak için birçok ek öğe yüklüyorsunuz.
deweydb

2
Evet ama widget'lara tıklayamıyorum
Jeffrey Nicholson Carré

1
Bunun IE <11'de çalışmadığını lütfen unutmayın - caniuse.com/#search=pointer-events
totallyNotLizards

@deweydb - bu yasa dışı değil mi?
Matt Saunders

@MattSaunders durumun böyle olup olmadığından emin değil, ama şimdi. Statik bir harita resmini doğrudan Google API'den yükleyebilirsiniz, belki de deweydb'nin önerdiği şey budur? Kesinlikle sorunun etrafında uygulanabilir bir yol olurdu.
azariah

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

13

Biraz araştırma yaptıktan sonra 2 seçeneğiniz var. İframe gömülü yeni haritalar, fare tekerleğinin devre dışı bırakılmasını desteklemiyor gibi görünüyor.

İlk olarak eski google haritaları kullanmak ( https://support.google.com/maps/answer/3045828?hl=tr ).

İkincisi , her yorum için bir haritanın yerleştirilmesini basitleştirmek ve parametreleri kullanmak için bir javascript işlevi oluşturmak olacaktır (sadece konumu tam çözümü göstermeyecek şekilde noktaya örnek kod)

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

Müthiş ve kolay bir çözüm var.

Css'nize tuvali hiçbiri ile eşlemek için işaretçi olaylarını ayarlayan özel bir sınıf eklemeniz gerekir:

.scrolloff{
   pointer-events: none;
}

Ardından, jQuery ile bu sınıfı farklı etkinliklere dayalı olarak ekleyebilir ve kaldırabilirsiniz, örneğin:

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

Ben jsfiddle bir örnek yarattık , umarım bu yardımcı olur!


1
Bu aynı zamanda Google Maps Embed API'sı ile de çalışır - map_canvas'ı embed iframe ile değiştirmeniz yeterlidir. Click olayının dış öğe üzerinde olduğunu, ancak scrolloff'un öğe üzerinde olduğunu unutmayın (kopyalama / yapıştırma yerine kopyalamanız durumunda answer / jsfiddle içinde doğrudur)
Jxtps

8

Sadece bir hesabı developers.google.com'a kaydettiriyorum ve bir Google Haritalar API'sını aramak için bir jeton alıyorum ve bunu şu şekilde devre dışı bırakıyorum (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 kesmek çok daha iyi!
Dániel Kis-Nagy

7

Bu benim yaklaşımım. Çeşitli web sitelerinde uygulamayı ve her zaman kullanmayı kolay buluyorum

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

HTML'de iframe'i bir div içine sarmak isteyeceksiniz. <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>

Umarım bu basit bir çözüm arayan herkese yardımcı olur.


5

İşte basit bir çözüm. Fare kaydırmayı devre dışı bırakmak için pointer-events: noneCSS <iframe>ayarını yapmanız yeterlidir.

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

Kullanıcı haritayı tıklattığında fare kaydırmasının etkinleştirilmesini istiyorsanız, aşağıdaki JS kodunu kullanın. Fare haritadan çıktığında da fare kaydırmasını devre dışı bırakır.

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

!!! Ayrıca, Imho işaretçisi olaylarının tümünü devre dışı bıraktığında , bu Iframe için Olaylar'ı tıklatın .
stephanfriedrich

Tıklama etkinlikleri yalnızca iframe için devre dışı bırakılır. Ancak JS kodunu kullanıyorsanız, fare div.gmap-holder'a girer girmez, tıklama olayları tekrar etkinleştirilir.
manish_s

Bu benim için harika çalıştı! Çözümlerin çoğu WordPress ile uyumsuzdu: onclick temizlendi ve bazen iframe'in genişliği onurlandırılmadı, ancak bu bir cazibe gibi çalıştı. JS kodunu kaldırdıktan sonra tek yapmanız gereken id = "gmap-holder" a başvurmaktır. Mükemmel. Teşekkürler Manish.
usonianhorizon

4

Katıştırılmış Google Haritalar'da fare kaydırma tekerleği yakınlaştırmasını devre dışı bırakmak için, iframe'in css özelliği işaretçi etkinliklerini yok olarak ayarlamanız yeterlidir:

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

Hepsi bu .. Oldukça temiz ha?

<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
Ayrıca çift tıklama yakınlaştırmasını devre dışı bırakacaktır :)
w3debugger

Ayrıca yakınlaştırmayı, uzaklaştırmayı, yol tariflerini vb.
Devre

4

Benim için en iyi çözüm bu şekilde kullanmaktı:

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>

SONUÇ

hususlar:

En iyisi, bir metinle daha koyu şeffaflık içeren bir kaplama eklemek olacaktır: Fare tekerleği devre dışı bırakıldığında " Göz atmak için tıklayın " Ancak etkinleştirildiğinde (üzerine tıkladıktan sonra), metin ile şeffaflık kaybolacak ve kullanıcı göz atabilecektir harita beklendiği gibi. Bunun nasıl yapılacağına dair ipucu var mı?


3

pointer-events:none;Bu iyi çalışmanın stilini ekle

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

3

Bunu yapmanın en basit yolu, :beforeveya gibi bir sözde eleman kullanmaktır :after.
Bu yöntem herhangi bir ek html öğesi veya jquery gerektirmez.
Örneğin bu html yapımız varsa:

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

Sonra tek yapmamız gereken, kaydırmayı önlemek için oluşturacağımız sözde öğeye göre sargıyı yapmaktır

.map_wraper{
    position:relative;
}

Bundan sonra, kaydırmayı önlemek için haritanın üzerine yerleştirilecek sözde elemanı oluşturacağız:

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

Ve işiniz bitti, jquery yok ekstra html öğesi yok! İşte çalışan bir jsfiddle örneği: http://jsfiddle.net/e6j4Lbe1/


Zekice fikir. Bununla birlikte, diğer bazı cevaplar gibi, bu da sadece fare tekerleği olaylarını değil, her şeyi yakalar.
likeitlikeit

Sana yardım ettiğine sevindim!
Andrei

3

İşte benim basit çözümüm.

İframe'inizi, örneğin "haritalar" adlı bir sınıfa yerleştirin.

Bu, iframe'iniz için CSS olacaktır

.maps iframe { pointer-events: none }

Ve div öğesini en az 1 saniye boyunca tuttuğunuzda iframe'in pointer-events özelliğini "auto" olarak ayarlayan küçük bir javascript (benim için en iyisi - istediğiniz gibi ayarlayın) ve zaman aşımı / fare öğeden ayrıldığında tekrar "none" olarak ayarlayın.

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

Şerefe.


3

Sorunu çözmek için çok basit bir jQuery eklentisi oluşturdum. Https://diazemiliano.github.io/googlemaps-scrollprevent adresinden kontrol edin

(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'ın yanıtını kullanarak fareyle üzerine gelindiğim fonksiyonu ekledim, çünkü kullanıcı tekrar kaydırmayı durdurmak için haritaya odaklanmayı kaybettiğinde daha iyi çalışıyor :)

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

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

Mesele şu ki, navigasyon işlevini kaybettik, benim için mobil cihazlarda çok önemlidir. İsterseniz değiştirebileceğiniz çok basit bir jQuery eklentisi oluşturdum. Github.com/diazemiliano/mapScrollOff
Emiliano Díaz

2

Bir temadaki varyasyonlar: jQuery ile basit bir çözüm, CSS düzenlemesine gerek yok.

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

Fareyle üzerine gelme dinleyicisi üst öğeye eklenir, bu nedenle geçerli üst öğe daha büyükse, iframe'i 3. satırdan önce bir div ile sarabilirsiniz.

Umarım birisi için faydalı olur.


1

Bu konuyu kendim tökezledim ve bu soruya çok faydalı iki cevabın bir karışımını kullandım : czerasz cevabı ve massa cevabı.

Her ikisinin de bir sürü gerçeği var, ancak testlerimde bir yerlerde, mobil cihazlar için işe yaramadığını ve zayıf IE desteğine sahip olduğunu öğrendim (sadece IE11'de çalışıyor). Bu nathanielperales tarafından çözümdür, daha sonra czerasz tarafından genişletilir, bu da işaretçi olayları css'e dayanır ve mobilde çalışmaz (mobilde işaretçi yoktur) ve IE'nin v11 olmayan herhangi bir sürümünde çalışmaz . Normalde daha az umursamam, ama orada bir ton kullanıcı var ve tutarlı işlevsellik istiyoruz, bu yüzden kodlamayı kolaylaştırmak için bir sargı kullanarak bindirme çözümü ile gittim.

Yani, işaretlemem şöyle görünüyor:

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

Sonra stiller şöyle:

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

Son olarak senaryo:

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

Test edilmiş çözümümü bir GitHub özetine ekledim , eğer oradan bir şeyler almak isterseniz ...


1

Bu CSS ve Javascript ile bir çözümdür (yani. Jquery ama aynı zamanda saf Javascript ile de çalışır). Aynı zamanda harita duyarlı. Kaydırma sırasında haritayı yakınlaştırmaktan kaçının, ancak haritayı tıklayarak etkinleştirebilirsiniz.

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

İyi eğlenceler !


1

Google Maps v3'te artık yakınlaştırmak için kaydırmayı devre dışı bırakabilirsiniz, bu da çok daha iyi bir kullanıcı deneyimi sağlar. Diğer harita işlevleri çalışmaya devam eder ve fazladan bölmeye ihtiyacınız yoktur. Ayrıca, kaydırma etkinleştirildiğinde görebilmeleri için kullanıcı için bazı geri bildirimler olması gerektiğini düşündüm, bu yüzden bir harita kenarlığı ekledim.

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

Bu, iframe'deki kaydırmayı durduracak duyarlı bir Google Haritası verecektir, ancak bir kez tıklandığında yakınlaştırma yapmanıza izin verecektir.

Bunu kopyalayıp html'nize yapıştırın, ancak iframe bağlantısını kendinizle değiştirin. Üzerinde bir örnek olan bir makale var: Katıştırılmış Google Harita iframe'lerinde fare kaydırma tekerleğini yakınlaştırmayı devre dışı bırak

<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

İşte benim buna yaklaşımım.

Bunu main.js veya benzeri bir dosyaya yerleştir:

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

Ardından haritanın sayfanızda görünmesini istediğiniz yere boş bir div ekleyin.

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

Açıkça Google Haritalar API'sını da aramanız gerekir. Basitçe mapi.js adlı bir dosya oluşturdum ve / js klasörüme attım. Bu dosyanın yukarıdaki javascript'ten önce çağrılması gerekir.

`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 dosyasını çağırdığınızda, dosyaya yanlış özniteliğini ilettiğinizden emin olun.

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

API'nın yeni sürümü 3, bir nedenden dolayı sensörün dahil edilmesini gerektirir. Main.js dosyanızdan önce mapi.js dosyasını eklediğinizden emin olun.


0

Google Maps v2 - GMap2 için:

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

0

Google haritasına yerleştirilmiş API'yı aşağıdaki gibi kullanan bir iframe'iniz varsa:

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

şu css stilini ekleyebilirsiniz: pointer-event: 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

@Chams'ın uzattığı @nathanielperales cevabını şimdi benim tarafımdan uzattığım.

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

En basit olanı :

<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

Bunu betiğinize ekleyin:

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
Soru JavaScript API'sine değil, Gömme API'sına (iframe kullanarak) ilişkin.
GreatBlakes

0

İşte benim sorunum için çözüm, ben bir WP sitesi inşa edildi, bu yüzden burada biraz php kodu var. Ancak anahtar scrollwheel: false,harita nesnesindedir.

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

Umarım bu yardımcı olur. Şerefe

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.