I know that augmenting native DOM functions isn't always the best or most popular solution, but this works fine for modern browsers.
Element.prototype.remove = function() {
this.parentElement.removeChild(this);
}
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
for(var i = this.length - 1; i >= 0; i--) {
if(this[i] && this[i].parentElement) {
this[i].parentElement.removeChild(this[i]);
}
}
}
And then you can remove elements like this
document.getElementById("my-element").remove();
or
document.getElementsByClassName("my-elements").remove();
Note: this solution doesn't work for IE 7 and below. For more info about extending the DOM read this article.
EDIT: Reviewing my answer in 2019, node.remove() has come to the rescue and can be used as follows (without the polyfill above):
document.getElementById("my-element").remove();
or
[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());
These functions are available in all modern browsers (not IE). Read more on MDN.
Answer from Johan Dettmar on Stack OverflowVideos
I know that augmenting native DOM functions isn't always the best or most popular solution, but this works fine for modern browsers.
Element.prototype.remove = function() {
this.parentElement.removeChild(this);
}
NodeList.prototype.remove = HTMLCollection.prototype.remove = function() {
for(var i = this.length - 1; i >= 0; i--) {
if(this[i] && this[i].parentElement) {
this[i].parentElement.removeChild(this[i]);
}
}
}
And then you can remove elements like this
document.getElementById("my-element").remove();
or
document.getElementsByClassName("my-elements").remove();
Note: this solution doesn't work for IE 7 and below. For more info about extending the DOM read this article.
EDIT: Reviewing my answer in 2019, node.remove() has come to the rescue and can be used as follows (without the polyfill above):
document.getElementById("my-element").remove();
or
[...document.getElementsByClassName("my-elements")].map(n => n && n.remove());
These functions are available in all modern browsers (not IE). Read more on MDN.
Crossbrowser and IE >= 11:
document.getElementById("element-id").outerHTML = "";
What's happening is that the form is getting submitted, and so the page is being refreshed (with its original content). You're handling the click event on a submit button.
If you want to remove the element and not submit the form, handle the submit event on the form instead, and return false from your handler:
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;
}
But you don't need (or want) a form for that at all, not if its sole purpose is to remove the dummy div. Instead:
HTML:
<input type="button" value="Remove DUMMY" onclick="removeDummy()" />
JavaScript:
function removeDummy() {
var elem = document.getElementById('dummy');
elem.parentNode.removeChild(elem);
return false;
}
However, that style of setting up event handlers is old-fashioned. You seem to have good instincts in that your JavaScript code is in its own file and such. The next step is to take it further and avoid using onXYZ attributes for hooking up event handlers. Instead, in your JavaScript, you can hook them up with the newer (circa year 2000) way instead:
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;
}
}
...then call pageInit(); from a script tag at the very end of your page body (just before the closing </body> tag), or from within the window load event, though that happens very late in the page load cycle and so usually isn't good for hooking up event handlers (it happens after all images have finally loaded, for instance).
Note that I've had to put in some handling to deal with browser differences. You'll probably want a function for hooking up events so you don't have to repeat that logic every time. Or consider using a library like jQuery, Prototype, YUI, Closure, or any of several others to smooth over those browser differences for you. It's very important to understand the underlying stuff going on, both in terms of JavaScript fundamentals and DOM fundamentals, but libraries deal with a lot of inconsistencies, and also provide a lot of handy utilities โ like a means of hooking up event handlers that deals with browser differences. Most of them also provide a way to set up a function (like pageInit) to run as soon as the DOM is ready to be manipulated, long before window load fires.
Just do this
element.remove();
Try it here LOOK
http://jsfiddle.net/4WGRP/
You're confusing the string identifier 'warning' with a warning variable:
let warning = document.createElement('p');
This is setting the variable warning to a paragraph element.
if (document.getElementById(warning) == null){
Here you're passing that warning variable, which is set to an HTML element to getElementById, so it's never going to find it.
const error = getElementById(warning)
error.remove()
Here you're making that same mistake.
With some adjustments it'll work a bit better:
function createWarning(message){
const existingWarning = document.getElementById('warning');
if (existingWarning) {
existingWarning.remove();
}
const warning = document.createElement('p');
warning.innerHTML = message;
warning.classList.add('warning');
warning.setAttribute('id','warning');
input.insertAdjacentElement('afterend',warning);
}
Call getElementById from document and use the string-based ID for 'warning' instead of the reference to the element as your argument to document.getElementById() Corrected code is below:
const input = document.querySelector('#emailInput');
const form = document.querySelector('#myForm')
const button = document.querySelector('#notify')
const validRegex = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
form.addEventListener('submit', function (e){
e.preventDefault()
});
button.addEventListener('click', validateEmail)
function validateEmail(){
let inputValue = input.value;
if(inputValue.match(validRegex)){
createWarning('Email sent!')
}
else if(inputValue == ''){
createWarning('Please provide an email!');
}
else{
createWarning('Please provid a valid email address')
}
}
function createWarning(message){
let warning = document.createElement('p');
let warningId = 'warning';
if (document.getElementById(warningId) == null) {
warning.innerHTML = message;
warning.classList.add('warning');
warning.setAttribute('id', warningId);
input.insertAdjacentElement('afterend',warning);
}
else {
const error = document.getElementById(warningId)
error.remove()
}
}
@import url('https://fonts.googleapis.com/css2?family=Libre+Franklin:wght@300;600;700&display=swap');
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
body{
background-color: whitesmoke;
font-size: 20px;
font-family: 'Libre Franklin', sans-serif;
display: flex;
flex-direction: column;
align-content: space-between;
height: 100vh;
}
.container{
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-evenly;
height: 100%;
}
.title{
display: flex;
align-items: center;
justify-content: center;
}
.company-name{
font-family: 'Libre Franklin', sans-serif;
font-weight: 700;
font-size: 20px;
}
.dot{
color: hsl(223, 87%, 63%);
}
.intro{
display: flex;
flex-direction: column;
align-items: center;
align-content: space-between;
gap: 15px;
justify-content: space-between;
}
.subtitle h2{
font-weight: 600;
font-size: 20px;
}
.launching{
color: rgba(190, 160, 83, 0.602);
font-weight: 200;
}
.paragraph p{
font-weight: 300;
font-size: 14px;
color: rgb(41, 37, 0);
}
form{
display: flex;
align-items: center;
align-content: space-between;
flex-direction: column;
}
#emailInput{
border-radius: 50px;
border: 1px solid hsl(223, 100%, 88%);
width: 100%;
padding: 10px 35px;
font-family: 'Libre Franklin', sans-serif;
}
.warning{
color: hsl(354, 100%, 66%);
font-size: small;
font-family: 'Libre Franklin', sans-serif;
margin: 5px;
}
#emailInput:focus{
outline: none;
}
#notify{
background-color: hsl(223, 87%, 63%);
color: whitesmoke;
border-radius: 50px;
padding: 10px 20px;
width: 100%;
border: 1px solid rgba(88, 78, 78, 0);
font-weight: bold;
margin-top: 15px;
}
.social-media{
width: 200px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
align-content: space-between;
justify-items: center;
}
.around{
display: flex;
align-items: center;
justify-content: center;
text-align: center;
border: 1px solid hsla(0, 0%, 59%, 0.192);
border-radius: 50%;
width: 30px;
height: 30px;
}
.fab{
color: hsl(223, 87%, 63%);
font-size: medium;
}
.attribution { font-size: 11px; text-align: center; }
.attribution a { color: hsl(228, 45%, 44%); }
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- displays site properly based on user's device -->
<link rel="icon" type="image/png" sizes="32x32" href="./images/favicon-32x32.png">
<link rel="stylesheet" href="style.css">
<script src="https://kit.fontawesome.com/b5c693247f.js" crossorigin="anonymous"></script>
<title>Frontend Mentor | Ping coming soon page</title>
</head>
<body>
<div class="container">
<div class="title">
<h1 class="company-name">PING<span class="dot">.</span></h1>
</div>
<div class="intro">
<div class="subtitle"><h2><span class="launching">We are launching</span> soon!</h2></div>
<div class="paragraph"><p>Subscribe and get notified</p></div>
<div class="form-container">
<form id="myForm" name="myForm">
<input type="email" id="emailInput" name="emailInput" placeholder="Your email address...">
<button type="submit" id="notify">Notify Me</button>
</form>
</div>
</div>
<div class="img-container">
<img src="images/illustration-dashboard.png" alt="Dashboard Image" width="300" height="250">
</div>
<div class="social-media">
<div class="around"><i class="fab fa-facebook-f"></i></div>
<div class="around"><i class="fab fa-twitter"></i></div>
<div class="around"><i class="fab fa-instagram"></i></div>
</div>
</div>
<footer>
<p class="attribution">
Challenge by <a href="https://www.frontendmentor.io?ref=challenge" target="_blank">Frontend Mentor</a>.
Coded by <a href="https://github.com/HBortolim">Henrique Bortolim</a>.
</p>
</footer>
<script src="app.js"></script>
</body>
</html>