问题是为什么我新增加的li上面没有事件发生。
而如果我把li上的事件绑定写成一个函数,在button事件内增加这个函数,又会发生原来就有的li上事件发生多次?
请问这种一般怎么解决呢?
一个人学习的环境遇到点问题就没办法了,希望有人给出建设性的意见JavaScript
而如果我把li上的事件绑定写成一个函数,在button事件内增加这个函数,又会发生原来就有的li上事件发生多次?
请问这种一般怎么解决呢?
一个人学习的环境遇到点问题就没办法了,希望有人给出建设性的意见JavaScript
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<TITLE> New Document </TITLE>
<script type="text/javascript">
window.onload = function() {
document.getElementById('ul').onclick = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
// 不是<li>标签就返回
if(target.nodeName !== 'LI') {
return;
}
//
func(target.innerHTML);
// 阻止默认行为并取消冒泡
// 阻止打开连接
if(typeof e.preventDefault === 'function') {
e.preventDefault();
e.stopPropagation();
}else {
e.returnValue = false;
e.cancelBubble = true;
}
}}
var i=0;
function addLI(){
var li = document.createElement('li');
li.innerHTML = 'new Li ' + (i++);
document.getElementById('ul').appendChild(li);
}
function func(s) {
alert(s)
}
</script>
</HEAD><BODY>
<ul id="ul">
<li>百度</li>
<li>谷歌</li>
</ul><INPUT TYPE="button" VALUE="添加LI" ONCLICK="addLI()">
</BODY>
</HTML>
function action(ev){
console.log(this.id);
}
window.onload = function(){
var ul = document.getElementById('ul');
var lis = ul.getElementsByTagName('li');
var len = lis.length;
for(var i=0;i<len;i++){
lis[i].onclick = function(ev){
ev = ev || window.event;
action.call(this);
}
}
var button = document.getElementById('add');
button.onclick = function(){
var li = document.createElement('li');
var str = 'li'+(new Date()).getTime();
li.id = str;
li.innerHTML = str;
li.onclick = function(ev){
ev = ev || window.event;
action.call(this,ev);
}
ul.appendChild(li);
}
}<ul id="ul">
<li id="li1111">1111</li>
<li id="li2222">2222</li>
<li id="li3333">3333</li>
</ul>
<input id="add" value="添加" type="button" />
添加个标记就可以了
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<TITLE> New Document </TITLE>
<script type="text/javascript">
window.onload = function() {
document.getElementById('ul').onclick = function(e) {
e = e || window.event;
var target = e.target || e.srcElement;
// 不是<li>标签就返回
if(target.nodeName !== 'LI') {
return;
}
// 没有事件
if(target.getAttribute('noEvent')) {
return;
} func(target.innerHTML);
// 阻止默认行为并取消冒泡
// 阻止打开连接
if(typeof e.preventDefault === 'function') {
e.preventDefault();
e.stopPropagation();
}else {
e.returnValue = false;
e.cancelBubble = true;
}
}}
var i=0;
function addLI(){
var li = document.createElement('li');
li.innerHTML = '有事件 ' + (i++);
document.getElementById('ul').appendChild(li);
}// 添加无事件的LI
function addLI_noEvent(){
var li = document.createElement('li');
li.innerHTML = '无事件 ' + (i++);
// 做个标记
li.setAttribute('noEvent',true);
document.getElementById('ul').appendChild(li);
}
function func(s) {
alert(s)
}
</script>
</HEAD><BODY>
<ul id="ul">
<li>百度</li>
<li>谷歌</li>
</ul><INPUT TYPE="button" VALUE="添加LI(有事件)" ONCLICK="addLI()">
<INPUT TYPE="button" VALUE="添加LI(无事件)" ONCLICK="addLI_noEvent()">
</BODY>
</HTML>
这个解决办法:将事件的调用一并添加进去的可以写成一个函数,然后添加li时再调用一次,可是如果涉及到this问题,这个函数就没法在两个地方使用了。不知不重复性的写事件的调用语句。不知道你明白没明白我的疑问。
虽然回答并非所问,但提供了很好的思路,谢谢。
function Li_BindEvent()//li绑定的事件
{
//......
}
function addLI(){
var li = document.createElement('li');
li.innerHTML = '有事件 ' + (i++);
li.setAttribute("onclick","Li_BindEvent()");
document.getElementById('ul').appendChild(li);
}我的意思是这样绑定,这样就不会存在重复调用的问题