How can I bind an element that's clicked to all the other functions in a script, not just the one that's called?

喜你入骨 提交于 2021-01-28 11:43:56

问题


I am making buttons that when clicked, a script performs speech recognition on the user's speech. There are multiple click buttons, one for each sentence. The buttons occur in pairs: one button is to be clicked and will start the speech recognition. The other button that's next to it shows the score. I got the basic script from Glen Shires (Introduction to Web Speech API) and am trying to adapt it for my own needs. I got so far up to the point where I got the score to show in a designated button. However, I would like to show the score in the button that's next to the one that's clicked. I am trying to make one javascript script that works for all the buttons. I tried putting: el.previousElementSibling.innerHTML in the onresult part, but it doesn't work. What method can I use? This is the HTML:

  <div class="container-fluid m-1 p-2">
  <button id="score_button" type="button" class="btn mr-3 btn-info" style="height:50px; width:200px;"></button>
  <button id="start_button" onclick="startButton(this)" type="button" class="fas fa-microphone" style="color: orange; font-size:50px; text-decoration:none;"></button>
  </div>
  
  <div class="container-fluid m-1 p-2">
  <button id="score_button2" type="button" class="btn mr-3 btn-primary" style="height:50px; width:200px;"></button>
  <button id="start_button2" onclick="startButton(this)" type="button" class="fas fa-microphone" style="color: lime; font-size:50px; text-decoration:none;"></button>
  </div>
  
  <div class="container-fluid m-1 p-2 bg-warning">
  <p><strong>Here is the transcript:&nbsp;</strong></p>
  <div>
  <span id="final_span" class="final_span"></span>
  <span id="interim_span" class="interim"></span>
  </div>
  </div>

This is the JavaScript script:

    var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
        var x = new SpeechRecognition();
        x.continuous = true;
        x.lang = 'en-US';
        x.interimResults = true;
        x.maxAlternatives = 1;
        var ignore_onend;  
        var start_timestamp; 
        var recognizing = false; 
        var final_transcript = ''; 

        x.onstart = function(){
            recognizing = true;
             event.setAttribute("class", "fas fa-stop-circle");
        };  
    
        x.onend = function(){
            recognizing = false;
            if (ignore_onend) {
                return;
            }
            el.setAttribute("class", "fas fa-microphone");
            if (!final_transcript) {
            return;
            }
         };
        
           x.onresult = function() {
              var interim_transcript = '';
              for (var i = event.resultIndex; i < event.results.length; ++i) {
                  if (event.results[i].isFinal) {
                     final_transcript += event.results[i][0].transcript;
                  } else {
                       interim_transcript += event.results[i][0].transcript;
                    }
               }
                 final_span.innerHTML = final_transcript;
                 interim_span.innerHTML = interim_transcript;
                 document.getElementById("score_button").innerHTML = stringSimilarity.compareTwoStrings(final_transcript, "why");               
                 //el.previousElementSibling.innerHTML = stringSimilarity.compareTwoStrings(final_transcript, "why");    
          };
         
          function startButton(el){
             if (recognizing) {
                x.stop();
                el.setAttribute("class", "fas fa-microphone");  
                return;
             } 
            final_transcript = '';
             x.start();
             ignore_onend = false;
              el.setAttribute("class", "fas fa-stop-circle");
              start_timestamp = event.timeStamp;
          };

I made another script. With this one, I wrapped the whole script in curly braces and called it "function startButton", and it worked well too. I was even able to show the score in the right button, such as Score Button No.1 if Button No.1 was clicked, and Score Button No.2 if Button No.2 was clicked. The only problem is now the speech recognition won't stop even after I click the stop button. The only thing that stops the speech recognition is if I refresh the page. I can tell that it is still recognizing because the transcript keeps showing up in the transcript window below and there is a recording favicon showing in the title tab of the browser. Here is the second script. I wasn't sure whether to ask this in a whole new question or add it to the current one.

function startButton(el){
   
        var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition;
        var x = new SpeechRecognition();
        x.continuous = true;
        x.lang = 'en-US';
        x.interimResults = true;
        x.maxAlternatives = 1;
        var ignore_onend;
        let listening = false; 
        var final_transcript = ''; 
        var z = el.getAttribute("class");
        
             
              if (z ==="fas fa-stop-circle") {
                    x.stop();
                    el.setAttribute("class", "fas fa-microphone");  
                    listening = false;
                    return;
               }   else {
                       x.start();
                      final_transcript = '';
                      ignore_onend = false;
                      listening = true; 
                       el.setAttribute("class", "fas fa-stop-circle");
                       start_timestamp = event.timeStamp;
                    };

        x.onstart = function(){
            listening = true;
        };  
    
        x.onend = function(){
            listening = false;
            if (ignore_onend) {
                return;
            }
            if (!final_transcript) {
            return;
            }
         };
        
           x.onresult = function() {
              var interim_transcript = '';
              for (var i = event.resultIndex; i < event.results.length; ++i) {
                  if (event.results[i].isFinal) {
                     final_transcript += event.results[i][0].transcript;
                  } else {
                       interim_transcript += event.results[i][0].transcript;
                    }
               }
                 final_span.innerHTML = final_transcript;
                 interim_span.innerHTML = interim_transcript;            
                 el.previousElementSibling.innerHTML = stringSimilarity.compareTwoStrings(final_transcript, "what are you doing");          
          };  
};                    

来源:https://stackoverflow.com/questions/65760301/how-can-i-bind-an-element-thats-clicked-to-all-the-other-functions-in-a-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!