Я пытаюсь проверить, существует ли элемент DOM, и если он существует, удалите его, и если он не существует, создайте его.
var duskdawnkey = localStorage["duskdawnkey"];
var iframe = document.createElement("iframe");
var whereto = document.getElementById("debug");
var frameid = document.getElementById("injected_frame");
iframe.setAttribute("id", "injected_frame");
iframe.setAttribute("src", 'http://google.com');
iframe.setAttribute("width", "100%");
iframe.setAttribute("height", "400");
if (frameid) // check and see if iframe is already on page
{ //yes? Remove iframe
iframe.removeChild(frameid.childNodes[0]);
} else // no? Inject iframe
{
whereto.appendChild(iframe);
// add the newly created element and it's content into the DOM
my_div = document.getElementById("debug");
document.body.insertBefore(iframe, my_div);
}
Проверка, если он существует, работает, создание элемента работает, но удаление элемента - нет. По сути, весь этот код вводит iframe в веб-страницу, нажимая кнопку. Я хотел бы, чтобы iframe уже был там, чтобы удалить его. Но по какой-то причине я терплю неудачу.
javascript
dom
Джошуа Редфилд
источник
источник
Ответы:
removeChild
должен быть вызван на родителя, то есть:В вашем примере вы должны делать что-то вроде:
источник
debug
div. ИспользованиеparentNode
- это более общее решение, которое будет работать с любым элементом.В большинстве браузеров есть несколько более краткий способ удаления элемента из DOM, чем вызов
.removeChild(element)
его родителя, то есть просто вызовelement.remove()
. Со временем это, вероятно, станет стандартным и идиоматическим способом удаления элемента из DOM..remove()
Метод был добавлен в DOM Уровень жизни в 2011 году ( обязательство ) и с тех пор был внедрен в Chrome, Firefox, Safari, Opera и Edge. Это не было поддержано ни в одной версии Internet Explorer.Если вы хотите поддерживать более старые браузеры, вам нужно это сделать. Это оказывается немного раздражающим, потому что никто, кажется, не сделал универсальную прокладку DOM, которая содержит эти методы, и потому что мы не просто добавляем метод к одному прототипу; это метод
ChildNode
, который является просто интерфейсом, определенным спецификацией, и недоступен для JavaScript, поэтому мы не можем ничего добавить к его прототипу. Поэтому нам нужно найти все прототипы, которые наследуютсяChildNode
и фактически определены в браузере, и добавить.remove
к ним.Вот схема, которую я придумал, и я подтвердил, что работает в IE 8.
Это не будет работать в IE 7 или ниже, поскольку расширение прототипов DOM невозможно до IE 8 . Я полагаю, однако, что на грани 2015 года большинство людей не должно заботиться о таких вещах.
После того, как вы включите их, вы сможете удалить элемент DOM
element
из DOM, просто вызвависточник
Кажется, мне не хватает представителя, чтобы оставить комментарий, поэтому придется сделать еще один ответ.
Когда вы отменяете связь узла, используя removeChild () или устанавливая свойство innerHTML на родительском объекте, вам также необходимо убедиться, что на него больше ничего не ссылается, иначе он фактически не будет уничтожен и приведет к утечке памяти. Есть много способов, которыми вы могли бы получить ссылку на узел перед вызовом removeChild (), и вы должны убедиться, что те ссылки, которые не вышли из области видимости, явно удалены.
Даг Крокфорд пишет здесь, что обработчики событий известны как причина циклических ссылок в IE, и предлагает явно удалить их следующим образом перед вызовом removeChild ().
И даже если вы берете много мер предосторожности вы можете получить утечки памяти в IE , как описано Jens-Инго Фарли здесь .
И, наконец, не попадитесь в ловушку, думая, что удаление Javascript - это ответ. Похоже, что многие предлагают, но не будут делать эту работу. Вот отличная ссылка на понимание удаления от Kangax.
источник
element.parentNode.removeChild
удалить элементы, они остаются живыми и на них все еще могут ссылаться. Они просто не видны в обычном дереве.Использование Node.removeChild () сделает всю работу за вас, просто используйте что-то вроде этого:
В DOM 4 применялся метод удаления, но браузер плохо поддерживает W3C:
Но вы можете использовать метод удаления, если вы используете jQuery ...
Также в новых средах, таких как, вы можете использовать условия для удаления элемента, например,
*ngIf
в Angular и в React, рендеринг различных представлений зависит от условий ...источник
Если вы счастливы использовать блестящую функцию:
Чтобы полностью удалить элемент из DOM.
Чтобы удалить элементы без удаления данных и событий, используйте вместо этого:
JQuery Docs
источник