所以,我有一个问题。在函数内部,我具有一个创建li的createElement()函数。我还使用setAttribute()函数添加onclick()。但是,这是我的问题,我可以像在onclick()中那样存储数组,以便在新的函数参数中获取该数组吗?我应该在'changeClass(“'+'”);')里面放什么? (“名称”是一个包含数组的全局变量。“ numberOfCookies”没什么好担心的。)
function getClassCookie() {
var cookiesArray = document.cookie.split(';');
numberOfCookies = cookiesArray.length;
for (var i = 0; i < cookiesArray.length; i++) {
var nameValueArray = cookiesArray[i].split('=');
var split = nameValueArray[1].split(',');
var className = split[0];
var copySplit = split.slice();
copySplit.splice(0, 1);
names = copySplit;
var newLi = document.createElement('li');
var textNode = document.createTextNode(className);
newLi.setAttribute('onclick', 'changeClass("' + '");');
newLi.setAttribute('onclick', 'hideDropdown();');
newLi.appendChild(textNode);
var parent = document.getElementById('classes');
parent.appendChild(newLi);
}
}
function changeClass(c) {
names = c;
}
答案 0 :(得分:0)
如果您使用Javascript(例如addEventListener
)正确附加处理程序,则可以在处理程序中使用带有 closures 的数组。 (内联处理程序通常很难管理,而且也不被认为是好的做法)。例如,一旦声明了newLi
,只需在以后引用要调用changeClass
的数组即可:
newLi.addEventListener('click', function() {
changeClass(copySplit);
});
以上代码将允许在copySplit
循环中创建的for
成为以后单击newLi
时引用的那个。 (当您使用嵌入式处理程序时,此技术是不可能的)
还有一件事情-用var
声明的变量被提升 且具有直观的函数作用域,而不是块作用域。确保使用const
或let
来代替它们,它们具有块作用域(这样,循环的每个迭代都具有变量的单独绑定,而不是所有共享同一组变量的迭代):
for (let i = 0; i < cookiesArray.length; i++) {
const nameValueArray = cookiesArray[i].split('=');
const split = nameValueArray[1].split(',');
const className = split[0];
const copySplit = split.slice();
// etc
答案 1 :(得分:0)
在将函数名称附加到属性时,使用字符串串联作为函数名称并不是一个好方法。只需使用功能挂钩。如果您需要将参数传递给它,那么您也可以在匿名调用中做到这一点。
在下面的示例中,请注意,演示数组由于其范围而在随后的点击中保持其状态。
function handler(arr){
arr.push(arr.length);
console.log(arr);
}
(function demo(){
var newButton = document.createElement('button');
newButton.textContent = "Demo";
var someArray = [];
newButton.onclick = function(){
handler(someArray);
}
document.body.appendChild(newButton);
})()