2

我是 jQuery 的新手,所以这个问题对你们来说可能看起来很幼稚。但请在这里帮帮我。

我正在动态创建许多具有不同标题的锚标记,并将不同的单击事件处理程序分配给那些过于动态的锚标记。

所有锚标记都使用不同的标题完美创建,但问题是它们的事件处理程序都与最后创建的锚标记的事件处理程序相同。因此,当我单击任何链接时,它们都会转到同一页面,即单击最后一个链接时的页面。

这是代码

var title;
var node;

for(var i = 0; i < nodes.length; i++){    
  node = nodes[i];
  title = node.getTitle();

  jQuery("#displayNodeDetails")
  .append(jQuery('<a></a>').attr({ href:'#' })
  .html(title).click(function(){
    EPCM.getSAPTop().LSAPI.AFPPlugin.service.navigate(node);
  }));
}

这里的“displayNodeDetails”是划分。我不明白为什么每次循环运行时“节点”的值都在变化时,我的所有链接都具有相同的事件处理程序,我可以确认,因为我的代码正在创建四个链接:“用户管理员”、“系统管理员” ”、“内容管理”和“协作”,但所有链接都指向与“协作”相同的页面。

4

2 回答 2

2

这是因为它node总是指向最后一个节点。

click循环完成后调用处理程序。因此,node即使在其他锚点的处理函数中,也会指向最后一个元素。

您需要node在创建它时将当前的值传递给处理程序。

jQuery("#displayNodeDetails").append(jQuery('').attr({href:'#'}).html(title).click((function(node){
  return function() { EPCM.getSAPTop().LSAPI.AFPPlugin.service.navigate(node); };
})(node));}

这样,click处理程序得到一个函数,node该函数通过函数调用传递给它正确的值。

于 2012-10-21T09:14:20.523 回答
1

以下是我将如何重写您的代码以(希望)使其工作:

// This is a quicker way of defining your loop.
for (node in nodes) {
  // Setting the variable inside the loop so it doesn't pollute the global
  // namespace unnecessarily.
  var title = node.getTitle();

  // Firstly build the link as a jQuery element
  var link = jQuery('<a>' + title + '</a>').attr('href', '#');
  // Then append it to the div
  jQuery('#displayNodeDetails').append(link);

  // Then set the click event callback on it inside a closure
  link.click((function(node) {
    return function() {
      EPCM.getSAPTop().LSAPI.AFPPlugin.service.navigate(node);
    };
  })(node));
}
于 2012-10-21T09:30:05.317 回答