我有一个月的日历,我需要打开一个新窗口,让我们在onclick事件中输入不同的信息。所以我有一个for循环,我将onclick()事件设置为多个div。title属性保存单击的月份的日期。 这是我的代码,但无论我点击的那个月的哪一天,它都是相同的。
window.onload = function () {
'use strict';
var i = 0, newAppt, infoGet;
newAppt = document.getElementsByTagName('div');
for (i = 0; i < newAppt.length; i++) {
if (newAppt[i].getAttribute('title') !== '') {
infoGet = newAppt[i].getAttribute('title');
newAppt[i].addEventListener('click', newApptWin(infoGet), false);
}
}
};
function newApptWin(infoGet) {
'use strict';
window.open(infoGet,'test','toolbar=0');
}
有任何帮助吗?谢谢!
答案 0 :(得分:1)
您的代码会在您的页面加载时立即运行newApptWin(infoGet)函数,并且它永远不会更改。您应该将函数传递给eventListener,而不是函数的结果(您在此处完成)。您可以像这样修复它:
newAppt[i].addEventListener('click', function() {newApptWin(infoGet);}, false);
编辑(更新这是错误的):
在for循环中声明infoGet。你的整个剧本:
window.onload = function () {
'use strict';
var i = 0, newAppt;
newAppt = document.getElementsByTagName('div');
for (i = 0; i < newAppt.length; i++) {
if (newAppt[i].getAttribute('title') !== '') {
var infoGet = newAppt[i].getAttribute('title');
newAppt[i].addEventListener('click', function() {newApptWin(infoGet);}, false);
}
}
};
function newApptWin(infoGet) {
'use strict';
window.open(infoGet,'test','toolbar=0');
}
或者您可以完全跳过infoGet并避免潜在的内存泄漏:
newAppt[i].addEventListener('click', function() {newApptWin(newAppt[i].getAttribute('title'));}, false);
编辑2:
window.onload = function () {
'use strict';
var i = 0, newAppt;
newAppt = document.getElementsByTagName('div');
for (i = 0; i < newAppt.length; i++) {
if (newAppt[i].getAttribute('title') !== '') {
var infoGet = newAppt[i].getAttribute('title');
newAppt[i].addEventListener('click', newApptWin, false);
}
}
};
function newApptWin() {
'use strict';
window.open(this.getAttribute('title'),'test','toolbar=0');
}