Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态生成的Select元素和JavaScript闭包_Javascript_Html_Closures - Fatal编程技术网

动态生成的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>​