for循环在onclick事件上设置打开的窗口

时间:2013-04-10 18:19:48

标签: javascript javascript-events

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

有任何帮助吗?谢谢!

1 个答案:

答案 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');    
}