动态生成的Select-Elements和JavaScript Closure

时间:2012-05-29 19:57:57

标签: javascript html5 closures

我想动态生成一些<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,但由于某种原因,我无法做到这一点;))

Here is the fiddle

2 个答案:

答案 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>​