Come rimuovere un elemento HTML utilizzando Javascript?


124

Sono un principiante totale. Qualcuno può dirmi come rimuovere un elemento HTML utilizzando il Javascript originale non jQuery.

index.html

<html>
<head>
 <script type="text/javascript" src="myscripts.js" > </script>
 <style>
 #dummy {
  min-width: 200px;
  min-height: 200px;
  max-width: 200px;
  max-height: 200px;
  background-color: #fff000;
 }
 </style>
</head>
<body>
 <div id="dummy"></div>

 <form>
  <input type="submit" value="Remove DUMMY" onclick="removeDummy(); "/>
 </form>
</body>

myscripts.js

function removeDummy() {
 var elem = document.getElementById('dummy');
 elem.parentNode.removeChild(elem);
}

Quello che succede quando clicco sul pulsante di invio, è che scompare per un tempo molto breve e poi riappare immediatamente. Voglio rimuovere completamente l'elemento quando faccio clic sul pulsante.


Cosa succede se faccio clic su di esso, individuo un errore e premo Stop ?
alex

Scusate, è di argomento ma in realtà è davvero divertente, che lui / lei si sia chiamato "Newbie Coder" e ora il profilo ha una reputazione di circa 9000. Chiedere qualcosa ai "bei vecchi tempi" è davvero redditizio al giorno d'oggi. :)
Rene

Risposte:


189

Quello che sta succedendo è che il modulo viene inviato e quindi la pagina viene aggiornata (con il suo contenuto originale). Stai gestendo l' clickevento su un pulsante di invio.

Se desideri rimuovere l'elemento e non inviare il modulo, gestisci invece l' submitevento sul modulo e torna falsedal tuo gestore:

HTML:

<form  onsubmit="return removeDummy(); ">
    <input type="submit" value="Remove DUMMY"/>
</form>

JavaScript:

function removeDummy() {
    var elem = document.getElementById('dummy');
    elem.parentNode.removeChild(elem);
    return false;
}

Ma non hai affatto bisogno (o vuoi) un modulo per questo, non se il suo unico scopo è rimuovere il div fittizio. Anziché:

HTML:

<input type="button" value="Remove DUMMY" onclick="removeDummy()" />

JavaScript:

function removeDummy() {
    var elem = document.getElementById('dummy');
    elem.parentNode.removeChild(elem);
    return false;
}

Tuttavia , quello stile di impostazione dei gestori di eventi è antiquato. Sembra che tu abbia un buon istinto in quanto il tuo codice JavaScript è nel suo file e così via. Il passaggio successivo è quello di andare oltre ed evitare di utilizzare gli onXYZattributi per collegare i gestori di eventi. Invece, nel tuo JavaScript, puoi collegarli con il modo più recente (circa anno 2000) invece:

HTML:

<input id='btnRemoveDummy' type="button" value="Remove DUMMY"/>

JavaScript:

function removeDummy() {
    var elem = document.getElementById('dummy');
    elem.parentNode.removeChild(elem);
    return false;
}
function pageInit() {
    // Hook up the "remove dummy" button
    var btn = document.getElementById('btnRemoveDummy');
    if (btn.addEventListener) {
        // DOM2 standard
        btn.addEventListener('click', removeDummy, false);
    }
    else if (btn.attachEvent) {
        // IE (IE9 finally supports the above, though)
        btn.attachEvent('onclick', removeDummy);
    }
    else {
        // Really old or non-standard browser, try DOM0
        btn.onclick = removeDummy;
    }
}

... quindi chiama pageInit();da un scripttag alla fine della tua pagina body(appena prima del </body>tag di chiusura ), o dall'interno window loaddell'evento, anche se ciò accade molto tardi nel ciclo di caricamento della pagina e quindi di solito non va bene per collegare l'evento gestori (succede dopo tutte le immagini sono state finalmente caricate, per esempio).

Si noti che ho dovuto gestire alcune operazioni per gestire le differenze del browser. Probabilmente vorrai una funzione per collegare gli eventi in modo da non dover ripetere quella logica ogni volta. Oppure considera l'utilizzo di una libreria come jQuery , Prototype , YUI , Closure o una qualsiasi delle tante altre per appianare quelle differenze del browser per te. È molto importante capire le cose sottostanti in corso, sia in termini di fondamenti di JavaScript che di fondamenti di DOM, ma le librerie gestiscono molte incoerenze e forniscono anche molte utili utilità, come un mezzo per collegare gestori di eventi che si occupano di differenze del browser. La maggior parte di essi fornisce anche un modo per impostare una funzione (comepageInit) per essere eseguito non appena il DOM è pronto per essere manipolato, molto prima degli window loadincendi.


Modificalo type="button"o inseriscilo return false;nella tua funzione JS
Padiglione

@Pav: penso che continuerò a presentare perché questo è solo un esercizio sperimentale. Farò alcuni progetti che utilizzano submit quindi è meglio che mi ci abitui ... Grazie comunque per l'idea.
Newbie Coder

@ Newbie: ho aggiunto alcune altre note.
TJ Crowder

2
perché non eseguire semplicemente elem.remove ();
Muhammad Umer

