You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用HTML图片映射播放音频且不跳转至新页面

如何使用HTML图片映射播放音频且不跳转至新页面

嘿,我懂你现在的困扰——用图片映射做了游戏音效按钮,结果一点击就跳转到播放音频的页面,完全不是想要的「点击即播」的本地效果对吧?别慌,咱们只需要给代码加一点JavaScript逻辑,就能拦截默认的跳转行为,直接在当前页面播放音频。

问题根源

你原来的代码里,<area>标签的href直接指向了音频文件,浏览器的默认行为就是导航到这个资源地址,所以才会跳走。咱们要做的就是阻止这个默认行为,改用JS来触发音频播放。

修改后的完整代码

<!DOCTYPE HTML>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Jukebox Web Site</title>
</head>
<body>
    <center>
        <map name="image-map">
            <img src="jukebox.png" usemap="#image-map" alt="游戏音效点唱机">
            <!-- 把href改成#,添加data-sound属性存储音频路径 -->
            <area target="" alt="1up" title="1up" href="#" data-sound="1up.mp3" coords="169,197,192,219" shape="rect">
            <area target="" alt="Brick" title="Brick" href="#" data-sound="brick.mp3" coords="199,199,222,221" shape="rect">
            <area target="" alt="Coin" title="Coin" href="#" data-sound="coin.mp3" coords="229,198,253,220" shape="rect">
            <area target="" alt="flagpole" title="flagpole" href="#" data-sound="flagpole.mp3" coords="259,197,283,220" shape="rect">
            <area target="" alt="gameover" title="gameover" href="#" data-sound="gameover.mp3" coords="290,197,313,218" shape="rect">
            <area target="" alt="kick" title="kick" href="#" data-sound="kick.mp3" coords="320,197,344,219" shape="rect">
        </map>
    </center>

    <script>
        // 1. 获取所有图片映射的area元素
        const soundAreas = document.querySelectorAll('map[name="image-map"] area');
        
        // 2. 给每个area绑定点击事件
        soundAreas.forEach(area => {
            area.addEventListener('click', function(event) {
                // 关键:阻止浏览器默认的跳转行为
                event.preventDefault();
                
                // 3. 获取当前area对应的音频路径
                const soundPath = this.getAttribute('data-sound');
                
                // 4. 创建Audio对象并播放音频
                const audio = new Audio(soundPath);
                audio.play().catch(err => {
                    // 处理播放失败的情况(比如浏览器自动播放限制)
                    console.error('音频播放失败:', err);
                });
            });
        });
    </script>
</body>
</html>

核心修改点解析

  • 替换href并添加data-sound:把原来指向音频的href改成#(避免空href的默认行为),新增data-sound自定义属性来存储音频文件路径——这样既保留了语义,又能让JS轻松拿到要播放的资源。
  • 拦截默认行为:event.preventDefault()是关键!它告诉浏览器「不要执行你原本要做的跳转操作」。
  • 用JS播放音频:通过new Audio(soundPath)创建音频对象,调用play()方法直接在当前页面播放。

额外优化建议(可选)

如果想让体验更流畅,还可以做这些小改进:

  • 复用音频对象:可以提前把所有音频对象创建好,点击时直接调用play(),避免每次点击都新建对象,比如:
    // 提前缓存所有音频对象
    const soundCache = {};
    soundAreas.forEach(area => {
        const soundPath = area.getAttribute('data-sound');
        soundCache[soundPath] = new Audio(soundPath);
    });
    
    // 点击时直接播放缓存的音频
    area.addEventListener('click', function(event) {
        event.preventDefault();
        const soundPath = this.getAttribute('data-sound');
        soundCache[soundPath].currentTime = 0; // 重置播放进度,支持连续点击重复播放
        soundCache[soundPath].play().catch(err => console.error(err));
    });
    
  • 处理浏览器自动播放限制:现在很多浏览器要求用户和页面有交互后才能播放音频,咱们的代码已经是点击触发,所以大部分情况没问题,但如果遇到播放失败,可以加个提示给用户。

备注:内容来源于stack exchange,提问作者elfuegoeggo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 12:13:05