我正在使用records audio in the browser的小型库并将其上传到服务器,但是希望为用户提供单击按钮后就可以上传到浏览器的选项。

大多数库都导入到html页面,因此我要调用的函数及其参数在页面上不可用。

在调用“上传”函数的函数中,我尝试将函数调用分配给onclick事件:

document.getElementById("clickMe").onclick = endFile(buf, 'mp3');


HTML是:

<a href='#' id="clickMe" class="btn btn-default">Upload</a>


我猜这是过早触发,因为该功能正在“评估”中。该库使用jQuery,我尝试将e.preventDefault()e.stopPropagation()添加到外部函数中,但这两个都不起作用。

注意,当我分配一个匿名函数时,它没有被调用,因此使用:

document.getElementById("clickMe").onclick = function(){
        endFile(buf, 'mp3');
        }


这似乎正在工作。有人可以解释一下原因,并且一定要让我知道为什么这可能是不明智的方法。

最佳答案

函数过早触发的原因是,当您打算分配它时,实际上是在调用它。

改变这个...

document.getElementById("clickMe").onclick = endFile(buf, 'mp3');


为此...

document.getElementById("clickMe").onclick = function() {
  endFile(buf, 'mp3');
};


或这个...

document.getElementById("clickMe").onclick = endFile.bind(this, buf, 'mp3');


为了进一步解释-endFile(buf, 'mp3')实际上调用了该函数。因此,不是将您的函数分配为onclick-handler,而是对其进行调用并分配其返回值。

10-08 08:42