香草 javascript 中的 Each() 问题
Each() issue in vanilla javascript
每次我尝试在 vanilla JavaScript 中重现 .each()
jQuery 函数时,我都遇到了麻烦。
当我尝试改变这个时:
$("[data-lng]").each(function(){
var lng = $(this).data('lng');
$('#language').text(lng)
});
为此:
var elem = document.querySelectorAll("[data-lng]");
Array.prototype.forEach.call(elem, function(){
document.getElementById('language').write = elem.dataset.lng
});
控制台returnselem.dataset is not defined
另外,我正在处理 data
的事情,所以我什至不确定写这个 document.querySelectorAll("[data-lng]")
是否合法
感谢您的帮助!
PS : 下面是我想转换成 vanilla JS 的例子:
https://jsfiddle.net/x93oLad8/4/
首先,而不是使用:
Array.prototype.forEach.call(elem, function()
你可以直接使用
elem.forEach(function()
其次,回调函数可以接受参数(具体为3个):
el - 当前元素(您要找的 "this" 是哪个?:))
index - 数组中当前元素的索引
list - 你循环的节点列表
用法:
elem.forEach(function(el, index, list){
console.log(el); //logs current element
});
阅读更多:https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach
@Edit:由于在第一部分的评论中有很大的讨论,我觉得有义务 link 一个关于在 JS 中覆盖默认方法的线程:[].slice or Array.prototype.slice (a.k.a 为什么 elem.forEach 可能不起作用,以防万一:))
将您的 jsFiddle 示例换成 vanilla JS 相当简单。需要注意的 'gotcha' 是 IE 不支持 NodeList.prototype.forEach() 因此使用常规的 for 循环代替。 (参见:https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach)
var dictionary = {
'greet': {
'it': 'Ciao',
'en': 'Hello',
'fr': 'Salut',
}
};
var langs = ['it', 'en', 'fr'];
var current_lang_index = 0;
var current_lang = langs[current_lang_index];
window.change_lang = function() {
current_lang_index = ++current_lang_index % 3;
current_lang = langs[current_lang_index];
translate();
}
function translate() {
/* jQuery:
$("[data-translate]").each(function(){
var key = $(this).data('translate');
$(this).html(dictionary[key][current_lang] || "N/A");
});*/
/* vanilla */
var dt = document.querySelectorAll("[data-translate]");
//iterate over the NodeList:
for (i = 0; i < dt.length; ++i) {
var key = dt[i].getAttribute('data-translate');//get the key
dt[i].innerHTML = (dictionary[key][current_lang] || "N/A");//set the text
}
}
translate();
<div data-translate="greet"></div>
<button onclick="change_lang()">Change Language</button>
每次我尝试在 vanilla JavaScript 中重现 .each()
jQuery 函数时,我都遇到了麻烦。
当我尝试改变这个时:
$("[data-lng]").each(function(){
var lng = $(this).data('lng');
$('#language').text(lng)
});
为此:
var elem = document.querySelectorAll("[data-lng]");
Array.prototype.forEach.call(elem, function(){
document.getElementById('language').write = elem.dataset.lng
});
控制台returnselem.dataset is not defined
另外,我正在处理 data
的事情,所以我什至不确定写这个 document.querySelectorAll("[data-lng]")
感谢您的帮助!
PS : 下面是我想转换成 vanilla JS 的例子: https://jsfiddle.net/x93oLad8/4/
首先,而不是使用:
Array.prototype.forEach.call(elem, function()
你可以直接使用
elem.forEach(function()
其次,回调函数可以接受参数(具体为3个): el - 当前元素(您要找的 "this" 是哪个?:)) index - 数组中当前元素的索引 list - 你循环的节点列表
用法:
elem.forEach(function(el, index, list){
console.log(el); //logs current element
});
阅读更多:https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach
@Edit:由于在第一部分的评论中有很大的讨论,我觉得有义务 link 一个关于在 JS 中覆盖默认方法的线程:[].slice or Array.prototype.slice (a.k.a 为什么 elem.forEach 可能不起作用,以防万一:))
将您的 jsFiddle 示例换成 vanilla JS 相当简单。需要注意的 'gotcha' 是 IE 不支持 NodeList.prototype.forEach() 因此使用常规的 for 循环代替。 (参见:https://developer.mozilla.org/en-US/docs/Web/API/NodeList/forEach)
var dictionary = {
'greet': {
'it': 'Ciao',
'en': 'Hello',
'fr': 'Salut',
}
};
var langs = ['it', 'en', 'fr'];
var current_lang_index = 0;
var current_lang = langs[current_lang_index];
window.change_lang = function() {
current_lang_index = ++current_lang_index % 3;
current_lang = langs[current_lang_index];
translate();
}
function translate() {
/* jQuery:
$("[data-translate]").each(function(){
var key = $(this).data('translate');
$(this).html(dictionary[key][current_lang] || "N/A");
});*/
/* vanilla */
var dt = document.querySelectorAll("[data-translate]");
//iterate over the NodeList:
for (i = 0; i < dt.length; ++i) {
var key = dt[i].getAttribute('data-translate');//get the key
dt[i].innerHTML = (dictionary[key][current_lang] || "N/A");//set the text
}
}
translate();
<div data-translate="greet"></div>
<button onclick="change_lang()">Change Language</button>