代码之家  ›  专栏  ›  技术社区  ›  esafwan

用纯Js在每个li上应用函数

  •  0
  • esafwan  · 技术社区  · 14 年前

    我已经使用语音api完成了一个读取元素内容的函数,我有一个这样的新闻列表

    <ul id="news">
        <li>
    How Instagram Is Winning Gold at the 2012 Olympics [INFOGRAPHIC]
       </li><li>
          Flickr Photo of Insect Identified As Never-Before-Seen Species [VIDEO]
       </li><li>
          The Upside to the End of the Olympics [COMIC]
       </li><li>
          40 Digital Media Resources You May Have Missed
       </li><li>
          19 Resources to Improve Your Photo and Video Skills
       </li><li>
          Top 10 Twitter Pics of the Week
       </li><li>
          Can Employees Be Trusted to Work From Home? [INFOGRAPHIC]
       </li><li>
          Capture Ghosts at Foursquare Spots With ‘Ghostbusters’ iOS Game
       </li><li>
          Dog Is Terrified of Low-Fat Lamb Jerky [VIDEO]
       </li><li>
          5 Tips to Take Food Photos Good Enough to Eat
       </li><li>
          The 10 Most Stunning Images of Mars in History
       </li><li>
          The Many Looks of Spiderman Over the Past 50 Years [INFOGRAPHIC]
       </li><li>
          Top Ten GIFs of the Week
       </li><li>
          Romney and Obama Both Called Their Veeps the ‘Next President’ [VIDEO]
       </li><li>
          Paul Ryan Visited Facebook, Met Zuckerberg [PICS]
       </li><li>
          Romney’s Logo Looks Like Toothpaste [PICS]
       </li><li>
          Paul Ryan, Romney’s VP Pick, Has Sizable Online Presence
       </li><li>
          Get Back in Kitchen With This Specialized Recipe Site
       </li>
    
    </ul>
    

    现在我使用这个函数来朗读文本。

    function speak() {
        //speechapi.speak(document.getElementById('start').innerHTML,"male");
        speechapi.speak(document.getElementById('start').innerHTML,"male");
    
    }
    

    我如何使它读每一个li,中间有一个小的间隔?我不想使用jquery之类的。 但我做不到。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Alex Kalicki    14 年前

    以下是一种方法,每行之间延迟2秒:

    var news = document.getElementById('news').getElementsByTagName('li');
    
    var newsItem = 0;
    var speechInterval = setInterval(function(){
        speechapi.speak(news[newsItem].innerHTML, "male");
        if (++newsItem === news.length){
            window.clearInterval(speechInterval);
        }
    }​, 2000);
    

    DEMO, inserting text in a <p> tag instead of speaking it

        2
  •  1
  •   Musa    14 年前

    怎么样

    function speak() {
        var i = 0,
        li = document.getElementById('news').getElementsByTagName('li'),
        interval = setInterval(function(){
            if (i < li.lenght){
                speechapi.speak(li[i].innerHTML,"male");
                i++;
            }
            else{
                clearInterval(interval);
            }
        }, 5000);
    }
    

    https://developer.mozilla.org/en-US/docs/DOM/document.getElementsByTagName

    https://developer.mozilla.org/en-US/docs/DOM/document.getElementById

    https://developer.mozilla.org/en-US/docs/window.setInterval

    https://developer.mozilla.org/en/DOM/window.clearInterval

        3
  •  1
  •   HBP    14 年前

    以下是我对这个问题的看法:

    function speak() {
        var li = document.getElementById ('news').getElementsByTagName ('li')
          , i = 0;
    
        li = [].slice.call (li, 0);
    
        (function speakItem() {
          speechapi.speak(li[i++].innerHTML, "male");
          i < li.length && window.setTimeout (speakItem, 1000);
        }
    }
    

    这个 [].slice.call (li, 0) 将li元素的活动列表转换为简单的JS数组,从而实现更高效的处理。

    每个项目都被阅读,然后,如果有更多的项目,在说出下一个项目之前,会开始1秒的间隔。这允许长项目和短项目之间有恒定的整数。