Чистяков Денис
<!DOCTYPE html>
<html>
<head>
<title>DOM</title>
</head>
<body>
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
</body>
</html>
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
document.getElementById('auth') // [object HTMLFormElement]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
document.getElementsByTagName('input') // [object HTMLCollection]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
document.querySelector('#auth') // [object HTMLFormElement]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
document.querySelector('.auth') // [object HTMLFormElement]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
document.querySelector('[name="login"]') // [object HTMLInputElement]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
querySelector
всегда возвращает
document.querySelector('input') // [object HTMLInputElement]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
document.querySelectorAll('input,button') // [object NodeList]
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
Why does document.querySelectorAll return a StaticNodeList rather than a real Array?
// Вариант №1
var collection = document.querySelectorAll('input,button');
for (var i = 0, len = collection.length; i < len; i++) {
var elem = collection[i];
}
// Вариант №2
var elems = document.querySelectorAll('input,button');
var elemsList = Array.prototype.slice.call(elems);
elemsList.forEach(function(elem) {
…
});
// Вариант №3
var elemsList = Array.from(document.querySelectorAll('input,button'));
elemsList.forEach(function(elem) {
…
});
var form = document.getElementById('auth');
form.getAttribute('action'); // '/login/'
form.hasAttribute('method'); // false
form.setAttribute('method', 'POST');
form.hasAttribute('method'); // true
form.getAttribute('method'); // 'POST'
form.removeAttribute('method');
form.hasAttribute('method'); // false
form.getAttribute('data-form-value'); // '123'
form.dataset.formValue; // '123'
form.dataset.hasOwnProperty('formValue'); // true
form.dataset.fooBarBazBaf = 'boo'; // data-foo-bar-baz-baf="boo"
form.hasAttribute('data-foo-bar-baz-baf'); // true
<form class="auth form" id="auth" data-form-value="123" action="/login/">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button>Войти</button>
</form>
form.getAttribute('action'); // "/"
form.getAttribute('method'); // null
form.getAttribute('id'); // "auth"
form.action; // "https://yandex.ru/login/"
form.method; // "get"
form.id; // "auth"
form.className; // 'auth form'
form.className += ' login-form'; // 'auth form login-form'
form.classList.add('login-form');
form.classList.item(1); // 'form'
form.classList.item(2); // 'login-form'
form.classList.contains('login-form'); // true
form.classList.remove('login-form');
var elem = document.createElement('span');
elem.className = 'error';
elem.setAttribute('id', 'auth-error');
elem.setAttribute('status', 'auth-error');
elem.textContent = 'Введен неверный логин или пароль';
document.body.appendChild(elem);
var clone = elem.cloneNode(true);
clone.id = 'mail-error';
clone.textContent = 'Не удалось отправить письмо';
document.body.appendChild(clone);
<form class="auth form" id="auth" data-form-value="123"
action="/login/" onsubmit="submitHandler()">
<input type="text" value="" name="login">
<input type="password" value="" name="password">
<button onclick="clickHandler()">Войти</button>
</form>
var form = document.getElementById('auth');
form.addEventListener('submit', submitHandler);
var button = document.querySelector('button');
button.addEventListener('click', function(event) {
console.log(this, event);
});
button.addEventListener('click', clickHandler);
button.addEventListener('click', yetAnotherClickHandler);
this
) всегда
является DOM-узел на котором обрабатывается событиеaddEventListener
event
target
— узел на котором фактически произошло событиеaltKey
— была ли нажата клавиша alt во время событияctrlKey
— была ли нажата клавиша ctrl во время событияshiftKey
— была ли нажата клавиша shift во время событияtype
— тип события (click
, submit
, etc) строкой
var button = document.querySelector('button');
button.addEventListener('click', clickHandler, false);
button.addEventListener('click', yetAnotherClickHandler, false);
var button = document.querySelector('button');
button.addEventListener('click', clickHandler, true);
button.addEventListener('click', yetAnotherClickHandler, true);
false
и события всплывают
var button = document.querySelector('button');
button.addEventListener('click', function(event) {
event.stopPropagation();
}, false);
var button = document.querySelector('button');
button.addEventListener('click', function(event) {
event.stopPropagation();
}, true);
stopImmediatePropagation
так же отменяет всплытие /
погружение, но так же отменяет все следующие обработчики на узле
var form = document.getElementById('auth');
form.addEventListener('submit', function(event) {
console.log(event.target);
event.preventDefault();
});
document.addEventListener('click', function(event) {
event.preventDefault();
if (event.target.tagName === 'A') {
if (event.target.classList.contains('more')) {
openMorePopup();
} else {
console.log(event.target.href);
}
}
});