Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
如何通过';这';使用JavaScript将其转换为函数_Javascript_Javascript Events - Fatal编程技术网

如何通过';这';使用JavaScript将其转换为函数

如何通过';这';使用JavaScript将其转换为函数,javascript,javascript-events,Javascript,Javascript Events,我有以下代码,旨在为类名为“State”的所有元素创建onchange事件处理程序。唯一的问题是我希望将元素传递到“StateChange”函数中。如何更新此JS以将“this”传递到StateChange函数中?谢谢 var c = document.getElementsByClassName('State'); for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, c[i] );

我有以下代码,旨在为类名为“State”的所有元素创建onchange事件处理程序。唯一的问题是我希望将元素传递到“StateChange”函数中。如何更新此JS以将“this”传递到StateChange函数中?谢谢

var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, c[i] );
还有一些澄清。该函数的目的是避免将onchange事件放在类名为'State'的每个元素旁边。结果应该和我写的一样:

<select id="MyState1" class="State" onchange="StateChange(this)">

更新:

这是你最新的问题:你说过你想要的最终结果就像你做了这件事:

<select id="MyState1" class="State" onchange="StateChange(this)">
它所做的是返回一个函数,当事件被触发时,该函数将调用您传入的函数(
StateChange
),并将
this
设置为您传入的
元素。。这使用了函数对象的JavaScript特性,它允许您定义函数调用期间该
将是什么。您只需将其作为第一个参数传递给
调用
(后续参数传递给被调用的函数)

如果您想依赖这样一个事实,即设置处理程序的方式,
this
将被设置为元素实例,您可以取消
element
参数:

function createEventHandler(handler) {
    return function(event) {
        return handler.call(this, event || window.event);
    };
}
它只传递由浏览器为事件处理程序设置的

选项2:您希望
=
作为设置处理程序的位置 这和上面的原理是一样的,只是有一个不同的论点。在这种情况下,您需要在以下位置传递
this

var c = document.getElementsByClassName('State');
for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, this, c[i] );
(注意,我已将元素作为第二个参数传递给
StateChange

更多阅读:

    • 一种方法是:

      var c = document.getElementsByClassName('State');
      for (i = 0; i < c.length; i++) 
        c[i].onchange = createEventHandler(function(){
          StateChange(c[i]);
          });
      
      var c=document.getElementsByClassName('State');
      对于(i=0;i
      看起来你已经做到了。c[i]应该是您所指的元素,因为
      i
      总是指
      c.length
      +1,因此
      c[i]
      是未定义的。如果希望这样做,请使用一个自执行函数,该函数返回一个新函数,将其从当前迭代传递到
      c[i]
      ,并将其用作
      StateChange
      的参数。例如,你是对的,Yoshi。Alf,我认为括号是匹配的,但正如Yoshi所说,要让它正常工作,你需要用另一个闭包来包装东西,以防止在循环结束时使用I的值。我以重要的方式更新了我的问题,使其更加清晰。谢谢你的帮助。@Mike:别担心,希望这对你有帮助。:-)关于这件事的简短跟进。。。如果我想为:,做同样的事情,我如何设置?我不知道如何指定返回它。@迈克:像这样:
      onkeydown=“return noNumbers(event,this)”
      noNumbers
      中,元素将是第二个参数。或者,如果您愿意:
      onkeydown=“return noNumbers.call(this,event)”
      并且在
      noNumbers
      中,
      this
      将引用元素,它将只接收一个参数(事件)。哦,我不是想问如何从事件调用传递“this”。我想问的是如何使用JS为该元素创建一个事件处理程序,以便它返回noNumbers(事件)。我当前的createEventHander()不能做到这一点。就像在上一个案例中一样,我希望最终结果就像我做了这件事:
      var c = document.getElementsByClassName('State');
      for (i = 0; i < c.length; i++) c[i].onchange = createEventHandler( StateChange, this, c[i] );
      
      function createEventHandler(handler, thisArg, element) {
          return function(event) {
              return handler.call(thisArg, event || window.event, element);
          };
      }
      
      var c = document.getElementsByClassName('State');
      for (i = 0; i < c.length; i++) 
        c[i].onchange = createEventHandler(function(){
          StateChange(c[i]);
          });