制作JQuery函数Plain JS

时间:2015-06-10 13:50:07

标签: javascript jquery events listener document

嘿,我有以下在JQuery中运行良好的函数,但由于很多原因,我需要在简单的JS中使用它。

$('audio').on("play pause ended", function () {
    document.title = document.title.replace("\u25B6", "")
    $("audio").each(function (index) {
        if (!this.paused) {
            document.title = "\u25B6 " + document.title.replace("\u25B6 ", "")
            return false;
        }
    })
});

我试图将它转换为普通JS(见下文)但是它只是出现以下错误:TypeError:undefined不是一个函数(评估'sound.addEventListener')

var sound = document.getElementsByTagName('audio');
sound.addEventListener('play pause ended', function () {
    document.title = document.title.replace('\u25B6', '')
    sound.each(function (index) {
        if (!this.paused) {
            document.title = '\u25B6 ' + document.title.replace('\u25B6 ', '')
            return false;
        }
    })
});

1 个答案:

答案 0 :(得分:2)

以下应该可以解决问题:

var sounds = document.getElementsByTagName('audio');
/* Loop through the nodelist - this is **not** an array */
for(var i = 0; i < sounds.length; i++){
    /* Get the item in your nodelist. This **is** an element. */
    var sound = sounds.item(i);
    /* Now add your event listener here - You can only add one at a 
     * time, though. So I decided to make the event a separate  
     * function and attach it multiple timers. */
    function eventHandler(){
        document.title = document.title.replace('\u25B6', '')
        if (!sound.paused) {
            document.title = '\u25B6 ' + document.title.replace('\u25B6 ', '')
            return false;
        }
    }
    sound.addEventListener('play', eventHandler, false);
    sound.addEventListener('pause', eventHandler, false);
    sound.addEventListener('ended', eventHandler, false);
}

两件事:document.getElementsByTagName返回一个数组的HTMLNodeList。它可以循环,因为它有一个length属性,但它不能使用forEach(因为它还有一个名为item的函数,它用于获取节点列表提供的索引处的元素)。

其次,this未在forEach中引用您的项目,您需要将参数传递给您可以引用的forEach函数(又名array.forEach(function(item){});其中您的商品将由item引用。但就像我说的那样,这不会产生任何影响,因为nodeList不是数组。

更新

我刚才发现有一种简单的方法可以附加所有事件,因此我对其进行了适当的修改。