1
@ Ghos3t - Un paio di modi: 1. Qualsiasi funzione che chiami da un gestore in stile attributo deve essere globale e lo spazio dei nomi globale è già Really Crowded ™ ed è facile scegliere un nome di funzione che sia in conflitto con qualcos'altro (questo può essere indirizzato utilizzando un oggetto con un nome probabilmente univoco e inserendovi tutti i gestori). 2. Usare il vecchio modo in stile attributo (o assegnare alla onxyzproprietà sull'elemento) consente solo un singolo gestore, e se si assegna alla proprietà si sostituisce quello che era lì, quindi non funziona bene con gli altri. (continua)
TJ Crowder

34

Fallo e basta element.remove();

Provalo qui GUARDA

http://jsfiddle.net/4WGRP/


5
Attento a questo, poiché sembra essere un'aggiunta abbastanza nuova e non ha il supporto completo del browser, vale a dire IE e FF versioni 22 e precedenti ( red-team-design.com/… ).
dule

1
Personalmente aspetterei altri 5 anni per usare questo
slebetman

2
Bene, questo sembra essere supportato in modo errato ora: caniuse.com/#search=remove . Accetterei di usarlo ora. Se hai assolutamente bisogno di supportare IE11, suppongo che un polyfill potrebbe essere facilmente costruito ...
jehon

5
Scrivere codice a prova di futuro è meglio che programmare per il passato. Risparmia il tempo di manutenzione e usa.remove()
Gibolt

9

Dovresti usare input type = "button" invece di input type = "submit".

<form>
  <input type="button" value="Remove DUMMY" onclick="removeDummy(); "/>
 </form>

Checkout Mozilla Developer Center per risorse HTML e JavaScript di base


1
Ho cambiato il tuo collegamento da W3Schools al Mozilla Developer Center. Dai un'occhiata a w3fools.com per il mio ragionamento ... A parte questo, buona risposta :)
Alastair Pitts

2
@ Alastair Pitts - è ok. Voglio solo indicare PO a tutorial di base HTML e js ..
CoderHawk

8

Il tuo JavaScript è corretto. Il tuo pulsante ha type="submit"che sta causando l'aggiornamento della pagina.


5

Riappare perché il pulsante di invio ricarica la pagina. Il modo più semplice per evitare che questo comportamento è quello di aggiungere una return falsealla onclickin questo modo:

<input type="submit" value="Remove DUMMY" onclick="removeDummy(); return false;" />

4

Modificare il tipo di input in "pulsante". Come hanno detto TJ e Pav, il modulo viene inviato. Il tuo Javascript sembra corretto e ti lodo per averlo provato in modo non JQuery :)


Penso che continuerò a presentare perché questo è solo un esercizio sperimentale per i miei progetti futuri che utilizza l'invio, quindi è meglio che mi ci
abitui

4

index.html

<input id="suby" type="submit" value="Remove DUMMY"/>

myscripts.js

document.addEventListener("DOMContentLoaded", {
//Do this AFTER elements are loaded

    document.getElementById("suby").addEventListener("click", e => {
        document.getElementById("dummy").remove()
    })

})

3

Questo è il codice giusto. Quello che probabilmente sta accadendo è che il tuo modulo si sta inviando e vedi la nuova pagina (dove l'elemento esisterà di nuovo).


3

Prova a eseguire questo codice nel tuo script .

document.getElementById("dummy").remove();

E si spera che rimuova l'elemento / pulsante.


2

Funziona. Basta rimuovere il pulsante dal "manichino" divse si desidera mantenere il pulsante.

function removeDummy() {
  var elem = document.getElementById('dummy');
  elem.parentNode.removeChild(elem);
  return false;
}
#dummy {
  min-width: 200px;
  min-height: 200px;
  max-width: 200px;
  max-height: 200px;
  background-color: #fff000;
}
<div id="dummy">
  <button onclick="removeDummy()">Remove</button>
</div>


1

Anch'io sono ancora un principiante, ma ecco un modo semplice e facile: puoi usare outerHTML, che è l'intero tag, non solo una parte:

EX: <tag id='me'>blahblahblah</tag>'s innerHTML sarebbe blahblahblah, e outerHTML sarebbe il tutto, <tag id='me'>blahblahblah</tag>.


Quindi, per l'esempio, se vuoi eliminare il tag, sta sostanzialmente cancellando i suoi dati, quindi se cambi il outerHTML in una stringa vuota, è come eliminarlo.

<body>
    <p id="myTag">This is going to get removed...</p>
    <input type="button" onclick="javascript:
        document.getElementById('myTag').outerHTML = '';//this makes the outerHTML (the whole tag, not what is inside it)
    " value="Remove Praragraph">
</body>

Invece, se vuoi semplicemente non visualizzarlo, puoi modellarlo in JS usando le proprietà di visibilità, opacità e visualizzazione.

document.getElementById('foo').style.visibility = hidden;
//or
document.getElementById('foo').style.opacity = 0;
//or
document.getElementById('foo').style.display = none;



Nota che opacity l'elemento viene visualizzato ancora, solo che non puoi vederlo così tanto. Inoltre, puoi selezionare testo, copiare, incollare e fare tutto ciò che potresti fare normalmente, anche se è invisibile.
Visibility si adatta maggiormente alla tua situazione, ma lascerà uno spazio vuoto trasparente grande quanto l'elemento a cui è stato applicato.
Ti consiglio di visualizzare, a seconda di come crei la tua pagina web. Visualizza fondamentalmente eliminando l'elemento dalla tua vista, ma puoi ancora vederlo in DevTools. Spero che questo ti aiuti!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.