javascript - 不能直接将 [audio].play() 作为 jQuery 回调

标签 javascript jquery html callback html5-audio

考虑这段代码:

var music = $("audio")[0];
//doesn't work
$("#pbutton").click(music.play);
//works
$("#pbutton").click(function(){music.play()});

不起作用的行在 Firefox 中返回此错误:

TypeError: 'play' 在未实现接口(interface) HTMLMediaElement 的对象上调用。

我是不是漏掉了什么?为什么这行不通?

更新:我做了一个fiddle为此。

最佳答案

其实很简单。 I've updated your fiddle显示它。

var x = {
    play: function()
    { 
        console.log(this);
    }
};

$(document).ready(function()
{
    var music = document.getElementById("song");

    $("#play").click(function()
    {
        x.play();
    });

    $("#play").click(x.play);

    $("#pause").click(music.pause);
});

查看代码和您的开发人员控制台。在第一个点击处理程序中,您调用对象 x 的函数 play。由于是“正常”调用,函数中的 thisx 对象,这是正确的。

作为您的第二个点击处理程序,您直接指向x.play 函数。但是因为 jQuery 维护您用作点击处理程序的函数的 this 上下文,所以函数中的 this 现在是播放按钮。

现在,如果你的播放函数中的某些东西使用了this-variable,你会得到错误(因为在你的play函数中你假设this 是您的 x-object)。这就是为什么您经常必须将匿名函数包装在无参数函数调用周围以使其工作的原因。

关于javascript - 不能直接将 [audio].play() 作为 jQuery 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27476999/

相关文章:

javascript - JS中 "value != value"是什么意思?

jquery - xVal 与 ASP.Net MVC 验证工具包?

php - 如何从动态生成的 html 表中删除选定的列?

javascript - 如何检测ajax错误是Access-Control-Allow-Origin还是文件确实丢失

java - 限制嵌入式 Jetty 中的上传大小

html - img 缩放到 div 内的视口(viewport)

javascript - 在特定字符处分割字符串

javascript - jquery:将变量设置为从ajax调用返回的数据

javascript - 球在不同大小的 Canvas 中弹跳 javascript

jquery - 将选项添加到第二位的选择元素