【问题标题】:how to make a button to read the text of div如何制作一个按钮来读取div的文本
【发布时间】:2015-06-09 13:48:50
【问题描述】:

我正在尝试制作一个“Speak”按钮,它应该基本上可以读取前一个 div 的文本内容。

例如我有:

<div id="text1">Lorem ipsum</div>
<button id="btn">Speak</button>
<div id="text2">This is the second block</div>
<button id="btn">Speak</button>

并使用这样的javascript代码

<script type="text/javascript">
var btn = document.getElementById('btn');
speechSynthesis.cancel()
var u = new SpeechSynthesisUtterance();
var text_to_read = document.getElementById('step1');
jQuery.browser.chrome = /chrom(e|ium)/.test(navigator.userAgent.toLowerCase()); 
if(!jQuery.browser.chrome){
 u.rate = .2;
}
u.text = text_to_read.textContent;

btn.onclick = function () {speechSynthesis.speak(u);};
</script>

现在,不要在这一行中使用“step1”:var text_to_read = document.getElementById('step1');我需要在按钮之前立即检索 div 上的文本。

希望它足够清楚。

对不起,我不是 JS 编码员。

【问题讨论】:

  • id 应该是唯一的 id="btn"

标签: javascript jquery html speech-synthesis


【解决方案1】:

使用 jQuery 非常简单:

$(document).ready(function(){
    $('.btn').click(function(){
        alert($(this).prev().text());
    });
});

演示:https://jsfiddle.net/u4wmt9Lf/

注意:我还将重复的ids 更改为classes

编辑:

试试这个纯 JavaScript 版本,它应该适合你:

var buttons = document.getElementsByClassName('btn');
for(var i = 0, len = buttons.length; i < len; i++) {
    buttons[i].onclick = function (e) {
        var prev = e.target.previousElementSibling;
        var text = prev.innerText || prev.textContent;
        alert(text);
    }
}

演示:https://jsfiddle.net/lmgonzalves/u4wmt9Lf/11/

【讨论】:

  • 是的,它应该这样工作!!!但不幸的是,我不能使用这种语法,因为它是在 wordpress 环境中。我尝试用 jQuery 更改 $ 但它不起作用。
  • @user3590313 我用纯 JavaScript 方法更新了我的答案,尝试一下,让我知道它是如何工作的 :)
  • 不,它不起作用,我收到此错误:TypeError:null 不是对象(评估'prev.innerText')。我注意到当我在 wordpress 中发布代码时,我得到:
    ..

【解决方案2】:
$(document).ready(function(){
    $('.btn').click(function(){
            speechSynthesis.cancel()    ;
      var text_to_read = $(this).prev().text();
        var u = new SpeechSynthesisUtterance(text_to_read);
   speechSynthesis.speak(u); if(!/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())){
     u.rate = .2;
    }
    u.text = text_to_read.textContent;

    });

});


<div id="text1">Lorem ipsum</div>
<button class="btn">Speak</button>
<div id="text2">This is the second block</div>
<button class="btn">Speak</button>

试试这个

更新

【讨论】:

  • 这样它只会说出 text1 div 的内容。它应该读取任何先前 div 的内容。
  • 同样的问题:我不能使用这种语法,因为它是在 wordpress 环境中。我尝试像往常一样使用 jQuery 更改 $,但它不起作用。
  • 文本和按钮是动态创建的吗?
  • 不,它们不是动态创建的
猜你喜欢
  • 2018-09-09
  • 2015-11-18
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多