2

我一直在为下面的代码苦苦挣扎太久,试图弄清楚如何将每次点击都会修改的数组传递给函数。

问题是,一旦修改了 clickedLinks 数组,它就会影响 shoplist 函数中的passedLinks 数组。

我什至很好地解释了为什么会发生这种情况,但我无法将其正确应用到我的示例中。我尝试在不同的点清除数组,但没有成功。我开始怀疑我的代码的整个逻辑是否有缺陷。

任何帮助,将不胜感激。

这是代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>
    <title>
      Test 1
    </title>
    <script src="http://code.jquery.com/jquery-latest.js" type=
    "text/javascript">
</script>
  </head>
  <body>
    <div class="items">
      <ul>
        <li>
          <a href="#" id="link1">Link 1</a>
        </li>
        <li>
          <a href="#" id="link2">Link 2</a>
        </li>
        <li>
          <a href="#" id="link3">Link 3</a>
        </li>
        <li>
          <a href="#" id="link4">Link 4</a>
        </li>
      </ul>
    </div>

<script type="text/javascript">
    var clickedLinks = [];
    var passedItems = [];


    // Collect clicked link IDs into an array and pass the array as an argument to shoplist()
    $('.items a').click(function () {

    if (clickedLinks.indexOf(this.id) != -1) {
        var linkIndex = clickedLinks.indexOf(this.id);
        clickedLinks.splice(linkIndex, 1);
    } else {
        clickedLinks.push(this.id);
    }

    shoplist(clickedLinks);

    });


    function shoplist(ids) {
        passedItems.push(ids);
        alert(passedItems);
    }
</script>
</body>
</html>

脚步:

  1. 点击“链接1”
  2. 点击“链接2”

预期结果:警报窗口显示“link1、link1、link2”

实际结果:警报窗口显示“link1、link2、link1、link2”

4

1 回答 1

1

ids按原样推送数组,但稍后会更改。您应该使用slice. 就像是:

passedItems.push(ids.slice());

另外,我无法理解该if条款的必要性。如果该项目已经存在,请不要添加它;还是我错过了什么?

演示

于 2012-08-24T21:30:10.263 回答