jQuery .live и WebKit терпят крах - PullRequest
1 голос
/ 16 апреля 2011

Я загружаю аудиоплееры динамически (через AJAX), что хорошо работает, проблема возникает, когда пользователь использует Safari или Chrome на Mac. Я не могу получить его сбой на FF на Mac или любого браузера Windows. Кажется, что живое событие вызывает проблему, но я готов ошибаться.

Интересно, сможет ли один из профессионалов jQuery разобраться в моем замешательстве, которое приводит к краху?

Этот "аудиоплеер HTML5" - это то, что загружается динамически.

$(function() {                      
    var stop = false;
    $(".loop").live('mousedown',function (event) {
        if (this.checked == false) {
            this.checked=true;
        }else {
            this.checked=false;
        }
    });
    $(".audioplayerHTML5").live('click',function (event) {
        if(navigator.userAgent.indexOf("Firefox") > 0) {
            playbutton = event.layerX < 31;
        }else if (navigator.userAgent.indexOf("Safari") > 0){
            playbutton = event.offsetX < 61;
        }else if (navigator.userAgent.indexOf("Chrome") > 0){
            playbutton = event.offsetX < 31;
        }
        video = $('.videoplayer').get(0);
        if (this.paused == false && playbutton) {
            if ($('#syncMusic').is(':checked') && video != undefined) {
                video.pause();
            }
            this.pause();
        //check for play button pressing on initial
        }else if (this.paused == true && playbutton) {
            if ($("#last_played").val() == 0){
                $("#last_played").val(this.id);
                if ($('#syncMusic').is(':checked') && video != undefined) {
                    video.play();
                }
                if ($('#playAudioBeginning').is(':checked')) {
                    this.currentTime = 0;
                }
                this.play();
            }else if ($("#last_played").val() != this.id) {
                audio = $('#'+$('#last_played').val()).get(0);

                if (audio == undefined){
                    $("#last_played").val(this.id);
                    if ($('#syncMusic').is(':checked') && video != undefined) {
                        video.play();
                    }
                    if ($('#playAudioBeginning').is(':checked')) {
                        this.currentTime = 0;
                    }
                    this.play();
                }else{
                    audio.pause();
                    $("#last_played").val(this.id);
                    if ($('#syncMusic').is(':checked') && video != undefined) {
                        if ($('#playFromBeginning').is(':checked') && video.paused == false) {
                            video.currentTime = $( "#sliderVideo" ).slider( "values", 0);
                        }else{
                            video.play();
                        }
                    }
                    if ($('#playAudioBeginning').is(':checked')) {
                        this.currentTime = 0;
                    }

                    this.play();
                }
            }else if ($("#last_played").val() == this.id){
                if ($('#syncMusic').is(':checked') && video != undefined) {
                video.play();
                }
                if ($('#playAudioBeginning').is(':checked')) {
                this.currentTime = 0;
                }
                this.play();
        }

    }
    });

Ответы [ 2 ]

4 голосов
/ 16 апреля 2011

Почему вы проверяете event.layerX для FF, но event.offsetX для WebKit?jQuery нормализует все свойства событий, поэтому вам не нужно проверять разные свойства для разных браузеров.

Кроме того, если вы попытаетесь прослушать пользовательский агент,и вы уже используете jQuery, для этого используйте jQuery :

if($.browser.mozilla) {
    playbutton = event.layerX < 31;
}else if ($.browser.safari){
    playbutton = event.offsetX < 61;
}else if ($.browser.webkit){
    playbutton = event.offsetX < 31;
}

Редактировать

Там много местадля улучшения в этом коде.Вот пример того, как это исправить.

$(function() {
    $('.loop').live('mousedown', function() {
        this.checked = !this.checked;
    });

    $('.audioplayerHTML5').live('click', function(event) {
        var audio,
            playbutton, 
            video = $('.videoplayer').get(0),
            $syncMusic = $('#syncMusic'),
            $last_played = $('#last_played'),
            $playAudioBeginning = $('#playAudioBeginning'),
            $playFromBeginning = $('#playFromBeginning'),
            $sliderVideo = $('#sliderVideo');

        if ($.browser.mozilla) {
            playbutton = event.layerX < 31;
        } else if ($.browser.safari) {
            playbutton = event.offsetX < 61;
        } else if ($.browser.webkit) {
            playbutton = event.offsetX < 31;
        }

        if (!playbutton) return;

        if (!this.paused) {
            if ($syncMusic.is(':checked') && video) {
                video.pause();
            }
            this.pause();
            //check for play button pressing on initial
        } else if (this.paused) {
            if (!$last_played.val()) {
                $last_played.val(this.id);
                if ($syncMusic.is(':checked') && video) {
                    video.play();
                }
                if ($playAudioBeginning.is(':checked')) {
                    this.currentTime = 0;
                }
                this.play();
            } else if ($last_played.val() !== this.id) {
                audio = $('#' + $last_played.val()).get(0);

                if (!audio) {
                    $last_played.val(this.id);
                    if ($syncMusic.is(':checked') && video) {
                        video.play();
                    }
                    if ($playAudioBeginning.is(':checked')) {
                        this.currentTime = 0;
                    }
                    this.play();
                } else {
                    audio.pause();
                    $last_played.val(this.id);
                    if ($syncMusic.is(':checked') && video) {
                        if ($playFromBeginning.is(':checked') && !video.paused) {
                            video.currentTime = $sliderVideo.slider('values', 0);
                        } else {
                            video.play();
                        }
                    }
                    if ($playAudioBeginning.is(':checked')) {
                        this.currentTime = 0;
                    }

                    this.play();
                }
            } else if ($last_played.val() == this.id) {
                if ($syncMusic.is(':checked') && video) {
                    video.play();
                }
                if ($playAudioBeginning.is(':checked')) {
                    this.currentTime = 0;
                }
                this.play();
            }
        }
    });

Различная очистка

  • .live('mousedown', ...) можно записать намного проще
  • Кэшировать объекты jQuery, это более эффективно
  • Быть совместимым с разделителями строк;не смешивать и сочетать одинарные и двойные кавычки
  • Несколько пропущенных ключевых слов var (=> объявление глобальных переменных, что плохо плохо )
  • Нетнужно проверить video != undefined, просто проверить достоверность video
  • Серьезно, прекратить проверку, если логическое значение равно true или false, просто проверить его истинность
  • Удалите неиспользуемые переменные (а именно stop и event)
  • Используйте return операторов (разумно), чтобы уменьшить чрезмерные if...else вложенные и избыточные проверки

Нерешенные вопросы

  • Являются ли .loop флажками?Если это так, откажитесь от обработчика .live('mousedown', ...).Это совершенно лишнее.
  • Что со всеми этими проверками UA, что должно происходить в IE?

Давайте поговорим

Этот метод чертовски велик.Разбейте его на ряд более мелких, более управляемых функций.Например, вы можете превратить этот фрагмент кода:

if (!this.paused) {
    if ($syncMusic.is(':checked') && video) {
        video.pause();
    }
    this.pause();
    //check for play button pressing on initial
}

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

if (!this.paused) {
    pause(this, $syncMusic.is(':checked') ? video : null);
}

, где pause - следующая функция:

function pause(vidA, vidB) {
    if (vidB) {
        vidB.pause();
    }
    vidA.pause();
}
1 голос
/ 18 апреля 2011

Решено из-за сбоя с использованием добавления кода Matt Balls плюс добавление

this.play();

После

} else if (this.paused) {

И до

if (!$last_played.val()) {

Также настройка preload = "none"для аудиоплеера.this.play () загружает дорожку, по которой щелкнули.

Мэтт, еще раз спасибо за тяжелую работу, ясность и совместную работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...