не получится, на 99.999% уверен, а я, пожалуй, использую оставшиеся 0.001% )) Для теста, создайте html-документ, в который запишите следующий JS-код:
window.addEventListener('beforeunload', function (e) {
var xhr = new XMLHttpRequest();
xhr.open('POST', 'handler.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send( 'key=' + encodeURIComponent('Hi') );
e.preventDefault();
var confirmationMessage = "";
(e || window.event).returnValue = confirmationMessage;
return confirmationMessage;
}, false);
И еще один PHP-файл "handler.php" в той же директории, в котором запишем:<?php
if (!empty($_POST['key'])) {
file_put_contents('test.txt', $_POST['key']);
}
Теперь откроем и закроем html-файл в любом браузере, кроме осла восьмой версии и ниже. Просто потому, что объект XMLHttpRequest в них не поддерживается, а кроссбраузерное решение нам для теста и не нужно. Результат можем наблюдать в создавшемся файле test.txt <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div><p>Is typing <span class="dot1">.</span>
<span class="dot2">.</span>
<span class="dot3">.</span></p></div>
</body>
<style>
@import url(https://fonts.googleapis.com/css?family=Montserrat:100,200,300,regular,500,600,700,800,900,100italic,200italic,300italic,italic,500italic,600italic,700italic,800italic,900italic);
html{
font-family: Montserrat;
}
.dot1{
transition-delay: 0.1s;
opacity: 0;
transition-duration: 0.3s;
}
.active-dot1{
opacity: 1;
transition-delay: 0.1s;
transition-duration: 0.3s;
}
.dot2{
transition-delay: 0.2s;
opacity: 0;
transition-duration: 0.3s;
}
.active-dot2{
transition-delay: 0.2s;
opacity: 1;
transition-duration: 0.3s;
}
.dot3{
transition-delay: 0.3s;
opacity: 0;
transition-duration: 0.3s;
}
.active-dot3{
transition-delay: 0.3s;
opacity: 1;
transition-duration: 0.3s;
}
</style>
<script>
let dot1 = document.querySelector(".dot1")
let dot2 = document.querySelector(".dot2")
let dot3 = document.querySelector(".dot3")
setInterval(() => {
dot1.classList.toggle("active-dot1")
}, 500);
setInterval(() => {
dot2.classList.toggle("active-dot2")
}, 500);
setInterval(() => {
dot3.classList.toggle("active-dot3")
}, 500);
</script>
</html>
window.alert = (...args) => new Promise(resolve => {
let string = "";
for (let arg of args) {
string += String(arg).replaceAll('<', '<');
}
let alertAndroid = document.createElement("android-alert");
alertAndroid.style.cssText = `
width: 84.3%;
display: block;
border: 2px #333436 solid;
position: fixed;
left: 4.4%;
margin: auto;
top: 30%;
padding: 10px;
word-break: break-all;
border-radius: 20px;
background: #333436;
color: white;`;
alertAndroid.innerHTML = `<spam>${string}</spam><br>
<button id="__android_ok_alert">OK</button>`;
document.body.appendChild(alertAndroid);
document.querySelector("#__android_ok_alert").onclick = function() {
this.parentNode.remove();
return resolve();
}
}});
// Где-то позже
async function(){
await alert(2);
console.log(1);
}
og:image
и соответствующей картинки. .nextSibling
вернёт Node типа TEXT_NODE
(3). document.getElementById('aa').nextSibling.textContent // "222"
data
- в наследство от CharacterData;