0

我有一个月的日历,我需要打开一个新窗口,让我们在 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');    
}

有什么帮助吗?谢谢!

4

1 回答 1

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');    
}
于 2013-04-10T18:23:00.207 回答