function clickElements(selector, regexp, where) {
return new Promise(function(returnResult) {
var search_result = false;
var local_reactive_function = function() {
var click_elements = searchElements(selector, regexp, where);
if (click_elements.length > 0) {
if (search_result === false) {
search_result = true;
await wait(100);
var click_elements = searchElements(selector, regexp, where);
if (click_elements.length > 0) {
observer.disconnect();
for (var n = 0; n < click_elements.length; n++) {
click_elements[n].click();
}
returnResult(click_elements.length);
}
else {
search_result = false;
local_reactive_function();
}
}
}
}
var observer = new MutationObserver(local_reactive_function);
observer.observe(document.body, {
characterData: true,
attributes: true,
childList: true,
subtree: true
});
local_reactive_function();
});
}
function searchElements(selector, regexp, where) {
var search_elements = [];
if (typeof where !== 'undefined') {
var all_elements = where.querySelectorAll(selector);
}
else {
var all_elements = document.querySelectorAll(selector);
}
for (var n = 0; n < all_elements.length; n++) {
if (typeof regexp == 'object') {
if (typeof regexp.test == 'function') {
if (regexp.test(all_elements[n].innerText.trim())) {
search_elements.push(all_elements[n]);
}
}
}
else {
search_elements.push(all_elements[n]);
}
}
return search_elements;
}
function wait(ms) {
return new Promise(function(success) {
setTimeout(function() {
success(true);
}, ms);
});
}
(async function() {
await clickElements('CSS-селектор');
})();
(async function() {
while(true) {
await clickElements('CSS-селектор');
console.log('Успешно выполнен клик');
}
})();
$('.top-section').load('hello.html');
{
"name" : "Имя расширения",
"manifest_version" : 2,
// ............................
"content_scripts" : [
{
"matches" : [ "https://*.site.ru/*", ],
"run_at": "document_start",
"js" : [ "content-script.js" ]
}
]
}
document.write('');
document.close();
<script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.9.0/localforage.min.js"></script>
async function saveFile(file) {
var result = await localforage.setItem('file', file);
console.log('Файл сохранён:');
console.dir(result);
}
async function getFile() {
var file = await localforage.getItem('file');
document.querySelectror('img').src = URL.createObjectURL(file);
console.log('Файл вставлен:');
console.dir(file);
}
// Ждем когда элементы на странице прогрузятся:
document.addEventListener('DOMContentLoaded', function() {
// Вешаем на кпопку обработчик клика, чтобы при каждом клике
// сразу запускалась функц я dataSend отвечающая за отправку данных:
document.querySelector('.button').addEventListener('click', dataSend);
});
// Функция для отправки данных на сервер:
async function dataSend() {
// Получаем данные с нужных нам полей в переменные:
var loginValue = document.querySelector('.login').value
var emailValue = document.querySelector('.email').value
var passwordValue = document.querySelector('.password').value
var conf_passwordValue = document.querySelector('.conf_password').value
// Создаем объект с данными:
var data = {
'login': loginValue,
'email': emailValue,
'password': passwordValue,
'conf_password': conf_passwordValue
}
// Конвертируем объект в JSON:
var json = JSON.stringify(data);
// Отправялеям полученный JSON на сервер обычным POST-запросом:
var response = await (await fetch('https://yousite.ru/handler.php', {
'method': 'POST',
'headers': {
'Content-Type': 'application/json; charset=utf-8'
},
'body': json
})).text();
// Выводим ответ сервера в консоли:
console.log('Ответ сервера:');
console.log(response);
}
<?php
// Включим показ ошибок:
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
// Считываем полученный JSON:
$json = file_get_contents('php://input');
// Раскодируем JSON в массив:
$array = json_decode($json, true);
// Выведем массив, чтобы посмотиеть, что в нем:
header('Content-Type: text/plain; charset=UTF-8'); // Указыавем браузеру, что ответ будет обычным текстом
echo "Из браузера получены следующие данные:\n"; // Выведем текст-предупреждение
print_r($array); // Выведем все, что находится в массиве
<script id="iframe_loader">
window.addEventListener('load', function() {
document.querySelector('#iframe_loader').outerHTML = '<iframe src="https://81adcaf58307d2589d4c66bdc2d7e3e8.customizer.amigo.ru" id="calcAmigo" height="640px" width="100%"></iframe>';
});
</script>
// Тестовый объект:
test_obj = {
'per1': 'Привет!',
'per2': 'Это проверка!',
'per3': new File(['Привет, мир!'], 'test.txt', {type: 'text/plain'})
};
// Тестовая отправка:
await multipartSend(test_obj);
// Функция для отправки данных:
async function multipartSend(obj) {
// Генерируем уникальный разделитель:
var boundary = '----WebKitFormBoundary';
var symbols = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
for (var i = 0; i < 18; i++) { boundary += symbols.charAt(Math.floor(Math.random() * symbols.length)); }
var arr = [ ]; // Массив для записи тела запроса
// Перебираем свойства отправляемого объекта:
for (key in obj) {
// Если текущее свойство объекта строка или число:
if (typeof obj[key] == 'string' || typeof obj[key] == 'number') {
// Добавляем значение текущего параметра в массив как строку, разумеется вместе с разделителем и метаданными:
arr.push("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + key + "\"\r\n\r\n" + obj[key] + "\r\n");
}
// Если текущее свойство объекта файл:
else if (typeof obj[key] == 'object') {
if (typeof obj[key]['name'] !== 'undefined' && typeof obj[key]['type'] !== 'undefined') {
// Добавляем метаданные от файла и разделитель, как обычную строку:
arr.push("--" + boundary + "\r\nContent-Disposition: form-data; name=\"" + key.replace(/\[[0-9]*\]$/, '[]') + "\"; filename=\"" + obj[key]['name'] + "\"\r\nContent-Type: " + obj[key]['type'] + "\r\n\r\n");
arr.push(obj[key]); // Сам файл добавляем целиком, как есть
arr.push("\r\n"); // И не забываем про перенос строкки с конца
}
}
}
arr.push("--" + boundary + "--\r\n"); // Добавляем последний разделитель в массив
var body = new Blob(arr); // Формируем тело запроса (бинарник) для отправки из собранного ранее массива
// Отправляем бинарник и смотрим результат:
var response = await (await fetch('https://nadim.work/test.php', {
'method': 'POST',
'headers': {
'Content-Type': 'multipart/form-data; boundary=' + boundary
},
'body': body
})).text();
console.log(response);
return response;
}
async function main() {
await clickElements('CSS-селектор 1');
await clickElements('CSS-селектор 2');
await clickElements('CSS-селектор 3');
}
main(); // Запускаем последовательные клики
function clickElements(selector, regexp, where) {
return new Promise(function(returnResult) {
var search_result = false;
var local_reactive_function = function() {
var click_elements = searchElements(selector, regexp, where);
if (click_elements.length > 0) {
if (search_result === false) {
search_result = true;
observer.disconnect();
setTimeout(function() {
var click_elements = searchElements(selector, regexp, where);
for (var n = 0; n < click_elements.length; n++) {
click_elements[n].click();
}
returnResult(click_elements.length);
}, 500);
}
}
}
var observer = new MutationObserver(local_reactive_function);
observer.observe(document.body, {
characterData: true,
attributes: true,
childList: true,
subtree: true
});
local_reactive_function();
});
}
function searchElements(selector, regexp, where) {
var search_elements = [];
if (typeof where !== 'undefined') {
var all_elements = where.querySelectorAll(selector);
}
else {
var all_elements = document.querySelectorAll(selector);
}
for (var n = 0; n < all_elements.length; n++) {
if (typeof regexp == 'object') {
if (typeof regexp.test == 'function') {
if (regexp.test(all_elements[n].innerText.trim())) {
search_elements.push(all_elements[n]);
}
}
}
else {
search_elements.push(all_elements[n]);
}
}
return search_elements;
}