【问题标题】:Why does this if statement not work?为什么这个 if 语句不起作用?
【发布时间】:2013-03-27 23:37:01
【问题描述】:

我有一些 div,当单击链接时,我使用 jQuery 的淡入/淡出将其带到页面上。每个页面都有一个关联的 html5 音频元素,该元素也会相应地淡入/淡出。

$('.link').on('click', function(e){
    var targetpage = $($(this).attr("href"));
    $('.pagecontainer>div').fadeOut(0); //fade out currently displayed page
    targetpage.fadeIn(); //fade in page associated with link
    if (targetpage.children().hasClass('backgroundmusic')) {
        $('audio').animate({volume: 0}, 1000); //fade out currently playing audio
        alert('audio faded out');
        $.each($('audio'), function () { //stop all audio
            this.currentTime=0;
            this.pause();
            alert('audio stopped');
        });
        alert('stop function executed');
    }
});

$('.sound').on('play', function () { //since volume was faded out, reset volume when click play button
    $('audio').animate({volume: 1}, 100);
});

HTML:

<a href="#page1" class="link">Audio 1</a>
<a href="#page2" class="link">Audio 2</a>
<a href="#page3" class="link">Audio 3</a>

<div class="pagecontainer">

<div id="page1"> //all three audio elements are in exact same spot
                 //clicking page link fades in current audio and fades in new one
    <div class="backgroundmusic">
    <audio controls loop class="sound" preload="none">
        <source src="../../site/music/music1.mp3"/>
        <source src="../../site/music/music1.ogg"/>
    </audio>
    </div>
</div>

<div id="page2">
    <div class="backgroundmusic">
    <audio controls loop class="sound" preload="none">
        <source src="../../site/music/music2.mp3"/>
        <source src="../../site/music/music2.ogg"/>
    </audio>
    </div>
</div>

<div id="page3">
    <div class="backgroundmusic">
    <audio controls loop class="sound" preload="none">
        <source src="../../site/music/music3.mp3"/>
        <source src="../../site/music/music3.ogg"/>
    </audio>
    </div>
</div>

</div>

“alert('audio faded out')”将执行,但“alert('audio stopped')”不执行,因为它没有运行“$.each($( 'audio'), function”脚本,“alert('stop function executed')”也没有。我必须使用这个“each”脚本,因为 $('audio').currentTime=0 不起作用,也没有$('audio').pause(),因为我的页面上有多个音频实例。

有谁知道为什么这不起作用?

谢谢。

【问题讨论】:

    标签: javascript jquery html audio


    【解决方案1】:

    您将e 传递给您的函数,但不要使用它。可能想要阻止该点击事件的默认操作。

    e.preventDefault(); //Put this at the top of the callback
    

    这应该可以解决您的 .each() 问题。此外,您应该使用控制台而不是警报,以免冻结您的页面。

    console.log('audio faded out'); //Use console instead of alerts
    $('audio').each(function () { //Do it this way.
        this.currentTime=0;
        this.pause();
        console.log('audio stopped');
    });
    console.log('stop function executed');
    

    【讨论】:

    • 谢谢,但没用。我发现只有 page1 上的音频正确停止。 Page2 和 3 似乎不适用于该脚本。有人告诉我,这可能与您无法停止/暂停/重置尚未加载的音频有关,并且由于某种原因,DOM 中首先出现的任何音频元素都会加载...仍在寻找修复这个。我不能让所有这些都自动加载(即删除preload="auto"),这会导致谷歌浏览器挂起,因为我的网站上有 20 个 mp3/ogg 试图同时加载。
    • 您可以将它们设置为在队列中加载。如果您将 AJAX 之类的东西与 jQuery 的内置队列一起使用,您可以异步加载所有这些 - 一次一个。没有挂起,只是一声巨响。
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多