一键运行 Javascript 2 个函数

2024-02-16

我使用从网上下载的 HTML 和 JS 代码来录制音频,但有一个问题,因为页面加载到屏幕上后立即出现允许麦克风的消息。正是因为window.onload = function init()在源代码record.js中。但我想在单击按钮后显示消息。

因此,我尝试使用此按钮调用两个函数 -toggleRecording(button) and init()但是“button”元素有问题,所以它不起作用,但我认为如果它以良好的形式编写,它可以起作用。你能举例说明如何修改这两个函数吗init and toggleRecording被这个按钮调用?我是 JS 新手,不知道它到底是如何工作的。

索引.html

<button type="submit" onclick="toggleRecording()" data-run="0"></button>

记录.js

//starts by click on button
  function toggleRecording() {
    var run = parseInt(getAttribute('data-run')); //

      if(run === 1) {
      recorder && recorder.stop();
      recorder && recorder.exportWAV(function(blob) {
        uploadAudioFromBlob(blob);
      });
      __log('Recording is  stopped.');
      button.setAttribute('data-run', 0);

    } 

    else {
      recorder && recorder.clear();
      recorder && recorder.record();
      __log('Speak...');
      button.setAttribute('data-run', 1);
    }
  }

  function __log(e, data) {     
showInfo("\n" + e + " " + (data || ''));  
  }

  var audio_context;
  var recorder;
  function startUserMedia(stream) { 
    var input = audio_context.createMediaStreamSource(stream); 
    recorder = new Recorder(input); 
    __log('Systém for recording is available.'); 
  }

  function startRecording(button) {   
    recorder && recorder.clear(); 
    recorder && recorder.record(); 
    button.nextElementSibling.disabled = false;
    __log('Talk...'); 
  }

   window.onload=function init() {
    try { 
      window.AudioContext = window.AudioContext || window.webkitAudioContext; 
      navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;   
      window.URL = window.URL || window.webkitURL;      
      audio_context = new AudioContext;      
    } catch (e) { 
      alert('This browser do not support audio!');
    }    
    navigator.getUserMedia({audio: true}, startUserMedia, function(e) {
      __log('No audio was detected: ' + e);
    });
  };

UPDATE:现在该系统按以下步骤运行: 1.function init()页面加载后且用户允许麦克风后立即运行startusermedia函数运行 2.点击按钮后运行toggleRecording(button)开始录音的功能 3.第二次点击按钮运行toggleRecording停止录音功能

如果可能的话,我想按以下步骤操作该系统: 1.首先点击按钮运行功能init and startusermedia and togglerecording因此单击后将立即开始录制 2.第二次点击会调用toggleRecording停止录音功能


它不起作用,因为init()实际上是一个附加到的变量window.onload。尝试删除window.onload=function init()并将其替换为function init()(因此页面加载时它不再运行),然后调用:

<button type="submit" onclick="init();toggleRecording()" data-run="0"></button>

当您设置这样的事件处理程序时,您甚至不需要为函数命名。就像是window.onload = function() { ... }是完全有效的 - 他们被称为匿名函数。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#Function_constructor_vs._function_declaration_vs._function_expression

我还注意到一些实施问题toggleRecording(),所以我也尽力解决这些问题。getAttribute()当然,需要一个元素,所以我们可以使用传递按钮this,并将其接收到toggleRecording() as the button多变的。

您的完整代码现在是:

//starts by click on button
function toggleRecording(button) {
  var run = parseInt(button.getAttribute('data-run')); //

  if (run === 1) {
    recorder && recorder.stop();
    recorder && recorder.exportWAV(function(blob) {
      uploadAudioFromBlob(blob);
    });
    __log('Recording is  stopped.');
    button.setAttribute('data-run', 0);

  } else {
    recorder && recorder.clear();
    recorder && recorder.record();
    __log('Speak...');
    button.setAttribute('data-run', 1);
  }
}

function __log(e, data) {
  //TODO: Uncomment this, I have it commented so there are no errors in the StackSnippet
  //showInfo("\n" + e + " " + (data || ''));
  console.log(e.data);
}

var audio_context;
var recorder;

function startUserMedia(stream) {
  var input = audio_context.createMediaStreamSource(stream);
  recorder = new Recorder(input);
  __log('Systém for recording is available.');
}

function startRecording(button) {
  recorder && recorder.clear();
  recorder && recorder.record();
  button.nextElementSibling.disabled = false;
  __log('Talk...');
}

function init() {
  try {
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia;
    window.URL = window.URL || window.webkitURL;
    audio_context = new AudioContext;
  } catch (e) {
    alert('This browser do not support audio!');
  }
  navigator.getUserMedia({
    audio: true
  }, startUserMedia, function(e) {
    __log('No audio was detected: ' + e);
  });
};
<button onclick="init(); toggleRecording(this)">Click me</button>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一键运行 Javascript 2 个函数 的相关文章

