动态生成的Select元素和JavaScript闭包
我想生成一些动态生成的Select元素和JavaScript闭包,javascript,html,closures,Javascript,Html,Closures,我想生成一些此值。此处不知道该值: function addSelector(){ /* ... */ selectArray[i].onchange = (function(v, i) { return function() { changeType(v, i) } })(this.value, i); /* ... */ } 此将是未定义的(在严格模式下)或窗口(正常模式)。JavaScript如何知道
此值。此处不知道该值:
function addSelector(){
/* ... */
selectArray[i].onchange = (function(v, i) {
return function() {
changeType(v, i)
}
})(this.value, i);
/* ... */
}
此
将是未定义的
(在严格模式下)或窗口
(正常模式)。JavaScript如何知道这个是对创建/克隆的
对象的引用此
在您的onchange
中是正确的,因此您不必通过闭包将其包括在内,只需包括索引i
:
selectArray[i].onchange = (function(index) {
return function() {
changeType(this.value, index)
}
})(i);
请注意,alert的语法是错误的-您应该使用alert(selected+“”+i)
,因为第二个参数将被忽略
另请参见:
你的例子真的很难理解。它有很多问题
i
永不改变
this.value
在调用它时没有正确的值,但是很容易从处理程序中找出它
下面的脚本就是我认为您需要的
使用以下HTML
<input type="button"
id="btn"
value="Add Selector!" />
<div id="check0">
<select id="select0" name="select">
<option selected>One</option>
<option>Two</option>
<option>Three</option>
<option>Four</option>
<option>Five</option>
</select>
</div>
一个
两个
三
四
五
我的价值永远不会因为你的努力而改变。事实上,我从不改变——我忘了增加它。您的脚本实现了我想要的功能,但我需要使用闭包。这就是为什么我把另一个答案设为正确的原因。感谢您的快速回复@vogti一个帮助你发现问题的答案值得投票表决。我的答案使用了闭包,它没有使用自调用匿名函数。为什么需要一个自调用匿名函数?您的答案可能使用闭包,但另一个答案正好帮助我解决了问题。再次非常感谢,我放弃了你@vogti:您不应该使用现有代码的主要原因是:不需要您创建的globals。另外,您的changeType
函数名称不正确(它不会更改类型),但也不需要开关:alert(selected+','+i)
就可以了。谢谢,这就是我需要知道的!我不知道如何说changeType“获取动态创建的选择器的值”。这就是为什么我认为我必须将“this.value”也设置为一个参数。。。现在它的工作方式正是我想要的。
function addHandler(node, index){
node.onchange = function() {
alert('Changed select index ' + index + '. Its value is ' + node.value);
}
}
function duplicateSelectElement() {
var container = document.getElementById("check0");
var allSelects = document.getElementsByName("select");
var firstSelect = allSelects[0];
var newSelect = firstSelect.cloneNode(true);
addHandler(newSelect, allSelects.length + 1);
container.appendChild(newSelect);
}
addHandler( document.getElementById('select0'), 1 );
document.getElementById('btn').onclick = duplicateSelectElement;
<input type="button"
id="btn"
value="Add Selector!" />
<div id="check0">
<select id="select0" name="select">
<option selected>One</option>
<option>Two</option>
<option>Three</option>
<option>Four</option>
<option>Five</option>
</select>
</div>