2011-09-26 2 views
13

Это либо очень простое, либо невозможное.Удалите элемент из DOM только со ссылкой на элемент

Я знаю, что могу это сделать:

var element = document.getElementById('some_element'); 
element.parentNode.removeChild(element); 

... но он чувствует себя грязным. Есть ли более аккуратный и универсально поддерживаемый способ сделать то же самое?

Это кажется - мне, по крайней мере - как там должно быть что-то вроде этого:

document.getElementById('some_element').remove(); 

... но это не работает, и поиск Google/SO не получают какой-либо альтернативы.

Я знаю, что это не имеет значения, но parentNode.removeChild() просто чувствует себя взломанным/беспорядочным/неэффективным/плохой практикой-y.

ответ

28

Это может показаться немного сумбурно, но это стандартный способ удаления элемента из его родителя. Сам элемент DOM может существовать самостоятельно, без parentNode, поэтому имеет смысл, что метод removeChild находится на родительском устройстве.

Метод IMO общего типа .remove() на самом узле DOM может ввести в заблуждение, в конце концов, мы не удаляем элемент из существования, просто из его родителя.

Вы всегда можете создать свои собственные обертки для этой функции. Например.

function removeElement(element) { 
    element && element.parentNode && element.parentNode.removeChild(element); 
} 

// Usage: 
removeElement(document.getElementById('some_element')); 

Или использовать библиотеку DOM, как jQuery, которая обеспечивает связку оберток для вас, например, в JQuery:

$('#some_element').remove(); 

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

function CoolElement(element) { 
    this.element = element; 
} 

CoolElement.prototype = { 
    redify: function() { 
     this.element.style.color = 'red'; 
    }, 
    remove: function() { 
     if (this.element.parentNode) { 
      this.element.parentNode.removeChild(this.element); 
     } 
    } 
}; 

// Usage: 

var myElement = new CoolElement(document.getElementById('some_element')); 

myElement.redify(); 
myElement.remove(); 

Это, в сущности, то, что делает JQuery, хотя это немного более продвинутый, поскольку он оборачивает коллекции DOM узлов, а не только отдельного элемента, как выше.

+0

+1, мне нравится ваш метод удаления элемента , но это приводит к второму вопросу - есть ли способ прототипа методов для элементов DOM (который работает повсюду)? Я пробовал «HTMLElement.prototype» и ужасный «Object.prototype», но не работает везде ... – DaveRandom

+1

Да, есть способы заставить его работать, но это считается плохой практикой. Вот почему такие вещи, как jQuery, существуют, чтобы создать полностью отдельный объект, чтобы содержать элементы, с помощью которых вы можете вызывать методы. Вы также можете расширить jQuery. Я добавлю EDIT к моему ответу. Gimme a sec :) – James

+0

Согласился, отбросив мою ненависть к библиотекам вроде jQ (см. Комментарий к другому ответу), все, что вы говорите, верно. – DaveRandom

1

Ваш код - правильный и лучший способ сделать это.

JQuery имеет what you're looking for:

$("#someId").remove(); 
+0

Я думал, что это, вероятно, так, но я подумал, что попрошу, если бы что-то было ослепительно очевидным, что я пропустил. Я лично избегаю фреймворков JS, потому что IMHO а) очень редко он сэкономит вам любую пропускную способность в конечном счете - мои сценарии с чистым JS имеют тенденцию быть меньше, чем библиотека + мой код на базе библиотеки, и b) это делает вас ленивыми, а вы забыть, как работает язык. Я все равно, хотя, потому что вы отвечаете, безусловно, полезно, когда я игнорирую свои личные мнения ... – DaveRandom

+0

Рамки позволяют забыть, как работает IE (mis-). Quick: Как вы устанавливаете 'float' в Javascript, используя IE? – SLaks

+0

Рамки _encourage_ вы узнаете, как работает Javascript, позволяя забыть, как работает DOM. Они также позволяют быстрее развиваться быстрее. – SLaks

1

Характеристики DOM уровня 4, похоже, приняли «философию jQuery» для выполнения нескольких операций изменения DOM (см. https://dvcs.w3.org/hg/domcore/raw-file/tip/Overview.html#interface-element). Удалить это один из них:

var el = document.getElementById("myEl"); 
el.remove(); 

В это время, он поддерживается только в более поздней версии Chrome, Opera, Firefox, но есть регулировочные шайбы, чтобы залатать это, если вы хотите использовать эту функцию в современном производстве: https://github.com/Raynos/DOM-shim

Wether предпочтительнее removeChild или нет, на данный момент я оставляю undebated.

Смежные вопросы