Как исправить проблему с событием нажатия на элемент bxSlider в Chrome 73? - PullRequest
8 голосов
/ 28 марта 2019

Событие щелчка по внутреннему элементу bxSlider не срабатывает после обновления Chrome до версии 73. Как вызвать событие .on ('click') для элементов в новом Chrome?

Он срабатывает в Chrome, когда движутся слайды. Все хорошо в FireFox

<div class="slider-pager">
  <div class="slider-pager__item"><img src="1.jpg" alt=""></div>
  <div class="slider-pager__item"><img src="2.jpg" alt=""></div>
</div>

<script>
        carouselProduct = $('.slider-pager').bxSlider({
            maxSlides:  3,
            minSlides: 3,
            slideWidth: 90,
            infiniteLoop: false,
            moveSlides: 1,
            slideMargin: 8,
            pager: false,
            nextSelector: '.slider__nav--next',
            prevSelector: '.slider__nav--prev',
            nextText: '→',
            prevText: '←'

        });
  $('.slider-pager__item').on('click', function (event) {
    //Don't fire in Chrome 73, works in FireFox
            $('.slider-pager__item').removeClass('active');
            $(this).addClass('active');

        });
</script>

JS Fiddle https://jsfiddle.net/sergey_beloglazov/3ty7w12z/17/

UPDATE: Я сделал обходной путь для этого слайдера, обрабатывая событие оболочки onClick:

$('.slider-pager').parent().on('click', function (event) {
    var $hover_item = $('.slider-pager__item:hover');
    //Checking if we have found the element
    if ($hover_item.length>0){
        selectBxPagerItem($hover_item);
    }
});

$('.slider-pager__item').on('click', function (event) {
    selectBxPagerItem($(this));
});

selectBxPagerItem () - это функция выбора. Для ползунка с цветной коробкой на клике я сделал похожую эмуляцию клика:

        $('.slider-for').parent().on('click', function (event) {
            var $hover_item = $('.slider-for__item:hover a');
            if (($hover_item.length>0)&&(!window.slider_for_click_imitation)){
                window.slider_for_click_imitation=true;
                $hover_item.click();
            }
            window.slider_for_click_imitation=false;
        });

ОБНОВЛЕНИЕ 2019.07.20: Недавно я узнал, что предыдущее решение не работает сейчас. Я проверил это и обнаружил, что внутренние элементы не имеют состояния : hover ; Итак, есть еще один источник с mouseover event

/* A Chrome bx slider bug workaround */

//A slide, that has the mouse pointer over
window.bxslider_mouse_over_slide=null;
$(function() {
    $('.slider-pager div').mouseover(
        function(event) {
            window.bxslider_mouse_over_slide=$(this);
        });

});
$('.slider-pager').parent().on('click', function (event) {
    //Check if we've got a slide under the mouse
    if ((window.bxslider_mouse_over_slide!=null)){
            $('.slider-pager__item').removeClass('active');
        window.bxslider_mouse_over_slide.addClass('active');
    }
});

Обходя путь, я обнаружил, что когда я нажимаю на баннер, срабатывает событие mouseover , и только тогда оно обрабатывает событие щелчка. Так что в этот момент слайд не имеет состояния : hover . Так что я просто сохраняю последний зависший баннер. Проверьте решение: https://jsfiddle.net/sergey_beloglazov/5kmdacgn/22/

Ответы [ 2 ]

9 голосов
/ 29 марта 2019

Похоже, что последнее обновление Chrome сделало любой щелчок внутри bxSlider нацеленным на контейнер вместо ссылки внутри него.

Добавление touchEnabled: false к параметрам отключает поведение смахивания, но решает проблему щелчка. Eg.:

 carouselProduct = $('.slider-pager').bxSlider({
            maxSlides:  3,
            minSlides: 3,
            slideWidth: 90,
            infiniteLoop: false,
            moveSlides: 1,
            slideMargin: 8,
            pager: false,
            nextSelector: '.slider__nav--next',
            prevSelector: '.slider__nav--prev',
            nextText: '→',
            prevText: '←',
            touchEnabled: false
        });

Я рекомендую следить за новостями и лучшими решениями в этой ветке: https://github.com/stevenwanderski/bxslider-4/issues/1240

2 голосов
/ 04 апреля 2019

Вместо этого я использовал событие mousedown

if(window.navigator.userAgent.toLowerCase().indexOf("chrome") > 0) {
    $("body").on("mousedown", ".bx-viewport a", function() { 
        if($(this).attr("href") && $(this).attr("href") != "#") {
            window.location=$(this).attr("href"); 
        } 
    }); 
}
...