Javascript document.getElementById()。值不为';t返回正确的值

Javascript document.getElementById()。值不为';t返回正确的值,javascript,pepper,Javascript,Pepper,我正在尝试在Pepper robot平板电脑上创建一个输入字段,允许用户通过语音输入他们的电子邮件地址。我使用语音识别框获取用户所说的字母,并引发一个事件,以便Javascript能够捕获它并修改文本。但是“document.getElementById(“abc”).value”似乎永远不会得到屏幕上当前显示的内容,而是defaut值 例如: 我说“1”,它显示“hello1”(非常好)。 然后我说“2”,它显示“hello2”(期待“hello12”) 以下是我的JS代码: var sess

我正在尝试在Pepper robot平板电脑上创建一个输入字段,允许用户通过语音输入他们的电子邮件地址。我使用语音识别框获取用户所说的字母,并引发一个事件,以便Javascript能够捕获它并修改文本。但是“document.getElementById(“abc”).value”似乎永远不会得到屏幕上当前显示的内容,而是defaut值

例如: 我说“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">


这和“会议”有什么关系吗?因为即使我使用一个全局变量来存储语音输入,我也只能修改这个变量的值,但不能在函数中得到这个变量的当前值(我能得到的是初始化值)

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

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

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循环轻松地完成这项工作。

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

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

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循环轻松地实现这一点。

这并没有什么问题。 问题是您必须对语音输入做出反应,而不仅仅是获取当前的语音输入。这是由我们自己完成的。 以下是本教程的片段,大致适合您的案例(但未经测试):


请注意,要工作,您必须在
“voice\u input”
键上发布事件,使用。

没有问题。 问题是您必须对语音输入做出反应,而不仅仅是获取当前的语音输入。这是由我们自己完成的。 以下是本教程的片段,大致适合您的案例(但未经测试):


请注意,要工作,您必须在
“voice_input”
键上发布一个事件,使用。

谢谢,我测试了您的方法,但当我说“1”时,会显示“Hello111111…”。嗯,你是说听众有问题吗?但我的问题是它确实在听(您可以再次查看我的示例),但是“document.getElementById(“abc”).value”永远无法获取当前屏幕上的内容。即使一封信已经被捕获并显示在屏幕上(例如“hello1”),它也会一直获取defaut值(“在我的例子中是hello”)。对不起,我一定是误解了这个问题。我怀疑用于网页的呈现程序错误地从属性而不是从实际输入文本中读取值。可以尝试从HTML中的文本框中删除value属性吗?是的,我删除了value属性。但不幸的是,问题仍然存在。谢谢,我测试了你的方法,但当我说“1”时,它会说“Hello111111111…”。嗯,你是说听众有问题吗?但我的问题是它确实在听(您可以再次查看我的示例),但是“document.getElementById(“abc”).value”永远无法获取当前屏幕上的内容。即使一封信已经被捕获并显示在屏幕上(例如“hello1”),它也会一直获取defaut值(“在我的例子中是hello”)。对不起,我一定是误解了这个问题。我怀疑用于网页的呈现程序错误地从属性而不是从实际输入文本中读取值。可以尝试从HTML中的文本框中删除value属性吗?是的,我删除了value属性。但不幸的是,问题依然存在。