我想动态生成一些<select
元素。我正在复制现有的一个,只更改名称和onchange-Event。这就是我的问题所在:每个<select>
都有自己的ID。当onChange-Event触发时,它应该响应Value和Element的ID。我不知道如何准确定义JavaScript Closure。我用“this.value”试了一下,但显然这不起作用......
我已经找到了this示例,但它根本不适用于我:/
JavaScript:
var i = 0;
var selectArray = [];
function addSelector(){
var container = document.getElementById("check0");
selectArray[i] = document.getElementsByName("select0")[0].cloneNode(true);
selectArray[i].name = 'select'+i;
selectArray[i].onchange = function(v, i) {
return function() {
changeType(v, i)
}
}(this.value, i);
container.appendChild(selectArray[i]);
}
function changeType(selected, i) {
switch (selected) {
case 'One':
alert(selected+' , '+i);
break;
case 'Two':
alert(selected+' , '+i);
break;
case 'Three':
alert(selected+' , '+i);
break;
case 'Four':
alert(selected+' , '+i);
break;
case 'Five':
alert(selected+' , '+i);
break;
}
}
(我试图发布HTML,但由于某种原因,我无法做到这一点;))
答案 0 :(得分:1)
this.value
:
function addSelector(){
/* ... */
selectArray[i].onchange = (function(v, i) {
return function() {
changeType(v, i)
}
})(this.value, i);
/* ... */
}
this
将为undefined
(严格模式)或window
(正常模式)。 JavaScript应该如何知道this
是对已创建/克隆的<select>
对象的引用? this
内部onchange
将是正确的,因此您不必通过关闭包含此内容,只需要包含索引i
:
selectArray[i].onchange = (function(index) {
return function() {
changeType(this.value, index)
}
})(i);
请注意,您的警报语法错误 - 您应该使用alert(selected + " " + i)
,因为第二个参数将被忽略。
另见:
答案 1 :(得分:1)
你的例子真的难以理解。它有很多问题
i
永远不会改变this.value
没有正确的值,但很容易从处理程序中找出来以下脚本执行我认为您需要的http://jsfiddle.net/FNFQU/13/
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;
使用以下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>