Я новичок в JQuery и не имею большого опыта работы с Javascript, так что это может способствовать моим проблемам ... Я пытаюсь динамически генерировать список элементов и связывать события щелчка с каждым из динамически сгенерированные элементы. Я могу создать список и успешно связать события щелчка, но тут я наткнулся на камень преткновения.

Мне нужно, чтобы каждое событие щелчка обращалось к конкретным данным, связанным с элементом, по которому щелкнули. Первоначально я просто включил данные в динамическую функцию, которую я создаю, когда привязываю событие щелчка. Приведенный ниже код пытается сделать это, но всякий раз, когда я щелкаю элемент в списке, я получаю только final значение моей переменной счетчика (2).

Ясно, что я неправильно понимаю способ создания моей функции щелчка. Я прочитал здесь, в SO, целую кучу статей, которые могут быть связаны, но я еще не нашел элегантного / правильного способа сделать это.

Моя тестовая страница:

<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>

    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">google.load("jquery", "1.3.2");</script>

    <script type="text/javascript">
function generateList() {
  var listElement = $('#unsortedList');
  var dataArr = new Array();
  dataArr["name1"] = "value1";
  dataArr["name2"] = "value2";

  // Clear any existing HTML
  listElement.html('');

  var i = 0;
  for(item in dataArr) {
    listElement.append('<li><div id="item' + i + '">Item ' + i + '</div></li>');

    $('#item' + i).click(function() {
      alert(i);
      $('#item' + i).html("You clicked item " + i);
    });

    i++;
  }
}

$(document).ready(function(e){
  generateList();
});

    </script>
  </head>
  <body>
    <h1>Test List</h1>
    <ul id="unsortedList">
    </ul>
  </body>
</html>

[EDIT] - Моя конечная цель - использовать значение переменной счетчика для индексации во внешний массив значений. Я знаю, что в этом примере это кажется немного несвязным. Когда вы щелкаете элемент, я хочу вывести индекс в массив, запустить функцию, которая сгенерирует значение, которое я буду использовать для заполнения другого элемента в том же элементе динамического списка.

2
Quintus 9 Июл 2010 в 23:44

2 ответа

Лучший ответ

Это работает :

 $('#item' + i).click((function(x) {
          return function(){
              $('#item' + x).html("You clicked item " + x);
          };
        })(i));

Протестировал здесь: http://jsfiddle.net/uLGxb/

5
NM. 9 Июл 2010 в 20:05

НМ - красивое простое решение. конечно, внутренняя часть может быть записана как:

      return function(){
          $(this).html("You clicked item " + x);
      };
0
Tim Cooper 29 Сен 2011 в 13:10