В настоящее время я могу нажать любую из 4 кнопок в HTML, используя Javascript, запущенный в tampermonkey, чтобы выбрать идентификатор кнопки DIV, которую нужно щелкнуть. Однако я хочу использовать распознавание речи, чтобы щелкнуть любую из 4 кнопок, произнеся любое из следующих слов: НЕТ, ОДИН, ДВА, ТРИ. Я предполагаю, что речевой сценарий изменит слово, которое я говорю, на текст, который будет добавлен в массив javascript, который будет сопоставлен с идентификатором DIV, который нужно щелкнуть. Как этого добиться с помощью javascript. Благодарность
document.getElementById('radio0').click();
<div class = "radio-container">
<div class = "col-6">
<button id = "radio0">None</button>
</div>
<div class = "col-6">
<button id = "radio1">One</button>
</div>
<div class = "col-6">
<button id = "radio2">Two</button>
</div>
<div class = "col-6">
<button id = "radio3">Three +</button>
</div>
</div>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете выбрать div, проверив innerHTML div с вводом, который вы получаете от речи к тексту. Чтобы сопоставить элемент, вы можете использовать ответы по этой ссылке Javascript .querySelector найти <div> по innerTEXT
Придумайте массив названий кнопок. Поскольку SpeechRecognition распознает числа как фактические числа (например, 1, а не one), используйте числовые значения, а не их словесные представления.
var buttonNames = [ 'None', '1', '2', '3'];
У меня возникли проблемы с предоставлением встроенному StackSnippet разрешения на доступ к микрофону (вероятно, это связано с правилами междоменного доступа и песочницы), поэтому я поместил весь код в пользовательский скрипт. Он заменяет HTML страницы на ваш HTML. Щелкните по тексту документа, и начнется распознавание. (Откройте консоль браузера, чтобы увидеть, что он делает) Затем произнесите одно из названий кнопок. (Убедитесь, что Stack Overflow - или любой другой домен, на котором вы запускаете пользовательский скрипт, - имеет разрешение на прослушивание вашего микрофона)
Когда срабатывает обработчик onresult (когда вы перестаете говорить), определите последнее слово в расшифровке и посмотрите, соответствует ли оно какому-либо из buttonNames. Если это так, querySelectorAll - это кнопки в документе, а .click() - соответствующий индекс кнопок.
// ==UserScript==
// @name Userscript Speech Recognition
// @namespace CertainPerformance
// @version 1
// @match https://stackoverflow.com/questions/51702275/click-button-using-javascript-speech-recognition-tampermonkey
// @grant none
// ==/UserScript==
document.head.innerHTML = '';
document.body.innerHTML = `
<div class = "radio-container" style = "height:1000px">
<div class = "col-6">
<button id = "radio0">None</button>
</div>
<div class = "col-6">
<button id = "radio1">One</button>
</div>
<div class = "col-6">
<button id = "radio2">Two</button>
</div>
<div class = "col-6">
<button id = "radio3">Three +</button>
</div>
</div>
`;
document.addEventListener('click', ({ target }) => {
if (!target.matches('button')) return;
console.info('Click detected: ' + target.outerHTML);
});
var SpeechRecognition = SpeechRecognition || webkitSpeechRecognition
var SpeechGrammarList = SpeechGrammarList || webkitSpeechGrammarList
var SpeechRecognitionEvent = SpeechRecognitionEvent || webkitSpeechRecognitionEvent
var buttonNames = [ 'None', '1', '2', '3'];
var recognition = new SpeechRecognition();
document.body.onclick = function(e) {
if (e.target.matches('button')) return;
recognition.start();
console.info('Listening');
}
recognition.onresult = function(event) {
var last = event.results.length - 1;
var speechText = event.results[last][0].transcript;
console.info('Heard ' + speechText);
const foundButtonIndex = buttonNames.findIndex(buttonName => buttonName === speechText);
console.info(foundButtonIndex);
if (foundButtonIndex !== -1) document.querySelectorAll('button')[foundButtonIndex].click();
}
recognition.onspeechend = function() {
recognition.stop();
}
recognition.onnomatch = function(event) {
console.info('Not recognized')
}
recognition.onerror = function(event) {
console.info('Error ' + event.error);
}
Для более общего решения, когда кнопки могут иметь любой текст внутри, и вы хотите иметь возможность произносить текст кнопки и нажимать соответствующую кнопку, вы можете querySelectorAll все кнопки при загрузке страницы, сопоставить их с объектом с ключами, соответствующими их текстовое содержимое, а затем щелкните buttonObj[speechText], если он существует.
mehn, кажется, ты решил все проблемы, спасибо. Мне понадобится время, чтобы разобрать ваш код. Я вернусь к вам через несколько часов. Большое спасибо