随机推荐

  • 如何让django使用电子邮件而不是用户名注册用户

    我正在尝试创建一个使用名字 姓氏 电子邮件和密码注册用户的网站 我尝试编写此表单并在视图中使用它 from django import forms from django contrib auth models import User fr
  • 在循环的括号内定义循环变量可以吗?

    我对 C 很陌生 但在 C 方面有很多经验 我的大学老师告诉我 在 纯 C 中 初始化循环变量是错误的 在循环括号内 他说是因为VS编译器才运行的 由于某些原因 演示文稿中的所有材料还显示了循环 其循环变量在括号之外声明 for int i
  • C# Selenium:单击 iframe 下的按钮

    我的网站下有一个 iframe 模式 我正在尝试单击按钮 但我无法这样做 下面是我的代码 请告诉我 我错过了什么 driver SwitchTo Frame driver FindElement By Id iframeid frame n
  • 如何从没有上下文的类中调用 getResources() ?

    在我的申请中 我有很多课程和活动 Droid 是一个没有上下文的类 Mygame 是一个扩展 SurfaceView 并实现 SurfaceHolder Callback 的类 我正在 mygame 类中创建一个 Droid 对象 并为其设
  • Android Spinner 上的多个 AsyncTasks 问题

    我收到一些错误 我知道问题是什么 但我不知道如何解决 我有4个旋转器 每个微调器都关联一个异步任务 简而言之 当我在 spinner1 上选择一项时 执行填充 spinner2 的第二个 asynctask 所选项目作为参数添加到第二个 a
  • C# 找不到网络路径

    我在通过网络将文件写入远程目录时遇到问题 当我尝试检查目录是否存在时 以下代码失败 if Directory Exists processingPath Directory CreateDirectory processingPath 处理
  • docker 在应该使用 v2 时却使用了 v1 注册表 api

    我正在尝试使用自托管 docker 注册表 v2 我应该能够推送 docker 映像 该映像在运行registry v2 容器的主机服务器 coreos 上本地工作 但是 在另一台机器 也是 coreos 相同版本 上 当我尝试推送到注册表
  • 使用 C# 中的静态类通过事件通知其他订阅者的简单状态机

    我一直在尝试为我的应用程序编写一个简单的静态类状态机 以便在系统状态更改时通知其他控件和代码 我想我几乎已经解决了 但我遇到了一个小问题 我不知道如何解决 这是代码 An enum denoting the 3 States public
  • 使用 Peewee 库批量更新

    我正在尝试使用更新表内的许多记录Peewee图书馆 里面一个for循环 我获取一条记录 然后更新它 但这在性能方面听起来很糟糕 所以我需要批量更新 当前代码如下所示 usernames to update get target userna
  • Android Firebase:设置值不起作用

    我正在尝试通过以下代码向 Firebase 数据库添加测试值 FirebaseDatabase database FirebaseDatabase getInstance DatabaseReference ref FirebaseData
  • 函数式 JavaScript:避免参数突变的良好实践?

    这是一个相当普遍的问题 函数式编程提倡这样的想法 程序是通过函数转换数据 并且应该避免突变 函数内可能除外 函数内被视为抽象的基本单元 但在这个程序中 function foo bar bar k1 bananas return bar v
  • 如何导入子目录中的模块,从而导入同一子目录中的另一个模块?

    在我导入的模块中 我尝试导入位于同一目录中的另一个模块 我的文件看起来像这样 project main py app foo py bar py main py import app foo as Foo foo py import bar
  • UnityWebRequest 在 iOS 中不工作

    给出的例子https docs unity3d com Manual UnityWebRequest html https docs unity3d com Manual UnityWebRequest html正如预期的那样 可以在 Wi
  • 为什么我们在使用Ajax控件时总是需要脚本管理器?

    为什么我们在使用Ajax控件时总是需要脚本管理器 脚本管理器控件是将脚本发送到客户端的控件 该控件是所有 AJAX 相关功能的核心 它管理启用 Ajax 的页面中的所有控件 它还确保部分页面更新按预期发生 http msdn microso
  • 如何从任何 Docker 存储库中提取单个映像?

    docker 存储库包含多个镜像 是否可以从存储库中提取特定图像 当我使用时 docker pull ubuntu 它会下载大约 8 10 个不同版本的 ubuntu 如果有标记的特定图像 您可以使用 tag 或 t 运算符来提取您要查找的
  • Android 加速度计过滤?

    我看到了许多关于过滤加速度计值以抵消重力 高通滤波器 的示例 但其中大多数都是一阶一阶 据说很简单 但是滞后 而且不是最好的 尽管我对滤波器或 DSP 一无所知 这里有人说有更好的解决方案用于DSP来感知运动 遗憾的是 我什至无法想象它会是
  • 无法将 JSON 对象插入 Firebase 实时数据库

    我正在尝试将用户数据存储在我的 Firebase 数据库中 这是我处理 onClick 并将数据发送到数据库的代码 public void onClickStore final View view String name binding g
  • 停止观察reactjs中的文件夹变化

    我正在开发一个反应项目 用户可以在其中上传文件 我面临的问题是当我将文件上传到服务器并将该文件保存到位于公共文件夹中的名为 uploads 的文件夹中时 然后当此过程完成页面刷新 这是因为应用程序正在监视任何更改并刷新页面 我知道我可以通过
  • 尽管安装并加载了 reshape2,但仍找不到功能“cast”

    跟随哈德利 威克姆 Hadley Wickham 探索数据和模型的实用工具 http had co nz thesis 2 4 节中的示例 铸造熔融数据我越来越Error could not find function cast 我已经安装
  • 一键运行 Javascript 2 个函数

    我使用从网上下载的 HTML 和 JS 代码来录制音频 但有一个问题 因为页面加载到屏幕上后立即出现允许麦克风的消息 正是因为window onload function init 在源代码record js中 但我想在单击按钮后显示消息