Javascript 为什么onclick';s的处理功能未按预期工作?

Javascript 为什么onclick';s的处理功能未按预期工作?,javascript,dom,javascript-events,Javascript,Dom,Javascript Events,我有以下一段代码: var instance = this; window.onload = function () { for (var i = 0; i < array.length; ++i) { var currentDivId= array[i]; var currentDiv = document.getElementById(currentDivId); try { if (!currentDi

我有以下一段代码:

var instance = this;
window.onload = function () {
    for (var i = 0; i < array.length; ++i) {
        var currentDivId= array[i];
        var currentDiv = document.getElementById(currentDivId);

        try {
            if (!currentDiv) {
                throw 'Div id not found: ' + currentDivId;
            }
            var image = document.createElement('img');
            image.src = 'img.jpg';
            image.onclick = function() {
                instance.doSomething(currentDivId);
            };

            currentDiv.appendChild(image);
        }
        catch(e) {
            console.warn('oops');
        }
    }
};
var instance=this;
window.onload=函数(){
对于(变量i=0;i
此代码被传递一个div的id数组。它所做的是,在每个div处渲染一个图像,并设置它们的onclick属性

假设我有一个字符串数组:
['abc','xyz']

我希望代码在
中放置一个图像,在
中放置另一个图像

单击第一个图像时,应使用参数
'abc'
调用instance.doSomething
函数,反之亦然

但代码并没有像预期的那样工作。它总是使用数组中的最后一个参数调用
instance.doSomething
,在本例中为
'xyz'

我对JS还不熟悉,但对它的内部工作原理还没有完全掌握。这里出了什么问题,我该如何解决

谢谢你的帮助。谢谢。

试试:

image.onclick = (function() {
  var currentD = currentDivId;
  return function() { 
      instance.doSomething(currentD);
  }
})();
希望有帮助

试试:

image.onclick = (function() {
  var currentD = currentDivId;
  return function() { 
      instance.doSomething(currentD);
  }
})();

希望它有帮助

欢迎来到Javascript范围问题的精彩世界。现在,JS将onclick代码视为“单击此对象时,在单击发生时获取currentDivID变量中存储的值,并将其传递给doSomething函数”


您应该做的是将参数基于图像对象本身。每个DOM对象都知道它在DOM树中的位置,因此在单击它时,onclick代码应该使用DOM遍历操作来确定它在哪个div中,并动态检索它的ID。这样,您就不必担心绑定变量和作用域问题。。。只需找出哪个div包含您的图像,并在运行时获取ID。

欢迎来到Javascript范围问题的精彩世界。现在,JS将onclick代码视为“单击此对象时,在单击发生时获取currentDivID变量中存储的值,并将其传递给doSomething函数”

image.onclick = function() {
    instance.doSomething(this.parentNode.id);
};
您应该做的是将参数基于图像对象本身。每个DOM对象都知道它在DOM树中的位置,因此在单击它时,onclick代码应该使用DOM遍历操作来确定它在哪个div中,并动态检索它的ID。这样,您就不必担心绑定变量和作用域问题。。。只需找出哪个div包含您的映像,并在运行时获取ID即可

image.onclick = function() {
    instance.doSomething(this.parentNode.id);
};
应该这样做。因为我们知道图像在我们想要获取的div中,所以只需向上移动一个dom元素并获取其id


应该这样做。因为我们知道图像在我们想要得到的div中,所以只需向上移动一个dom元素并获取其id。

我认为您必须在
for
中编写
I++
而不是
for
循环中编写
I++
而不是
for
中编写
++/code>,不幸的是,它不起作用。按钮不再响应。@Murat-应该可以了。您提到您是JS新手,因此可能
(function(){})(
语法对您来说是新的,但请确保匹配所有括号。也许Sudhir可以解释一下为什么它会起作用……不幸的是,它不起作用。按钮不再响应。@Murat-应该可以了。您提到您是JS新手,因此可能
(function(){})(
语法对您来说是新的,但请确保匹配所有括号。也许Sudhir可以添加一些解释来解释它为什么会工作……好吧,但是这种方法会不会花费一些时间,至少是日志(页面大小)时间?没有比这更容易/更快的了吗?如果不是,我如何让我的图像找出它包含在哪个div中:)解析树实际上是一个非常快速的操作。每个节点都有一个.parentNode属性,您可以跟随这些父节点返回到树的顶部。日志(页面深度)是最坏的情况。由于您将图像直接插入到div中,您可能只需要转到img.parentNode就可以得到图像所在的div,所以O(1)。好的,但是这种方法不会花费一点时间,至少需要记录(页面大小)时间吗?没有比这更容易/更快的了吗?如果不是,我如何让我的图像找出它包含在哪个div中:)解析树实际上是一个非常快速的操作。每个节点都有一个.parentNode属性,您可以跟随这些父节点返回到树的顶部。日志(页面深度)是最坏的情况。由于您将图像直接插入到div中,您可能只需要转到img.parentNode就可以得到图像所在的div,所以O(1)。