Вопрос

Я использую Dojo Drag and Drop.Когда пользователь добавляет элемент в контейнер (div dojoType='dojo.dnd.Source'), мне нужно поместить эти данные в форму, чтобы я мог позже обработать их на сервере, когда пользователь отправит всю страницу.Эта часть работает.Затем, чтобы удалить элемент, я разрешаю им перетащить его в контейнер «мусор».Мне трудно понять, как удалить элемент из скрытых полей.У меня уже есть код подписки/события для вызова следующих двух функций.

Можете ли вы сообщить мне, есть ли лучший способ выполнить функцию removeGoalFromHiddenFields?«Подцелей» может быть много.

Я собираюсь начать тестирование с тем, что у меня есть ниже, но у меня есть некоторые сомнения по этому поводу.

Спасибо,

Нил Уолтерс

   function addGoalToHiddenFields( goalText){
      var field = document.createElement("input");
      field.setAttribute("type","hidden");
      field.setAttribute("value",goalText);
      field.setAttribute("name","subgoal");

      //add new hidden-element to the existing form
      document.getElementById("form1").appendChild(field);
   }

   function removeGoalFromHiddenFields( goalText){

      //remove hidden field 
      nodes = document.getElementById("form1")
      for (i=0;i<nodes.length ;i++ )
           {
             var pos = nodes[i].innerHTML.IndexOf(goalText)
             if (pos > 0)
             {
                 nodes.removeChild(node[i]);

             }
           }

}

Кроме того, могу ли я сделать это вместо этого:узлы = document.getElementById("подцель")

Это было полезно?

Решение

Я предполагаю, что вам здесь нужна функциональность додзё.запрос.

Попробуйте что-то вроде:

dojo.query("#form1 input[value=\"" + goalText + "\"]").forEach(function(field) {
    field.parentNode.removeChild(field)
});

Другие советы

field.setAttribute("тип","скрытый");

Не используйте setAttribute в документах HTML.В IE много ошибок.Используйте обычные свойства DOM-HTML, которые также легче читать:

field.type= 'hidden';

var pos = node[i].innerHTML.IndexOf(goalText)

Искать значение в HTML-разметке глупо и не будет работать, если targetText содержит такой символ, как «<» или «&», который HTML будет экранировать.

Для приведенного выше кода это выглядит так nodes[i] должен быть одним из <input> элементы, которые вы туда добавили, и в этом случае innerHTML бесполезен, поскольку он будет искать только содержимое ввода, что не имеет значения, поскольку ввод является пустым элементом.Вместо этого посмотрите на value свойство, которое вы туда поместили:

var input= nodes[i];
if (input.name=='subgoal' && input.value==goalText)
    input.parentNode.removeChild(input);

Кроме того, могу ли я сделать это вместо этого:узлы = document.getElementById("подцель")

Нет, поскольку элементы подцели не имеют идентификаторов.Либо получите по имени:

var subgoals= form.getElementsByName('subgoal');

(что то же самое, что и DOM-0:)

var subgoals= form.elements.subgoal;

или добавьте идентификатор к каждой подцели, чтобы вам было легче найти ее позже:

field.id= 'id-'+goalText;

вышеперечисленное не будет работать, опять же, если вы можете использовать специальные символы в targetText.

Альтернативно, сохраните свой собственный поиск в JavaScript, а не помещайте все в DOM:

var subgoalfields= {};
...
// on add
subgoalfields[goalText]= field;
...
// on remove
subgoalfields[goalText].parentNode.removeChild(subgoalfields[goalText]);
delete subgoalfields[goalText];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top