Javascript 如何在创建变量的函数之外调用该变量?
本质上,我有一个小代码段,这对我来说是一个反复出现的问题,(显示错误消息)我在函数内部创建一个按钮,但当我稍后尝试向其中添加事件侦听器时,它不起作用(我理解为什么它不起作用) 我尝试在函数外部启动链接到按钮的变量,就像Javascript 如何在创建变量的函数之外调用该变量?,javascript,addeventlistener,Javascript,Addeventlistener,本质上,我有一个小代码段,这对我来说是一个反复出现的问题,(显示错误消息)我在函数内部创建一个按钮,但当我稍后尝试向其中添加事件侦听器时,它不起作用(我理解为什么它不起作用) 我尝试在函数外部启动链接到按钮的变量,就像 var newListItemBtn 但它告诉我不能将事件侦听器添加到未定义的变量中。(我也明白原因。) 如果我尝试用代码初始化变量 var newListItemBtn=document.createElement('button') 它在代码运行时创建按钮,而不是在调用函数时
var newListItemBtn代码>
但它告诉我不能将事件侦听器添加到未定义的变量中。(我也明白原因。)
如果我尝试用代码初始化变量
var newListItemBtn=document.createElement('button')代码>
它在代码运行时创建按钮,而不是在调用函数时创建,因此它将替换新列表中的按钮
我如何才能在函数外部调用变量并向其添加eventlistener
var createListBtn=document.getElementById('createListBtn'),
listArea=document.getElementById('listArea');
函数createList(){
var list=document.createElement('ul'),
newListItemBtn=document.createElement('button');
newListItemBtn.classList.add('newListItemBtn');
newListItemBtn.innerText='New Item';
list.appendChild(newListItemBtn);
listArea.appendChild(列表);
返回newListItemBtn;
}
createListBtn.addEventListener('单击',函数()){
createList();
});
newListItemBtn.addEventListener('单击',函数()){
警惕(‘嘿’);
});代码>
文件
创建列表
将单击事件侦听器添加到新建列表项btn
中(在创建列表()
函数中)声明的相同范围内。这将起作用:
var createListBtn=document.getElementById('createListBtn'),
listArea=document.getElementById('listArea');
函数createList(){
var list=document.createElement('ul'),
newListItemBtn=document.createElement('button');
newListItemBtn.classList.add('newListItemBtn');
newListItemBtn.innerText='New Item';
list.appendChild(newListItemBtn);
listArea.appendChild(列表);
newListItemBtn.addEventListener('单击',函数()){
警报(“hi”);
});
}
createListBtn.addEventListener('单击',函数()){
createList();
});代码>
文件
创建列表
你不能这么做,因为
newListItemBtn
的变量范围仅在createList()
函数内部可用,不能在外部访问
即使您将newListItemBtn
变量定义移到外部,元素仍然不可用,您仍然会出错
最好在createList()函数中移动newListItemBtn
event listner
function createList(){
var list = document.createElement('ul'),
newListItemBtn = document.createElement('button');
newListItemBtn.classList.add ('newListItemBtn');
newListItemBtn.innerText = 'New Item';
newListItemBtn.addEventListener('click', function(){
alert('hey');
});
list.appendChild(newListItemBtn);
listArea.appendChild(list);
return newListItemBtn;
}
是的,这是我通常会做的,但它会变得混乱,所以我试图看看是否有一种更有效的方法来编写此代码。这是一种有效的方法,因为如果您创建多个newListItemBtn
元素,clcik
事件将只附加到已创建的新元素。如果要将newListItemBtn
移动到外部,则可能会发生事件绑定重复