head
и прочие body
.XMLHttpRequest
вызывает событие readystatechange\onprogress
несколько раз с промежуточными результатами, а также имеет метод abort
для остановки. Однако с современными скоростями интернета весь контент скорее всего будет загружен быстрее чем браузер сможет остановить зарос.function parseHead(text) {
if(!parseHead.parser)
parseHead.parser = new DOMParser();
return parseHead.parser.parseFromString(
text.match(/<head>[\s\S]*?<\/head>/i)[0],
"text/html"
).head;
}
function getHead(url) {
return new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url);
xhr.onreadystatechange = function(event) {
if (xhr.readyState === 3) { // если частично загружено
if(/<\/head>/i.test(xhr.responseText)) { // если в загруженном есть закрывающий тег </head>
resolve(parseHead(xhr.responseText)); // парсим текст и возвращаем head
xhr.onreadystatechange = null; // убираем дальнейшую обработку изменения состояния
xhr.abort(); // останавливаем дальнейшую загрузку
}
} else if (xhr.readyState === 4){ // если запрос завршён
if(xhr.status === 200) // если завершён успешно
resolve(parseHead(xhr.responseText)); // парсим текст и возвращаем head
else
reject(xhr);
}
};
xhr.send();
})
}
getHead('/').then(console.log, console.error)
getComputedStyle
даёт только не композитные значения, т.е. вы можете запросить borderTopColor
, но не borderColor
и не border
.getComputedStyle
возвращает итерируемый объект CSSStyleDeclaration. getPropertyValue
, camelCase свойством или kebab-case свойством - любой вариант верен. buttonClickHandler = id => {
const delay = randomTime();
setTimeout(() => {
this.setState({
array: [
...this.state.array,
`${asd()} Button ${id} was pressed with ${delay}s timeout`
]
}); // распаковываю массив array из стейта и добавляю "Нажата кнопка"
}, delay * 1000);
};
e.stopPropagation
- можно заюзать e.stopImmediatePropagation
. :)let btn = $(this);
$
- jquery
, this
- HTMLElement
, $(this)
- объект jquery
. jquery
нет свойства parentNode
. У него есть метод parent()
.parentNode
есть у HTMLElement
.remove()
, который вам советуют, есть и там и там, но лучше вам понимать что вы делаете, чем полагаться на удачные совпадения. var navItems = Array.from({length: 10}, (_, id) => ({
id,
title: 'ещё',
children: []
}));
navItems.find(item => item.id === 5).children = navItems.slice(5, navItems.length);
console.log(navItems)
var item = navItems.find(item => item.id === 5);
console.log(
Object.isFrozen(item),
Object.getOwnPropertyDescriptor(item, 'children').writable,
Object.isFrozen(item.children)
)
var children = navItems.find(item => item.id === 5).children;
children.splice(0, children.length, ...navItems.slice(5, navItems.length));
'{ foo: "b\"ar" }'
превращается в памяти в строку { foo: "b"ar" }
после чего JSON.parse, пытаясь её распарсить, естественно, спотыкается. { foo: "b\"ar" }
сразу строкой, он именно таком виде и идёт в память. blocks: JSON.parse('[{"type":"header","data":{"text":"Тест","level":1}},{"type":"paragraph","data":{"text":"Тут вот <a href=\\"https://wordpress.org/plugins/woo-variations-style-buttons/\\">ссылка</a>."}}]')