Замедлите мой JavaScript! Как разрешить моему коду ждать завершения перехода перед выполнением? - PullRequest
3 голосов
/ 15 декабря 2009

Странный вопрос, наверное, но у меня есть немного кода на моей странице ...

$(".map-overlay-left").click(function () {  
    $("#map-holder").hide('slow');                                  
    var gmarkers = [];
    var side_bar_html = "";

    var map = new GMap2(document.getElementById('map-holder'));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    var Africa = new GLatLng(-2.767478,23.730469);
    map.setCenter(Africa, 4);   

    $.get("http://xx.xxx.xxxx.xxx/xml-feed-google-maps",{},function(xml) {
        $('marker',xml).each(function(i) {
            html = $(this).text();
            lat = $(this).attr("lat");
            lng = $(this).attr("lng");
            label = $(this).attr("label");
            var point = new GLatLng(lat,lng);
            var marker = createMarker(point,label,html);
            map.addOverlay(marker);
        });
    });

    $("#map-holder").show('slow');
});

Это работает фантастически и делает то, что я хочу, функционально, но не с точки зрения пользовательского интерфейса. Он предназначен для того, чтобы сначала сделать хороший переход, чтобы скрыть div "map-holder", отобразить внутри него карту Google, а затем сделать хороший переход обратно к размеру. Переход по умолчанию JQuery показать / скрыть.

Теперь проблема, которую я, похоже, получаю, заключается в том, что карта Google отображается, когда этот $("#map-holder").hide('slow'); все еще работает, и вы видите проблески карты, прежде чем она прячется, а затем снова открывается, что вроде как бросает вызов эффект.

Таким образом, у кого-нибудь есть идеи, как я могу замедлить код, чтобы дождаться завершения функции hide, прежде чем делать остальное? (в идеале я не хочу использовать что-то жестко запрограммированное, например, setTimeout).

Заранее спасибо!

Шади

ОБНОВЛЕНИЕ 1

Я перезваниваю функцию hide, но она очень странно влияет на GMap. В Chrome / FF / Safari он отображает только небольшой сегмент в углу карты, когда он появляется. а в IE он полностью сбрасывается и центрируется в другом месте. GMap, похоже, не любит, когда его визуализируют в скрытом div.

Вы можете увидеть его здесь http://afid.staging.dante -studios.com / он находится спереди (просто нажмите кнопку воспроизведения в Азии или Африке, чтобы увидеть странный эффект).

Есть идеи, как решить эту проблему?

ОБНОВЛЕНИЕ 2 Попытка исправить проблему неправильной визуализации карты Google в скрытом элементе с помощью этого:

$(".map-overlay-left").click(function () {  
    $("#map-holder").hide('slow', function(){                                   
        var gmarkers = [];
        var side_bar_html = "";

        var map = new GMap2(document.getElementById('map-holder'));
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        var Africa = new GLatLng(-2.767478,23.730469);
        map.setCenter(Africa, 4);   

        $.get("http://afid.staging.dante-studios.com/xml-feed-google-maps",{},function(xml) {
            $('marker',xml).each(function(i) {
                html = $(this).text();
                lat = $(this).attr("lat");
                lng = $(this).attr("lng");
                label = $(this).attr("label");
                var point = new GLatLng(lat,lng);
                var marker = createMarker(point,label,html);
                map.addOverlay(marker);
            });
        });

    });
    $("#map-holder").show('slow');
    map.checkResize();
    map.setCenter(Africa, 4);   
});

Но, увы, неудача с методом map.checkResize();. Есть идеи?

Ответы [ 3 ]

4 голосов
/ 15 декабря 2009

Используйте обратный вызов .hide для выполнения вашей работы после завершения анимации:

$("#map-holder").hide('slow', function() {
  var gmarkers = [];
  var side_bar_html = "";      

  // ...

  $("#map-holder").show('slow');
})
1 голос
/ 15 декабря 2009

вам нужно добавить функцию обратного вызова в функцию скрытия, которая будет запускаться, когда она будет скрыта:

0 голосов
/ 09 июня 2016

Попробуйте этот ТАК ответ, если вы ищете ванильный JS.

События списка переходов различаются в разных браузерах, поэтому следующая функция найдет, какой слушатель использовать, и вернет правильный.

function whichTransitionEvent(){
    var t;
    var el = document.createElement('fakeelement');
    var transitions = {
      'transition':'transitionend',
      'OTransition':'oTransitionEnd',
      'MozTransition':'transitionend',
      'WebkitTransition':'webkitTransitionEnd'
    }

    for(t in transitions){
        if( el.style[t] !== undefined ){
            return transitions[t];
        }
    }
}

var transitionEnd = whichTransitionEvent();
element.addEventListener(transitionEnd, theFunctionToInvoke, false);

function theFunctionToInvoke(){
// set margin of div here
}
...