为了账号安全,请及时绑定邮箱和手机立即绑定

document.getElementById().value 没有返回正确的值

document.getElementById().value 没有返回正确的值

繁星淼淼 2021-12-12 09:54:02
我正在尝试在 Pepper 机器人的平板电脑上创建一个输入字段,允许用户通过语音输入他们的电子邮件地址。我使用语音识别框来获取用户所说的字母并引发一个事件,以便 Javascript 可以捕获它并修改文本。但似乎“document.getElementById("abc").value”永远不会得到当前屏幕上的内容,而是默认值。示例:我说“1”,它显示“hello1”(非常好)。然后我说“2”,它显示“hello2”(期待“hello12”)这是我的 JS 代码:var session = new QiSession(function(session) {            // "Connection esterblished!";          }, function() {            // "Could not connect to the robot";          });// Subscribe to ALMemory Service   session.service("ALMemory").then(function(ALMemory) {  // "ALMemory proxy subscription successful!";    ALMemory.getData('voice_input').then(function(voice_input){          document.getElementById("abc").value += voice_input;          });});HTML代码:<input type="text" name="email" id="abc" value="hello">与“会话”有什么关系?因为即使我使用全局变量来存储语音输入,我也只能修改这个变量的值而不能在函数内部获取这个变量的当前值(我能得到的是初始化值)。
查看完整描述

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

document.getElementById()没有任何问题。问题是你必须对语音输入做出反应,而不仅仅是获取当前的语音输入。这是通过订阅 ALMemory 事件来完成的。以下是大致适用于您的情况的教程片段(但未经测试):


session.service("ALMemory").then(function (ALMemory) {

  ALMemory.subscriber("voice_input").then(function (subscriber) {

    subscriber.signal.connect(function (state) {

      document.getElementById("abc").value += voice_input;

    });

  });

});

请注意,要工作,您必须"voice_input"使用ALMemory.raiseEvent在键上发布事件。


查看完整回答
反对 回复 2021-12-12
?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

不幸的是,我无法找到有关 JavaScript API 的适当公共文档。然而,这是我能找到的。


看来您正在使用承诺作为事件侦听器。Promise 触发一次,而事件侦听器重复触发。您正在使用他们所说的调用(承诺)而不是信号(事件)。如果您有关于信号的文档,我会改用它们,因为它们更类似于您要执行的操作。否则,您可以执行以下操作:


var session = new QiSession(function(session) {

    // "Connection esterblished!";

    // Subscribe to ALMemory Service

    session.service("ALMemory").then(function(ALMemory) {

        // "ALMemory proxy subscription successful!";

        function getVoice() {

            ALMemory.getData('voice_input').then(function(voice_input){

                document.getElementById("abc").value += voice_input;

                getVoice();

            });

        }

        getVoice();

    });

}, function() {

    // "Could not connect to the robot";

});

首先,我将服务订阅者移动到 QiSession 成功连接的回调中,因为这通常是在异步函数调用中定义会话的地方。当 ALMemory 被订阅时,它定义并调用 getVoice,它检索用户的语音,附加到该字段,然后再次运行 getVoice 以将另一个收听排队。您可能希望添加一个条件以最终停止它。如果 Pepper 支持这一点,也可能值得研究 async/await,因为这样您就可以使用 while 循环轻松地做到这一点。


查看完整回答
反对 回复 2021-12-12
  • 2 回答
  • 0 关注
  • 295 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信