Как только вы рисуете на холсте любые данные, которые были загружены из другого источника без одобрения CORS, холст становится испорченным. Испорченный холст - это тот, который больше не считается безопасным, и любые попытки получить данные изображения с холста вызовут исключение.
Попытка обратиться к ним, когда холст испорчен, приведет к возникновению ошибки безопасности SecurityError. Это защищает пользователей от доступа к личным данным с помощью изображений для извлечения информации с удаленных веб-сайтов без разрешения.
function isElementOver(el1: HTMLElement, el2: HTMLElement) {
const rect1 = el1.getBoundingClientRect();
const rect2 = el2.getBoundingClientRect();
const left = Math.max(rect1.left, rect2.left);
const top = Math.min(rect2.top, rect1.top);
const right = Math.min(rect2.right, rect1.right);
const bottom = Math.max(rect2.bottom, rect1.bottom);
const width = right - left;
const height = bottom - top;
if (width < 0 || height < 0) {
return false;
}
const el = document.elementFromPoint(left + width / 2, top + height / 2) as HTMLElement;
if (el === el1) {
return true;
} else if (el === el2) {
return false;
} else {
return null;
}
}
function eventPath(evt) {
var path = (evt.composedPath && evt.composedPath()) || evt.path,
target = evt.target;
if (path != null) {
// Safari doesn't include Window, but it should.
return (path.indexOf(window) < 0) ? path.concat(window) : path;
}
if (target === window) {
return [window];
}
function getParents(node, memo) {
memo = memo || [];
var parentNode = node.parentNode;
if (!parentNode) {
return memo;
}
else {
return getParents(parentNode, memo.concat(parentNode));
}
}
return [target].concat(getParents(target), window);
}
1) Возможно ли задать значение переменной на JAVASCRIPT навсегда (даже звучит глупо, но вдруг)
const a = "Hello";
a = "Bye"; // error
2) Можно ли навсегда подкорректировать код HTML через JS-файл.
localStorage.result= '...';
console.log(localStorage.result);
window.realAddEventListener = window.addEventListener;
window.addEventListener = function(name, listener, bubbles){
if (name === "beforeunload"){
return;
}
window.realAddEventListener(name, listener, bubbles);
}
iframe.src = "...";
var name = 'Вася';
name_save = '';
function NameCheck() {
if(name != name_save) {
name_save = name;
console.log(name);
}
}
setInterval(NameCheck, 0);
setTimeout(()=>name = "111");
setTimeout(()=>name = "222");
setTimeout(()=>name = "333");
const newArray = Object.keys(checkboxGroup) // Превращаем объект в массив ключей checkboxGroup
.filter(name => checkboxGroup[name].checked === true) // Создаем новый массив из ключей, в котором будут только те, для которых у объекта - checked есть истина
.map(name => checkboxGroup[name].value); // Создаем новый массив из свойств value
Вызов setTimeout добавит событие в очередь по прошествии времени, указанного во втором аргументе вызова. Если очередь событий на тот момент будет пуста, то событие обработается сразу же, в противном случае событию функции setTimeout придется ожидать завершения обработки остальных событий в очереди. Именно поэтому второй аргумент setTimeout корректно считать не временем, через которое выполнится функция из первого аргумента, а минимальное время, через которое она сможет выполниться.
new RegExp(/^\d+$/)
<div id="div1">div1</div>
<script>
// BEFORE ANY CODE
const div1 = document.querySelector("#div1");
const realAddEventListener = div1.addEventListener.bind(div1);
const realRemoveEventListener = div1.removeEventListener.bind(div1);
const events = [];
div1.addEventListener = (name, listener, opts) => {
events.push({ name, listener, opts });
return realAddEventListener(name, listener, opts);
};
div1.removeEventListener = (name, listener, opts) => {
events = events.filter((e) => (e.name === name && e.listener === listener));
realRemoveEventListener(name, listener, opts);
};
// CODE
div1.addEventListener("click", () => alert("click"), false);
// CLONE
const div2 = div1.cloneNode();
div2.innerHTML = "div2";
events.map((e) => div2.addEventListener(e.name, e.listener, e.opts));
document.querySelector("body").appendChild(div2);
</script>
file.onload = ()=>{ // после загрузки файла
parent.fileReady(); // вызываем функцию у родительского окна
};