数组中音频的未定义错误

Posted

技术标签:

【中文标题】数组中音频的未定义错误【英文标题】:Undefined error for audio in array 【发布时间】:2013-08-02 23:11:04 【问题描述】:

我有一个图像 .png 文件数组和一个匹配的 .mp3 数组。单击图像应该通过将索引从一个数组传递到另一个数组来播放音频,但是最后一行出现“未定义”错误。

$(document).ready(function () 
    var starting_pics = ["CN.gif", "EN.gif", "GN.gif"];
    var starting_sounds = ["CN.mp3", "EN.mp3", "GN.mp3"];

    var i = 0;

    for (i = 0; i < starting_pics.length; i++) 
        $("<img/>").attr("src", "images/" + starting_pics[i]).load(function () 
            $(this).appendTo("#main");
            $(this).addClass("pics");
        );
    

    for (i = 0; i < starting_sounds.length; i++) 
        $("<audio/>").attr("src", "audio/" + starting_sounds[i]).load(function () 
            $(this).appendTo("#main");
            $(this).addClass("sound");
        );
    

    $("#main").on("click", ".pics", function () 
        var i = $(this).index();
        alert(i);
        $(".sound").get(i).play();
    );
);

【问题讨论】:

最后一行?你得更清楚 哈哈,我很快就阅读了您的评论和您的用户名,我想“哇,这太苛刻了”:) $(".sound").get(i).play(); 对该小提琴 here 的一些修改 - 它似乎工作得很好。 项目未正确附加,您不需要.load() 回调。 【参考方案1】:

使用.load()未正确附加元素,请进行以下修改。

for (i = 0; i < starting_pics.length; i++) 
  $("<img/>").attr("src", "" + starting_pics[i])
             .appendTo("#main")
             .addClass("pics");


for (i = 0; i < starting_sounds.length; i++) 
  $("<audio/>").attr("src", "" + starting_sounds[i])
               .appendTo("#main")
               .addClass("sound");

更新:

该版本的.load() 自 jQuery 1.8 起已弃用 - 使用 $("selector").on("load, func...。并确保在设置src 属性之前绑定load 事件 - 如果设置了`src,某些浏览器会立即触发load 事件,如果它已被缓存。

此外,&lt;audio&gt; 元素似乎没有load 事件。这就是为什么没有找到元素的原因 - load 事件从未执行过,因此没有附加它们。您要查看的事件是 canplaycanplaythrough,或者来自以下列表:https://developer.mozilla.org/en-US/docs/Web/Guide/DOM/Events/Media_events

【讨论】:

load 的要点是确保在将图像附加到 DOM 之前加载。我看不出这是如何解决任何问题的 @lan 如果您发现此答案不正确,请添加另一个全面的答案,我将非常乐意将其删除。 我不认为它不正确,只是它没有修复问题...它通过忽略它来规避它。这实际上取决于 OP 想要/想要什么......并且加载速度足够快,您可能不应该遇到代码问题。尽管如此,如果 OP 希望仅在加载元素后添加元素,则需要为图像侦听 load 事件,并为音频元素侦听 canplaythrough 事件(after 都设置了 src )。 使用.trigger("play") 而不是.get(i).play() 也可能有意义,因此它可以安全地尝试触发事件。如果音频元素未添加到 DOM,.get(i).play() 将抛出 OP 看到的错误 @lan 请继续添加您所说的作为答案。它看起来比我的好得多,我想这就是 OP 想要的。更不用说这可以防止任何可能发生的问题。

以上是关于数组中音频的未定义错误的主要内容,如果未能解决你的问题,请参考以下文章

nil:NilClass 的未定义方法“每个”,但我使用了实例变量

C++ SSE:存储到数组后的未定义行为

PHP包含文件中的未定义变量错误[重复]

MATLAB:mex-compile 上缺少框架 – 架构 x86_64 的未定义符号

超出数组最大索引的未定义行为

错误:使用 Sass 的 Angular 组件中的未定义变量