我在使用动态创建的 Javascript 事件处理函数时遇到问题。
在我的 HTML 中,我有以下内容:
<input id="nvctrlfont1" type=number min=18 max=144 step=1 value=36 maxlength="3" size="8">
<input id="nvctrlfont2" class="color" value="000000" style="background-color:black;width:70px;">
<input id="nvctrlfont4" class="color" value="000000" style="background-color:black;width:70px;">
......
类颜色只是一个 javascript 颜色选择器。
元素 ID 有 1,2,4 ... 等作为布尔值。也就是说,一个 JS 函数接收一个用于隐藏或显示 HTML 输入元素的布尔值。对于隐藏的元素,不分配事件,对于未隐藏的元素,将分配事件。
事件函数将驻留在 nvFontFuncs 中。
我似乎无法解决的问题:
当函数分配发生到 nvEL.onchange 时,它似乎每次都用相同的函数替换它。
例如,假设布尔值 nvFontBool 带有“6”,那么应该启用输入元素 nvcontrolfont2 和 nvcontrolfont4 并相应地将 nvFontFuncs nvctrlfont2 和 4 中的功能分配给 onchange 事件。
然而会发生的是 nvctrlfont4 函数最终被分配给两个元素。
换句话说,无论哪个元素设置了 onchange 事件,当单击它时,它都会调用最后一个分配的元素。在我的示例中,无论我更改 INPUT nvctrlfont2 还是 nvctrlfont4 元素,都会调用 nvctrlfont4()。
例如,如果我将 nvFontBool 参数更改为“7”,从而启用所有三个输入元素。然后无论更改哪一个,它都会调用 nvctrlfont4() (恰好是循环中分配的最后一个)。
我也尝试使用 addEvent 和 setAttributes,结果相同。它作为函数的 onchange 分配在绑定时是静态的。因此,哪个是最近的一个绑定最终会分别替换所有元素的先前绑定。
帮助?
继承人的JS。
var nvFontFuncs = {
nvctrlfont1: function () { alert('Function 1'); },
nvctrlfont2: function () { alert('Function 2'); },
nvctrlfont4: function () { alert('Function 4'); }
};
这是功能
function nvSetFontCtrls(nvFontBool)
{
var nvEL;
var nvName="nvctrlfont";
var nvTemp;
nvFg=1;
while(nvFontBool != 0) {
//alert("FontBool:"+nvFontBool);
nvTemp=nvName+nvFg.toString();
// nvTemp="func"+nvFg.toString();
nvEL=document.getElementById(nvTemp);
if(nvFontBool & nvFg) {
nvEL.style.display="block";
nvEL.onchange=function() { nvFontFuncs[nvTemp](); }
}
else {
nvEL.style.display="none";
}
nvFontBool=nvFontBool&(~nvFg); //alert("nvfontbool:"+dechex(~nvFg));
nvFg = nvFg << 1;
}
}