制作 JQuery 函数纯 JS
Making JQuery function Plain JS
嘿,我有以下功能,它在 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 is not a function (evaluating '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;
}
})
});
以下应该可以解决问题:
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
returns 一个 HTMLNodeList,它 不是 数组。它可以循环遍历,因为它有一个长度 属性,但它不能使用 forEach
(因为它还有一个名为 item
的函数,用于获取提供的元素节点列表的索引)。
其次,this
不会在 forEach
中引用您的项目,您需要将参数传递给您可以引用的 forEach
函数(又名 array.forEach(function(item){});
您的项目将被 item
引用)。但正如我所说,这不会有什么不同,因为 nodeList
不是数组。
已更新
突然想到有一种简单的方法可以附加所有事件,所以我适当地修改了它。
嘿,我有以下功能,它在 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 is not a function (evaluating '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;
}
})
});
以下应该可以解决问题:
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
returns 一个 HTMLNodeList,它 不是 数组。它可以循环遍历,因为它有一个长度 属性,但它不能使用 forEach
(因为它还有一个名为 item
的函数,用于获取提供的元素节点列表的索引)。
其次,this
不会在 forEach
中引用您的项目,您需要将参数传递给您可以引用的 forEach
函数(又名 array.forEach(function(item){});
您的项目将被 item
引用)。但正如我所说,这不会有什么不同,因为 nodeList
不是数组。
已更新
突然想到有一种简单的方法可以附加所有事件,所以我适当地修改了它。