Важно: событие не сработает, если количество элементов в NodeList было изменёно.
<div id="raz10"><input type="button" value="Нажать"></div> <script> var div = document.querySelector('#raz10'); input = div.childNodes; input[0].onclick = function() { alert('Не работает'); } div.innerHTML += '<input type="button" value="Я вновь созданный">'; </script>
<div id="raz10"><input type="button" value="Нажать"></div> <script> var div = document.querySelector('#raz10'); input = div.childNodes; div.innerHTML += '<input type="button" value="Я вновь созданный">'; input[0].onclick = function() { alert('Работает'); } </script>
Как удалить элемент на JavaScript
При клике на нём же:<button onclick="this.parentNode.removeChild(this);">Вариант 1</button> <button onclick="this.remove();">Вариант 2</button> <button onclick="this.outerHTML='';">Вариант 3</button>
Как добавить тег HTML
<style> #raz div { transition: 3s; opacity: 0; } </style> <div id="raz"> <input type="button" value="Добавить"> </div>
appendChild() в конец
<script> document.querySelector('#raz input').onclick = function() { var theDiv = document.createElement('div'); // создать новый тег div theDiv.innerHTML = 'HTML-содержимое'; // его содержимое this.parentNode.appendChild(theDiv); // поместить новый тег последним в div с id="raz" (вместо this.parentNode может быть любой другой элемент DOM) getComputedStyle(theDiv).opacity; theDiv.style.opacity = '1'; } </script>
insertBefore() в начало
<script> document.querySelector('#raz input').onclick = function() { var theDiv = document.createElement('div'); theDiv.innerHTML = 'HTML-содержимое'; this.parentNode.insertBefore(theDiv, this.parentNode.firstChild); // поместить новый тег первым в div с id="raz" getComputedStyle(theDiv).opacity; theDiv.style.opacity = '1'; } </script>
insertBefore() после конкретного элемента
<script> document.querySelector('#raz input').onclick = function() { var theDiv = document.createElement('div'); theDiv.innerHTML = 'HTML-содержимое'; this.parentNode.insertBefore(theDiv, this.nextSibling); getComputedStyle(theDiv).opacity; theDiv.style.opacity = '1'; } </script>
insertBefore() до указанного элемента
<script> document.querySelector('#raz input').onclick = function() { var theDiv = document.createElement('div'); theDiv.innerHTML = 'HTML-содержимое'; this.parentNode.insertBefore(theDiv, this.previousSibling); getComputedStyle(theDiv).opacity; theDiv.style.opacity = '1'; } </script>
innerHTML внутри элемента (взять содержимое в новый тег)
<style> #raz8 span { display: inline-block; padding: 3px; border: 1px solid; } </style> <button type="button" id="raz8">новый тег внутри</button> <script> (function(){ var i = 1; document.querySelector('#raz8').onclick = function() { this.innerHTML = '<span style="border-color: rgba(255,0,0,'+i+');">'+this.innerHTML+'</span>'; i = i - 0.1; } })() </script>
Если есть события JS на тегах внутри элемента, то можно как тут
- создать нового потомка,
- переместить во вновь созданного потомка всех остальных потомков.
replaceChild(newChild, oldChild) снаружи элемента (окружить новым тегом)
<style> .raz9 { display: inline-block; padding: 3px; border: 1px solid rgba(255,0,0,0); transition: 3s; } </style> <button type="button" id="raz9">новый тег снаружи</button> <script> document.querySelector('#raz9').onclick = function() { var theSpan = document.createElement('span'); theSpan.setAttribute('class', 'raz9'); this.parentNode.replaceChild(theSpan, this); // заменить текущий элемент на созданный theSpan.appendChild(this); // содержимое созданного элемента будет текущий элемент getComputedStyle(theSpan).borderTopColor; theSpan.style.borderColor = 'rgba(255,0,0,1)'; } </script>
Как добавить текст
Вместо document.createElement(tagName) использовать document.createTextNode(text). Так же и с insertBefore().
<div id="raz7"> <input type="button" value="Добавить текст"> </div> <script> (function(){ var i = 1; document.querySelector('#raz7 input').onclick = function() { var theText = document.createTextNode(' текст'+i); this.parentNode.appendChild(theText); i++; } })() </script>
Как переместить элемент
Отличие в том, что элемент уже существует. Так же и с insertBefore().
<style> #raz5, #raz6 { height: 50px; padding: 5px; } #raz5 { background: green; } #raz6 { background: blue; } </style> <div id="raz5"> <input type="button" value="Перенести в синий прямоугольник"> </div> <div id="raz6"></div> <script> document.querySelector('#raz5 input').onclick = function() { document.querySelector('#raz6').appendChild(this); } </script>
Как скопировать (клонировать) элемент
Сделать дубликат кода с помощью cloneNode(true|false)
<button type="button" class="raz1">1</button><button type="button" class="raz1">2</button> <script> Array.prototype.slice.call(document.querySelectorAll('.raz1')).forEach(function(a, index, all) { a.addEventListener('click', function() { var theI = a.cloneNode(true); a.parentNode.insertBefore(theI, a.nextSibling); alert(index+1+' из '+all.length); }, false); }) </script>
Как запретить повторный onclick
<input type="button" value="Добавить после input" id="dobavit"> <script> document.querySelector('#dobavit').onclick = function() { theDiv = document.createElement('div'); theDiv.innerHTML = 'содержащий текст'; this.parentNode.insertBefore(theDiv, this.nextSibling); this.onclick = null; } </script>
Как создать элемент, а потом его же удалить
Пример взят отсюда.
<input type="button" value="Новый CSS" onclick="include('on')"> <input type="button" value="Старый CSS" onclick="include('off')"> <script> var include = (function(){ return function (status){ if(status == 'on'){ // если include('on') theStyle = document.createElement('style'); // создать новый тег style theStyle.innerHTML = 'body {background: DarkSalmon;}'; document.querySelector('head').appendChild(theStyle); // тег style поместить в конец head }else{ theStyle.parentNode.removeChild(theStyle); // удалить созданный тег style } } })(); </script>
В чём отличие innerHTML от appendChild(), removeChild()
innerHTML меняет всё содержимое тега.
<input type="button" value="Новый CSS" onclick="include1('on')"> <input type="button" value="Попытка вернуть старый CSS" onclick="include1('off')"> <input type="button" value="Перезагрузить страницу" onclick="location.reload();"> <script> var include1 = (function(){ return function (status){ if(status == 'on'){ // если include1('on') document.querySelector('head').innerHTML = '<style>body {background: DarkSalmon;}</style>'; // сменить содержимое тега head на прописанное в кавычках }else{ // иначе document.querySelector('head').innerHTML = ''; } } })(); </script>
Можно с помощью .replace и регулярных выражений добиться нужного результата:
<input type="button" value="Новый CSS" onclick="include2('on')"> <input type="button" value="Старый CSS" onclick="include2('off')"> <script> var include2 = (function(){ return function (status){ if(status == 'on'){ document.querySelector('head').innerHTML = document.querySelector('head').innerHTML.replace(/$/g, '<style class="newStyle">body {background: DarkSalmon;}</style>'); }else{ document.querySelector('head').innerHTML = document.querySelector('head').innerHTML.replace(/<style class="newStyle">[\s\S]*?<\/style>/g, ''); } } })(); </script>
Или чтобы изначально в HTML был пустой тег
<style class="nStyle"></style> <input type="button" value="Новый CSS" onclick="include3('on')"> <input type="button" value="Старый CSS" onclick="include3('off')"> <script> var include3 = (function(){ return function (status){ if(status == 'on'){ document.querySelector('style.nStyle').innerHTML = 'body {background: DarkSalmon;}'; }else{ document.querySelector('style.nStyle').innerHTML = ''; } } })(); </script>
Кто медленнее? innerHTML быстрее работает в Firefox, W3C DOM - в Хроме (анализ). IE везде отстающий, но с W3C DOM у него намного хуже (анализ).
Кстати, есть ещё самый резвый document.write. Он выводит содержимое после тега script во время загрузки страницы. То есть никаких onclick применить не удастся. Пример использования: раз, два.
4 комментария:
Спасибо за очередную шпору.
Также подтверждаю интерес к статьям по работе JS с базами данных (MySQL & MongoDB).
Конечно, понятно, что это уже не front-end, но можно будет потихоньку приближаться к обучение по разработке SPA.
:)