data binding
, которая будет заботится о таких вещах за тебя. Мне лично нравится Vue
, но есть и множество решений по-проще и по-традиционней.value
: const valueDescriptor = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
Object.defineProperty(two, 'value', {
...valueDescriptor,
set(value) {
valueDescriptor.set.call(this, value);
this.dispatchEvent(new Event('input', {
bubbles: true,
cancelable: true,
}));
}
})
p
на span
или выбирать не сам тег, а его содержимое: selectNode
-> selectNodeContents
. width
задаётся в неких единицах измерения, а offsetWidth
возвращает просто число: border.style.width = link.offsetWidth + 'px';
let link = document.querySelector('#link');
let border = document.querySelector('#border');
new ResizeObserver(() => border.style.width = link.offsetWidth + 'px').observe(link);
document.activeElement
.function onInputFocus(){
console.log(this)
}
var inputs = document.getElementsByTagName('input');
for(var i = inputs.length; i--;)
inputs[i].addEventListener('focus', onInputFocus);
или, если нужна поддержка динамически добавленного: document.addEventListener('focus', function(event){
var target = event.target;
if(!target || target.tagName !== 'INPUT') return;
console.log(target)
}, true)
'0'
у undefined
значения, очевидно. В ошибке всё написано.'0'.
Нашли? undefined
). А уж разобраться почему он отсутствует - ваша задача.response.items[0]
items
отсутствует в response
items
из сырого необработанного Response
.let func = eval(userfunc);
func.call(arg);
let func = new Function('return ' + userfunc)();
func.call(arg);
let funcs = {
func1(){console.log('Функция вызвана!!!');};
};
funcs[userfunc].call(arg);
===
точное сравнение с учётом типа. clientWidth
- число, '769'
- строка, число никогда не равно строке. Уберите кавычки.clientWidth
точно будет равно числу с правой стороны. Вы уверены, что это именно то, что вам нужно? Возможно стоит использовать >=
или <=
?function get(value, str) {
for(const key of str.split('.')) {
if(value && key in value) value = value[key];
else return void 0;
}
return value;
}
arr.slice().sort((a,b) => get(b,proper) - get(a,proper));
var newArray = [];
for(var i = 0; i < list.length; i++) { // list - твой список ссылок
var link = list[i].href; // если в списке уже строки, а не элементы, то убрать .href
if(link.indexOf('#') === -1) { // если нет # в строке
newArray.push('определенный текст' + link.slice(5)); // берём определенный текст и добавляем к нему строку начиная с 5 символа
}
}
function getScrollPosition (scrollTarget) {
if (scrollTarget === window) {
return window.pageYOffset || window.scrollY || document.body.scrollTop || 0
}
return scrollTarget.scrollTop
}
function setScroll (scrollTarget, offset) {
if (scrollTarget === window) {
window.scrollTo(0, offset)
return
}
scrollTarget.scrollTop = offset
}
function animScrollTo (el, to, duration) {
const pos = getScrollPosition(el)
if (duration <= 0) {
if (pos !== to) {
setScroll(el, to)
}
return
}
requestAnimationFrame(() => {
const newPos = pos + (to - pos) / Math.max(16, duration) * 16
setScroll(el, newPos)
if (newPos !== to) {
animScrollTo(el, to, duration - 16)
}
})
}
animScrollTo(<элемент-контейнер>, <позиция>, <время на анимацию>)