Ikki marta bosishni e'tiborsiz qoldirib, Google Maps JS API v3 da bosish hodisalarini boshqarish

Google Maps JS API v3 bilan men foydalanuvchi ikki marta bosganida (va xaritaga hech qanday marker qo'shmasdan) standart xatti-harakatni saqlab, xaritada foydalanuvchi bosadigan markerni tashlamoqchiman.

Men klik hodisasida vaqt tugashini belgilash haqida o'yladim. Agar keyingi bir necha millisekundlar ichida ikki marta bosish hodisasi ishga tushirilsa, vaqt tugashi bekor qilinadi. Agar yo'q bo'lsa, vaqt tugashi bilan marker xaritaga joylashtiriladi. Ammo bu, albatta, eng yaxshi yechimga o'xshamaydi.

Buni hal qilishning yanada oqlangan usuli bormi?

rahmat.


person Pierre    schedule 16.03.2011    source manba


Javoblar (6)


Uni hal qilishning eng oson yo'li.

var location;
var map = ...

google.maps.event.addListener(map, 'click', function(event) {
    mapZoom = map.getZoom();
    startLocation = event.latLng;
    setTimeout(placeMarker, 600);
});

function placeMarker() {
    if(mapZoom == map.getZoom()){
        new google.maps.Marker({position: location, map: map});
    }
}

shogunpandaning yechimi yaxshiroq (pastga qarang)

person rebeliagamer    schedule 15.07.2011
comment
Agar placeMarker() funksiyasi ba'zan bosish hodisalaridan tashqari chaqirilsa, bu yechim ishlamaydi (agar siz har doim placeMarker() raqamiga qo'ng'iroq qilishdan oldin mapZoom = map.getZoom() raqamiga qo'ng'iroq qilmasangiz); Men bu vaziyatda @ShogunPandaning yechimini yanada moslashuvchan deb topdim. - person Quinn Comendant; 17.06.2015

Men hozirgina ishlaydigan, lekin kichik kutish vaqtini kiritadigan noto'g'ri yechim topdim (200 ms, bu uni ishlashi uchun minimal, lekin mijozga bog'liqligini bilmayman)

var update_timeout = null;

google.maps.event.addListener(map, 'click', function(event){
    update_timeout = setTimeout(function(){
        do_something_here();
    }, 200);        
});

google.maps.event.addListener(map, 'dblclick', function(event) {       
    clearTimeout(update_timeout);
});

Umid qilamanki, bu yordam beradi!

person ShogunPanda    schedule 07.12.2011
comment
Men buni sinab ko'rdim, lekin men uchun ishlamadi. ikki marta bosishda birinchi marta bosish vaqt tugashini o'chiradi, lekin ikkinchi bosish baribir bosish vazifasini bajaradi va do_something_here() bajariladi. - person Luis A. Florit; 29.10.2015
comment
Shunga qaramay, dblclick funktsiyasida doubleClicked = true global o'zgaruvchini o'rnatish va uni update_timeout ichida tekshirish muammoni hal qildi. ;) - person Luis A. Florit; 29.10.2015

Ikki marta bosish bo'lsa, dblclick yonadi va bunday hollarda bir marta bosish faqat bir marta yonadi.

runIfNotDblClick = function(fun){
    if(singleClick){
        whateverurfunctionis();
    }
};

clearSingleClick = function(fun){
    singleClick = false;
};

singleClick = false;

google.maps.event.addListener(map, 'click', function(event) {// duh! :-( google map zoom on double click!
    singleClick = true;
    setTimeout("runIfNotDblClick()", 500);
});

google.maps.event.addListener(map, 'dblclick', function(event) {// duh! :-( google map zoom on double click!
     clearSingleClick();
});

http://www.ilikeplaces.com ga qarang.

person Ravindranath Akila    schedule 28.04.2011
comment
Ajoyib ishlaydi! Agar sizga yoqqan bo'lsa, voqeani runIfNotDblClick funksiyasiga yuborishim kerak edi, siz quyidagilarni qilishingiz mumkin: setTimeout(runIfNotDblClick.bind(null, event), 500) va masalan, Array.prototype.slice.call(arguments)[0].latLng yordamida hodisada latLng ni o'qing. - person riper; 08.01.2018

Agar siz underscore.js yoki* lodash bu muammoni hal qilishning tez va oqlangan usuli

// callback is wrapped into a debounce function that is called after
// 400 ms are passed, it provides a cancel function that can be used
// to stop it before it's actually executed
var clickHandler = _.debounce(function(evt) {
  // code called on single click only, delayed by 400ms
  // adjust delay as needed.
  console.debug('Map clicked with', evt);
}, 400);
// configure event listeners for map
google.maps.event.addListener(map, 'click', clickHandler);
google.maps.event.addListener(map, 'dblclick', clickHandler.cancel);

* Debounce.cancel faqat lodashda amalga oshiriladi (ushbu majburiyatuni amalga oshirmaydi

person Fabio    schedule 16.11.2015

setTimeout() yondashuvini amalga oshirishning yanada toza usuli bu bir marta bosish uchun maxsus hodisalarni ishga tushirishdir.

Quyidagi funksiya har qanday Google Xaritalar interfeysi obyektini (masalan, xarita, marker, koʻpburchak va h.k.) oladi va ikkita maxsus hodisani oʻrnatadi:

singleclick: agar boshqa bosishlar sodir bo'lmasa, bosishdan keyin 400 ms chaqiriladi

firstclick: bosish hodisasi sodir bo'lganda chaqiriladi, agar oxirgi 400 ms ichida bosish sodir bo'lmagan bo'lsa (bu foydalanuvchiga darhol bosish bo'yicha fikr-mulohazalarni ko'rsatish uchun qulaydir)

function addSingleClickEvents(target) {
  var delay = 400;
  var clickTimer;
  var lastClickTime = 0;

  google.maps.event.addListener(target, 'click', handleClick);
  google.maps.event.addListener(target, 'dblclick', handleDoubleClick);

  function handleClick(e) {
    var clickTime = +new Date();

    var timeSinceLastClick = clickTime - lastClickTime;

    if(timeSinceLastClick > delay) {
      google.maps.event.trigger(target, 'firstclick', e);

      clickTimer = setTimeout(function() {
        google.maps.event.trigger(target, 'singleclick', e);
      }, delay);
    } else {
      clearTimeout(clickTimer);
    }

    lastClickTime = clickTime;
  }

  function handleDoubleClick(e) {
    clearTimeout(clickTimer);
    lastClickTime = +new Date();
  }
}

Siz undan shunday foydalanishingiz mumkin:

var map = ....
addSingleClickEvents(map);
google.maps.event.addListener(map, 'singleclick', function(event) {
    console.log("Single click detected at: " + event.latLng);
}
person James    schedule 08.05.2015

Ishonchim komil emas, lekin agar siz 'click' va 'dblclick' hodisalariga hodisa ishlov beruvchilarini qo'shsangiz, bu erda markerni bosish ustiga qo'ying va ikki marta bosish bilan hech qanday harakat qilmasangiz, qo'shishni o'tkazib yuborishingiz mumkin. vaqt tugashi (xaritalar API nima bosish va nima ikki marta bosish farq qilishi mumkin)

google.maps.event.addListener(map, 'click', function (event) {
        placeMarker(event.latLng);
    });
google.maps.event.addListener(map, 'dblclick', function(event) { 
//DO NOTHING, BECAUSE IT IS DOUBLE CLICK
});

placeMarker(latLng) - bu belgilangan joyga marker qo'shadigan maxsus qo'shilgan funksiya:

var marker = new google.maps.Marker({
        position: location,
        draggable: true,
        map: map
    });
map.setCenter(location);
person GoG    schedule 16.03.2011
comment
Javobingiz uchun rahmat. Ammo foydalanuvchi ikki marta bosganida API ham klik, ham dblclick hodisasini ishga tushiradi:/ - person Pierre; 17.03.2011