Массив и цикл while: сделать уникальным интерактивным

#javascript #jquery #arrays #while-loop

#javascript #jquery #массивы #цикл while

Вопрос:

У меня есть массив (через ajax), который выглядит следующим образом:

 data[i].id: gives the id of user i
data[i].name: gives the name of user i
  

Я хочу вывести массив следующим образом:

 X Leonardo Da Vinci
X Albert Einstein
X William Shakespeare
...
  

Крестик — это изображение (x.gif ) это должно быть интерактивным. При нажатии он должен перейти к functiontwo(), передавая данные параметра[i].id. Functiontwo откроет диалоговое окно jquery с вопросом «Удалить идентификационные данные [i].id»?

Я знаю, что это не может быть слишком сложно сделать, но, похоже, я не могу в этом разобраться… Это то, что у меня есть до сих пор:

 function functionone() {


    $.ajax({
        type : 'POST',
        url : 'post.php',
        dataType : 'json',
        success : function(data){

            var message = "";
            var i = 0;


            while (i < (data.length - 1))
                            {
                 var myvar = data[i].id;
                 message = message   "<div class="   data[i].id   "><img src=x.gif></div>"   data[i].name   "<br />";


                 $('#somediv').html(message).fadeIn('fast');
                  $("."   data[i].id   "").click(function () {
                  functiontwo(myvar);
                });
                i  ;

            }



        }


    });

}

 function functiontwo(id) {
 ...}
  

Я знаю, почему это не работает. Переменная i заполняется снова и снова в цикле while. Когда цикл while останавливается, i — это просто число (в данном случае длина массива), и jquery становится (например):

 $("."   data[4].id   "").click(function () {
                  functiontwo(myvar);
                });
  

, делая интерактивным только последний X.

Как я могу это исправить? Большое спасибо!!!

Редактировать:

Это моя 2-я функция:

  function functiontwo(id) {

  $("#dialogdelete").dialog("open");

     $('#submitbutton').click(function () {

        $('#submitbutton').hide();
        $('.loading').show();
                    $.ajax({
        type : 'POST',
        url : 'delete.php',
        dataType : 'json',
        data: {
            id : id
        },
        success : function(data){

            var mess = data;
            $('.loading').hide();
            $('#message').html(mess).fadeIn('fast');


        }
    });

    //cancel the submit button default behaviours
    return false;



        });


    }
  

В delete.php там нет ничего особенного, я использовал $_POST[‘id’].

Комментарии:

1. Шаг первый — использовать bind, а не click, для создания прослушивателя событий.

2. Не могли бы вы быть более конкретными? Я пытался $("." data[id].id "").bind('click',function() { make_event_handler(myvar)}); , но это тоже не сработало…

3. Смотрите мой ответ ниже. решение класса проще

Ответ №1:

Как я указал в своем комментарии. Проблема заключается в .click части. Либо используйте bind, либо используйте класс для всех элементов и событие щелчка, подобное этому $('.classnamehere').live('click',function () { // stuff });

Комментарии:

1. Я изменил .click часть на $("." data[i].id "").live('click',function () {functiontwo(myvar)}); . Это делает каждый X интерактивным, однако параметр, который передается функции (в случае myvar), всегда один и тот же: идентификатор последнего пользователя.

2. Вам нужно передать данные [i].id как идентификатор, а не класс. И применить один и тот же класс для каждого объекта. И live-listner может быть создан вне функции. Смотрите мой новый ответ

Ответ №2:

 function functionone() {

    $.ajax({
        type : 'POST',
        url : 'post.php',
        dataType : 'json',
        success : function(data){

            var message = "";
            var i = 0;

            while (i < (data.length - 1))
                            {
                 var myvar = data[i].id;
                 message = message   "<div class="clickable" id="   data[i].id   "><img src=x.gif></div>"   data[i].name   "<br />";

                 $('#somediv').html(message).fadeIn('fast');
                i  ;
            }
        }
    });
}

$('.clickable').live('click',function () {
    alert($(this).attr('id')   ' this is your ID');
});
  

Комментарии:

1. При ближайшем рассмотрении оказывается, что это работает не так, как должно быть. Он передает параметр, но он «запоминает» его слишком долго: нажатие X переходит к functiontwo (id), который выдает пользователю jquerypopup с сообщением «удалить этого пользователя?» и кнопкой отправки. Когда вы нажимаете на крестик рядом с пользователем 1, закрываете диалоговое окно (не нажимая кнопку отправки), нажимаете Крестик рядом с пользователем 3 и нажимаете отправить, удаляется не только пользователь3 (что ему и нужно сделать), но и пользователь1 … это, конечно, не то, что мне нужно… Как я могу исправить эту последнюю проблему? спасибо!

2. Ну, это зависит от того, как работает ваша 2-я функция. Проблема не в том, что здесь опубликовано. Вы проверили свой код на уникальность идентификаторов?

3. Да, я уверен, что идентификаторы уникальны. Я отредактирую свой первый пост и добавлю туда свою 2-ю функцию.

4. Я думаю, ваша проблема в том, что когда вы нажимаете на поле, вы не сбрасываете содержимое диалогового окна. Используйте Firebug (и FF), чтобы проверить, когда скрипт (delete.php ) загружается.

Ответ №3:

Обычный трюк заключается в создании отдельной функции для создания обработчика событий. Отдельная функция получит i в качестве параметра, и сгенерированное событие сможет сохранить эту переменную для себя

 make_event_handler(name){
    return function(){
        functiontwo(name);
    };
}

...

$("."   data[i].id   "").click( make_event_handler(myvar) );
  

Комментарии:

1. Думал, что это помогло бы, но, по-видимому, ничего не изменилось. Последний X является интерактивным, остальные — нет…

2. Это должно было сработать. Можете ли вы предоставить минимальный пример функционирования (возможно, в JSFiddle)