Логика/вопрос JavaScript RemoveChild
-
20-09-2019 - |
Вопрос
Я использую 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];