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

时间:2019-10-31 16:29:26

标签: javascript pepper

我正在尝试在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 个答案:

答案 0 :(得分:0)

不幸的是,我无法在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循环。

答案 1 :(得分:0)

document.getElementById()没有任何问题。 问题是您必须反应进行语音输入,而不仅要获取当前的语音输入。这是由subscribing to the ALMemory event完成的。 这是本教程的片段,大致适合您的情况(但未经测试):

session.service("ALMemory").then(function (ALMemory) {
  ALMemory.subscriber("voice_input").then(function (subscriber) {
    subscriber.signal.connect(function (state) {
      document.getElementById("abc").value += voice_input;
    });
  });
});

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