Как динамически добавлять пользовательские события с помощью jQuery? - PullRequest
0 голосов
/ 29 ноября 2010

Я создаю систему, в которой содержимое загружается динамически из файла json.Файл json описывает контент, созданный jQuery.Я пытаюсь добавлять события динамически.Это работает, но если я пытаюсь добавить события к 2 или более новым элементам dom, они все получают то, что было добавлено последним событием.Я предполагаю, что я делаю что-то не так, ссылаясь на мои новые события dom, но не могу понять, что ...

частичный пример содержания json будет:

{
  "container" : {
    "id" : "container",
    "dom_type" : "<div>",
    "attr" : {
      "class" : "container",
      "id" : "container"
    },
    "children" : {
      "input_submit" : {
         "dom_type" : "<button>",
         "html" : "Submit",
         "attr" : {
            "type" : "submit",
            "id" : "submit",
            "class" : "submit"
            },
         "event": {
            "type": "submit",
            "name": "submitevent"
            }
          },
        "input_cancel" : {
         "dom_type" : "<button>",
         "html" : "Cancel",
         "attr" : {
            "type" : "submit",
            "id" : "cancel",
            "class" : "submit"
            },
         "event": {
            "type": "submit",
            "name": "cancelevent"
            }
          }
        }
      }

Сейчас, моя функция читает файл json, jquery делает его объектом, и с помощью ряда операторов if / then я создаю некоторый dom и вставляю его

// here, json is a javascript object made by jQuery with getJson..
function makeDom (json, dom_container) {
     for (var child in json.children)
        {
            var tp = json.children[child];

            // make dom element and add id (id is required)
            if (!tp['attr'])
            {

                $.error('jquery.myplugin.loadscreen() - erreur: Required child object "attr" not found in ' + child + '.')
            }

            if (undefined == tp['attr']['id'])
            {

                $.error('jquery.myplugin.loadscreen() - erreur: Required parameter "id" not found in "attr" in ' + child + '.');
            }

// ---------------------------------------------------------------
// I guess there is something wrong with this 'el' variable, because
// when I add the event to it, all similar elements get the event
// ----------------------------------------------------------------
    //add ID
            var el = $(tp['dom_type']);
            el.attr('id', tp['attr']['id']);

            // add type if any
            if (tp['attr']['type']) {
                el.attr('type', tp['attr']['type'])
            }

            // add for  if any
            if (tp['attr']['for']) {
                el.attr('for', tp['attr']['for'])
            };

    // add class if any
    if (tp['attr']['class']) {
        el.addClass(tp['attr']['class']);
    }

            // add src if any
            if (tp['attr']['src']) {
                el.attr('src', tp['attr']['src'])
            };

            // add href if any
            if (tp['attr']['href']) {
                el.attr('href', tp['attr']['href'])
            };

            // add html if any
            if (tp['html']) {
                el.html(tp['html']);
            };

       // add value if any
    if (tp['attr']['value']) {
        el.attr('value', tp['attr']['value']);
    };

            // add event if any
            if (tp['event']) {
                el.bind(tp['event']['type'], function(e){
                    //do something;
             });    
    dom_container.append(el);           
}

, и получается, что обе кнопки получают "событие "отменить", как оно было добавлено последним ... Как я могу получить эту переменную 'el', чтобы указать правильный элемент DOM?

1 Ответ

2 голосов
/ 29 ноября 2010

Переменная el используется всеми обработчиками событий в одном замыкании.

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

...