Форум программистов, компьютерный форум, киберфорум
JavaScript: API
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/22: Рейтинг темы: голосов - 22, средняя оценка - 4.86
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283

Расширение для Яндекс браузера

06.01.2025, 08:35. Показов 6981. Ответов 107
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
здравствуйте не уверен, что в ту ветку пишу, посему уважаемы модераторы можете перезалить топик в нужную ветку
Предположим в буфере обмена находится текст:
«тема письма*I:\ТЗ.txt*8111@mail.ru, 8222@mail.ru»
То есть в буфере находятся тема письма, путь к файлу, который нужно приложить к письму и емейл адрес или адреса разделённые запятой, куда нужно отправить письмо или письма.
Задача: пользователь заходит в Яндекс браузер в свой почтовый ящик, нажимает кнопку «Написать» и всё то, что имеется в буфере обмена нужно, чтобы автоматически сделалось – заполнились поля: Кому, Тема и приложился указанный файл, чтобы осталось пользователю только нажать кнопку «Отправить», как это сделать?
То есть я захожу в свою почту, нажимаю кнопку «Написать» - это событие, ПО должно проверить есть ли в буфере обмена строка удовлетворяющая требованиям, в данном случае наличие двух знаков "*", если есть, тогда действовать согласно требуемого сценария
видимо нужно написать расширение для браузера, чтобы поддерживало Яндекс браузер или уже есть готовые? Попытался использовать Violentmonkey, установил, создал скрипт

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
// ==User Script==
 
// @name         Auto Fill Yandex Mail
 
// @namespace    http://tampermonkey.net/
 
// @version      0.1
 
// @description  Автоматически заполняет поля в Яндекс Почте из буфера обмена
 
// @author       Ваше имя
 
// @match        https://mail.yandex.ru/*
 
// @grant        clipboardRead
 
// ==/User Script==
 
 
(function() {
 
    'use strict';
 
 
    // Добавляем слушатель события на кнопку "Написать"
 
    document.addEventListener('click', async function(event) {
 
        if (event.target.classList.contains('mail-ComposeButton')) {
 
            try {
 
                // Получаем текст из буфера обмена
 
                const text = await navigator.clipboard.readText();
 
 
 
                // Проверяем наличие двух знаков "*"
 
                if (text.split('*').length - 1 === 2) {
 
                    const parts = text.split('*');
 
                    const emailSubject = parts[0]; // Тема письма
 
                    const filePath = parts[1]; // Путь к файлу (не используется в этом примере)
 
                    const emailAddresses = parts[2]; // Емейлы
 
 
                    // Заполняем поля "Кому" и "Тема"
 
                    document.querySelector('input[name="to"]').value = emailAddresses;
 
                    document.querySelector('input[name="subject"]').value = emailSubject;
 
 
                    // Здесь можно добавить логику для прикрепления файла, если это необходимо
 
                    console.log("Поля заполнены!");
 
                } else {
 
                    console.log("Содержимое буфера обмена не удовлетворяет требованиям.");
 
                }
 
            } catch (err) {
 
                console.error("Ошибка при доступе к буферу обмена: ", err);
 
            }
 
        }
 
    });
 
})();
но получил сообщение от расширения "Неверный скрипт! Безымянный" и чтобы Не гадать, лучше спросить, спасибо
и почему он Безымянный, когда сказано: @name Auto Fill Yandex Mail
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.01.2025, 08:35
Ответы с готовыми решениями:

Возможно ли на javascript создать расширение для браузера, которое бы авторизовывалось в vk?
Возможно ли на javascript создать расширение для браузера (chrome,firefox,opera), которое бы авторизовывалось в vk?

"Управляемое" расширение для браузера
Хочу написать "управляемое"(внешней программой) расширение. Под "управлением" понимаю некий "костыль", т.к. нормальная...

Расширение для браузера
Я хочу сделать расширение для браузера по подобию похожего расширения, есть некий сервис похожий на мой и там есть полезное расширение,...

107
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
20.01.2025, 10:20  [ТС]
Студворк — интернет-сервис помощи студентам
diadiavova, здравствуйте, спасибо за помощь в топике, много чего переосмыслил, решил сделать другой подход))
использовал джипити, он естественно он лагает
0
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
20.01.2025, 14:21  [ТС]
здравствуйте, мне нужно расширение для Яндекс браузера, оно должно работать на странице: https://mail.yandex.ru/* знак «*» - значит любое продолжение, его функционал:
после нажатия кнопки «Прикрепить файлы с компьютера» по умолчанию появляется форма «Открытие» и после выбора файла или файлов пользователем они прикрепляются к письму, ещё нужно добавить, чтобы в тему письма добавилось название файла, если этих файлов будет 2, тогда нужно, чтобы в тему письма добавились оба названия этих файлов с пробелом между названиями, если среди них будет файл с названием «Сопроводительное письмо*» где знак «*» - значит любое продолжение, тогда это название файла в тему поместить вторым.
как подправить код:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// Функция для обработки прикрепления файлов
function handleFileAttachment(event) {
    const input = document.createElement('input');
    input.type = 'file';
    input.multiple = true;
 
    input.addEventListener('change', (e) => {
        const files = Array.from(e.target.files);
        const fileNames = files.map(file => file.name);
        const subjectField = document.querySelector('input[name="subject"]');
 
        // Проверяем, существует ли поле "Тема"
        if (subjectField) {
            // Очищаем текущее значение темы
            subjectField.value = '';
 
            // Добавляем названия файлов в тему письма
            subjectField.value += fileNames.join(' ');
 
            // Проверяем наличие файла "Сопроводительное письмо"
            if (fileNames.some(name => name.startsWith('Сопроводительное письмо'))) {
                const index = fileNames.indexOf('Сопроводительное письмо');
                const [coverLetter] = fileNames.splice(index, 1);
                fileNames.unshift(coverLetter); // Перемещаем его на первое место
            }
 
            // Обновляем тему с учетом порядка
            subjectField.value = fileNames.join(' ');
        }
 
        // Прикрепляем файлы к письму
        const fileInput = document.querySelector('input[type="file"]');
        if (fileInput) {
            const dataTransfer = new DataTransfer();
            files.forEach(file => dataTransfer.items.add(file));
            fileInput.files = dataTransfer.files; // Устанавливаем файлы в input
        }
    });
 
    // Запускаем выбор файла
    input.click();
}
 
// Добавляем обработчик события на кнопку "Прикрепить файлы"
const attachButton = document.querySelector('button[title="Прикрепить файлы с компьютера"]');
if (attachButton) {
    attachButton.addEventListener('click', (event) => {
        event.preventDefault(); // Предотвращаем стандартное поведение кнопки
        handleFileAttachment(event);
    });
}
спасибо
он и в тему названия файла не вставляет так ещё и вордовсие файлы пытается открыть после нажатия на форме "Открытие" кнопки "Открыть"
спасибо
0
20.01.2025, 15:19
 Комментарий модератора 
Ципихович Эндрю, не нужно плодить темы. У вас уже есть тема, где вы ведёте обсуждение своего расширения.
0
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
21.01.2025, 11:53  [ТС]
код
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
 
window.onload = () => {
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) {
        alert("Расширение «" + manifest.name + "» загружено и работает!");
        
        // Создаем наблюдатель
        const observer = new MutationObserver((mutationsList) => {
            console.log("Изменения в DOM обнаружены:", mutationsList);
            
            // Проверяем наличие кнопки "Написать" при каждом изменении в DOM
            const writeButton = document.querySelector("a[href='#compose']"); // Нужен правильный селектор
            if (writeButton && !writeButton.dataset.listenerAdded) {
                writeButton.addEventListener('click', function() { 
                    alert('Кнопка «Написать» нажата!');
                    
                    // Ищем кнопку с изображением скрепки "Прикрепить файлы с компьютера"
                    const attachButton = document.querySelector('input[type="file"]'); // Ищем <input type="file">
                    if (attachButton) {
                        alert("Кнопка «Прикрепить файлы с компьютера» найдена!");
                        attachButton.addEventListener("change", function () {
                            alert("Файлы выбраны!");
                        });
                    } else {
                        alert("Кнопка «Прикрепить файлы с компьютера» НЕ найдена, далее программа выполняться НЕ будет!");
                        return; // Завершаем выполнение скрипта
                    }
                });
                writeButton.dataset.listenerAdded = true; // Устанавливаем флаг, что обработчик добавлен
            } else if (!writeButton) {
                alert('Кнопка «Написать» не найдена на странице, далее программа выполняться НЕ будет!');
                return; // Завершаем выполнение скрипта
            }
        });
 
        // Начинаем наблюдение за изменениями в DOM
        observer.observe(document.body, { childList: true, subtree: true });
        alert("Наблюдение за DOM запущено!");
    } else {
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!");
        return; // Завершаем выполнение скрипта
    }
 
    // Проверяем, успешно ли запущено наблюдение
    if (!document.body) {
        alert("Наблюдение за DOM НЕ запущено, далее программа выполняться НЕ будет!");
        return; // Завершаем выполнение скрипта
    }
};
получаю сообщение
"Кнопка «Прикрепить файлы с компьютера» НЕ найдена"
ЧЯДНТ? спасибо
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
22.01.2025, 07:55
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
получаю сообщение
"Кнопка «Прикрепить файлы с компьютера» НЕ найдена"
ЧЯДНТ? спасибо
Здесь не нужно постоянно проверять наличие кнопки "Написать". Это нужно делать один раз после загрузки страницы. А вот что касается объектов, появляющихся после нажатия кнопки, вот их нужно искать не сразу, поскольку форма редактирования создается динамически и вот как раз здесь уже нужно выполнять такую проверку. Кроме того, если у тебя при каждом изменении документа на кнопку вешается обработчик клика, то срабатывать при каждом клике он будет ровно столько раз сколько ты его повесил и очень скоро начнутся жуткие тормоза.
Тут нужно либо для поиска кнопки "Написать" использовать отдельный обсервер, либо при изменении проверять найдена ли кнопка ранее(для этого придется создать отдельный флажок). А вот что касается поиска объектов в редакторе письма, то, поскольку он каждый раз создается новый, то и делать это надо в обработчике изменения документа, а не в обработчике клика, поскольку после клика нужно еще время для создания объекта, а если ты его ищешь до того, как он создан, то и результат соответствующий.
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 09:31  [ТС]
diadiavova, подскажите вроде работает:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
window.onload = () => {
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) {
        // Флаг для отслеживания добавления обработчика клика
        let writeButtonListenerAdded = false;
        // Создаем наблюдатель для кнопки "Написать"
        const writeButtonObserver = new MutationObserver((mutationsList) => {
            const writeButton = document.querySelector("a[href='#compose']"); // Нужен правильный селектор
            if (writeButton && !writeButtonListenerAdded) {
                writeButton.addEventListener('click', function() {
                    // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
                    const attachButtonObserver = new MutationObserver((mutationsList) => {
                    const attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
                        if (attachButton) {
                            alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
                            attachButton.addEventListener("change", function() {
                            alert("Файлы выбраны!");
                            });
                            attachButtonObserver.disconnect(); // Останавливаем наблюдение после нахождения кнопки
                        }
                    });
                    // Начинаем наблюдение за изменениями в DOM для кнопки "Прикрепить файлы с компьютера"
                    attachButtonObserver.observe(document.body, { childList: true, subtree: true });
                });
                writeButtonListenerAdded = true; // Устанавливаем флаг, что обработчик добавлен
            }
        });
        // Начинаем наблюдение за изменениями в DOM для кнопки "Написать"
        writeButtonObserver.observe(document.body, { childList: true, subtree: true });
    } else {
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!");
        return; // Завершаем выполнение скрипта
    }
    // Проверяем, успешно ли запущено наблюдение
    if (!document.body) {
        alert("Наблюдение за DOM НЕ запущено, далее программа выполняться НЕ будет!");
        return; // Завершаем выполнение скрипта
    }
};
а как по степени надёжности?
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
22.01.2025, 09:53
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
а как по степени надёжности?
При беглом осмотре каких-то серьезных проблем я не заметил, хотя сам бы сделал немного иначе.
Коль скоро ты создаешь два разных обсервера, то можно было обойтись без флага. То есть тот обсервер, который ожидает появления кнопки "Написать", после ее появления можно отключить окончательно. А вот обсервер, который ожидает появления редактора письма лучше вывести на верхний уровень. И когда он нужен запускать его и отключать после того как отработал. У тебя при каждом клике создается новый экземпляр. Не критично, но как-то выглядит не очень. То есть по идее логику можно вообще сильно упростить:
Создаешь два обсервера на верхнем уровне, первый запускаешь сразу и ждешь появления кнопки, на которую вешаешь обработчик, после чего отключаешь обсервер окончательно. В обработчике клика запускаешь второй обсервер. А уже в его коллбэке находишь что нужно и отключаешь отслеживание. При следующем клике вместо создания нового обсервера включаешь существующий. В результате нет глубоко вложенных конструкций, не создаются лишние объекты и логика упрощается. Ну и как результат - чем проще логика, тем надежнее код.
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 09:59  [ТС]
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
вроде работает
рано порадовался, потому как глаз замылился, по факту в момент отображения алерта Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки...
она НЕ найдена, как только я у алерта нажму "Закрыть" она появится, мелочь, а неприятно, то есть показанный алерт НЕ соответствует действительности

Добавлено через 1 минуту
Цитата Сообщение от diadiavova Посмотреть сообщение
логику можно вообще сильно упростить:
Создаешь два обсервера на верхнем уровне, первый запускаешь сразу и ждешь появления кнопки, на которую вешаешь обработчик, после чего отключаешь обсервер окончательно. В обработчике клика запускаешь второй обсервер. А уже в его коллбэке находишь что нужно и отключаешь отслеживание. При следующем клике вместо создания нового обсервера включаешь существующий. В результате нет глубоко вложенных конструкций, не создаются лишние объекты и логика упрощается. Ну и как результат - чем проще логика, тем надежнее код.
и тогда решится сказанное в посту № 88?
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
22.01.2025, 10:01
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
и тогда решится сказанное в посту № 88?
Я же смотрю на это не пробуя. Так что не могу сказать. И логику описал примерно. Но если это сделать, то там и проблемы выявлять проще будет.
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 10:20  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
по идее логику можно вообще сильно упростить:
Создаешь два обсервера на верхнем уровне, первый запускаешь сразу и ждешь появления кнопки, на которую вешаешь обработчик, после чего отключаешь обсервер окончательно. В обработчике клика запускаешь второй обсервер. А уже в его коллбэке находишь что нужно и отключаешь отслеживание. При следующем клике вместо создания нового обсервера включаешь существующий. В результате нет глубоко вложенных конструкций, не создаются лишние объекты и логика упрощается. Ну и как результат - чем проще логика, тем надежнее код.
так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
 
window.onload = () => {
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) {
        // Создаем наблюдатель для кнопки "Написать"
        const writeButtonObserver = new MutationObserver((mutationsList) => {
            const writeButton = document.querySelector("a[href='#compose']"); // Нужен правильный селектор
            if (writeButton) {
                writeButton.addEventListener('click', function() {
                    // Запускаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
                    attachButtonObserver.observe(document.body, { childList: true, subtree: true });
                });
                writeButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
            }
        });
 
        // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
        const attachButtonObserver = new MutationObserver((mutationsList) => {
        const attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
            if (attachButton) {
                alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
                // attachButton.addEventListener("change", function() {
                // alert("Файлы выбраны!");
                });
                attachButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
            }
        });
 
        // Начинаем наблюдение за изменениями в DOM для кнопки "Написать"
        writeButtonObserver.observe(document.body, { childList: true, subtree: true });
    } else {
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!");
        return; // Завершаем выполнение скрипта
    }
 
    // Проверяем, успешно ли запущено наблюдение
    if (!document.body) {
        alert("Наблюдение за DOM НЕ запущено, далее программа выполняться НЕ будет!");
        return; // Завершаем выполнение скрипта
    }
};
??
2
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
по факту в момент отображения алерта Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки...
она НЕ найдена, как только я у алерта нажму "Закрыть" она появится, мелочь, а неприятно, то есть показанный алерт НЕ соответствует действительности
НЕ решилось))
0
 Аватар для diadiavova
7258 / 2605 / 744
Регистрация: 11.04.2015
Сообщений: 4,148
Записей в блоге: 43
22.01.2025, 10:46
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
НЕ решилось))
Кнопка найдена, но не отобразилась. Попробуй вместо алерта клик выполнить, увидишь, что появился диалог.
Вот я тут написал примерно что имел в виду и это работает, хотя алерт тоже появляется несколько раньше
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const writeButtonObserver = new MutationObserver(function(mutationList){
  const writeButton = document.querySelector("a[href='#compose']");
  if(writeButton){
    writeButton.addEventListener("click", writeButton_click);
    writeButtonObserver.disconnect();
  }
});
writeButtonObserver.observe(document.body,{childList:true, subtree:true});
const editLetterObserver = new MutationObserver(function(mutationList){
  const attachButton = document.querySelector("input[type='file']");
  if(attachButton){
    //alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
    attachButton.click();
    editLetterObserver.disconnect();
  }
});
 
function writeButton_click() {
  editLetterObserver.observe(document.body,{childList:true, subtree:true});
}
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,049
22.01.2025, 11:40
Вклинюсь
Цитата Сообщение от diadiavova Посмотреть сообщение
Кнопка найдена, но не отобразилась. Попробуй вместо алерта клик выполнить, увидишь, что появился диалог.
Обсерверы выполняются в микротасках.
Т.е. ситуация такая. Выполняется какой то таск во время которого добавляется кнопка. Срабатывает обсервер и в микротасках после этого таска выполняется функция обсервера. А персчет стилей и рендер страницы (когда кнопка появится на экране) выполняется уже после микротасков. Если нужны какие то действия с уже видимой кнопкой, то их надо перенести в следующий таск, например с помощью setTimeout с нулевой задержкой.

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
        // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
        const attachButtonObserver = new MutationObserver((mutationsList) => {
        const attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
            if (attachButton) {
                setTimeOut ( () => {
                    alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
                    // attachButton.addEventListener("change", function() {
                    // alert("Файлы выбраны!");
                    //});
                    attachButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
                }, 0);
            }
        });
2
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 12:17  [ТС]
voraa, так:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
// Устанавливает обработчик события load для объекта window
// Код внутри фигурных скобок { ... } будет выполнен
// После того, когда все элементы страницы (включая изображения, стили и другие ресурсы) будут полностью загружены 
window.onload = () => { // 1
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) { // 2
        // alert("Расширение «" + manifest.name + "» работает!");
 
const writeButtonObserver = new MutationObserver(function(mutationList){
const writeButton = document.querySelector("a[href='#compose']"); // Нужен правильный селектор кнопки "Написать"
  if(writeButton){
    writeButton.addEventListener("click", writeButton_click);
    writeButtonObserver.disconnect(); // Метод disconnect() у объекта MutationObserver используется для остановки наблюдения за изменениями в DOM
  }
});
// Создаём наблюдатель для кнопки "Прикрепить файлы с компьютера"
const attachButtonObserver = new MutationObserver((mutationsList) => {
const attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор кнопки со скрепкой "Прикрепить файлы с компьютера"
    if (attachButton) {
        setTimeOut ( () => {
        alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
        attachButtonObserver.disconnect();}, 0);}}); // Отключаем наблюдатель после нахождения кнопки
    } else { // 2, 3
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!"); return;} // 3 Завершаем выполнение скрипта
}; // 1
увы алерт не отобразился ни рано, ни поздно-молчит как партизан....
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,049
22.01.2025, 14:40
Чего то у вас какая то фигня со скобками.
Надо же писать, что бы было понятно, какая открывающая, какой закрывающей соответствует.
Отступы хоть делать.
В 25 строке какой то бред.
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 15:12  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
В 25 строке какой то бред
да нет, ошибок там нет, сорри, это по питонячи написано, ну или по ЦЭ, поэтому на форуме скобки залёные.........

Добавлено через 20 минут
Цитата Сообщение от voraa Посмотреть сообщение
...
ну ок, копипастом воспользовался с вашего поста:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
// Устанавливает обработчик события load для объекта window
// Код внутри фигурных скобок { ... } будет выполнен
// После того, когда все элементы страницы (включая изображения, стили и другие ресурсы) будут полностью загружены 
window.onload = () => { // 1
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) { // 2
        // alert("Расширение «" + manifest.name + "» работает!");
 
        // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
        const attachButtonObserver = new MutationObserver((mutationsList) => {
        const attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
            if (attachButton) {
                setTimeOut ( () => {
                    alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
                    // attachButton.addEventListener("change", function() {
                    // alert("Файлы выбраны!");
                    //});
                    attachButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
                }, 0);
            }
        });
 
 
    } else { // 2, 3
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!"); return;} // 3 Завершаем выполнение скрипта
}; // 1
тоже НЕ работает ну и форумовское выделение кода лагает....
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,049
22.01.2025, 15:45
Мы только забыли подключить обсервер. Создали, но не подключили

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
// Устанавливает обработчик события load для объекта window
// Код внутри фигурных скобок { ... } будет выполнен
// После того, когда все элементы страницы (включая изображения, стили и другие ресурсы) будут полностью загружены 
window.onload = () => { // 1
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) { // 2
        // alert("Расширение «" + manifest.name + "» работает!");
 
        // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
        const attachButtonObserver = new MutationObserver((mutationsList) => {
        const attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
            if (attachButton) {
                setTimeOut ( () => {
                    alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
                    // attachButton.addEventListener("change", function() {
                    // alert("Файлы выбраны!");
                    //});
                    attachButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
                }, 0);
            }
        });
        // Подключаем обсервер. Следим за добавлением узлов во всем документе. !!!
        attachButtonObserver.observe(document, {subtree:true, childList:true});
 
 
    } else { // 2, 3
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!"); return;} // 3 Завершаем выполнение скрипта
}; // 1
1
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 15:47  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
alert(`Кнопка «Прикрепить файлы с компьютера» найдена!
так и не работает вообще
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,049
22.01.2025, 15:54
А не может быть, что она уже существует до того, как подключили обсервер? Может есть, но просто невидима?
Может проверять и до подключения
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
// Устанавливает обработчик события load для объекта window
// Код внутри фигурных скобок { ... } будет выполнен
// После того, когда все элементы страницы (включая изображения, стили и другие ресурсы) будут полностью загружены 
window.onload = () => { // 1
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) { // 2
        // alert("Расширение «" + manifest.name + "» работает!");
        let attachButton;
        // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
        const attachButtonObserver = new MutationObserver((mutationsList) => {
        attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
            if (attachButton) {
                setTimeOut ( () => {
                    alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
                    // attachButton.addEventListener("change", function() {
                    // alert("Файлы выбраны!");
                    //});
                    attachButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
                }, 0);
            }
        });
        attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
        if (attachButton) {
            alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
        } else {
        
            // Подключаем обсервер. Следим за добавлением узлов во всем документе. !!!
            attachButtonObserver.observe(document, {subtree:true, childList:true});
        }
 
 
    } else { // 2, 3
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!"); return;} // 3 Завершаем выполнение скрипта
}; // 1
0
1705 / 574 / 74
Регистрация: 10.04.2009
Сообщений: 9,283
22.01.2025, 16:09  [ТС]
Цитата Сообщение от voraa Посмотреть сообщение
alert(`Кнопка «Прикрепить файлы с компьютера» найдена! Селектор кнопки: input[type='file']`);
ну так для чистоты эксперимента пронумеровать?)) попытка № 1\2
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// файл content.js
// Получаем манифест расширения
const manifest = chrome.runtime.getManifest();
// Устанавливает обработчик события load для объекта window
// Код внутри фигурных скобок { ... } будет выполнен
// После того, когда все элементы страницы (включая изображения, стили и другие ресурсы) будут полностью загружены 
window.onload = () => { // 1
    // Проверяем, загружено ли расширение
    if (manifest && manifest.name) { // 2
        // alert("Расширение «" + manifest.name + "» работает!");
        let attachButton;
        // Создаем наблюдатель для кнопки "Прикрепить файлы с компьютера"
        const attachButtonObserver = new MutationObserver((mutationsList) => {
        attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
            if (attachButton) {
                setTimeOut ( () => {
                    alert(`Кнопка «Прикрепить файлы с компьютера» найдена!, попытка № 1 Селектор кнопки: input[type='file']`);
                    // attachButton.addEventListener("change", function() {
                    // alert("Файлы выбраны!");
                    //});
                    attachButtonObserver.disconnect(); // Отключаем наблюдатель после нахождения кнопки
                }, 0);
            }
        });
        attachButton = document.querySelector("input[type='file']"); // Нужен правильный селектор
        if (attachButton) {
            alert(`Кнопка «Прикрепить файлы с компьютера» найдена!, попытка № 2 Селектор кнопки: input[type='file']`);
        } else {
        // Подключаем обсервер. Следим за добавлением узлов во всем документе. !!!
        attachButtonObserver.observe(document, {subtree:true, childList:true});
        }
    } else { // 2, 3
        alert("Расширение «" + manifest.name + "» НЕ работает, далее программа выполняться НЕ будет!"); return;} // 3 Завершаем выполнение скрипта
}; // 1
и тоже молчит алерт
0
 Аватар для voraa
1220 / 1105 / 173
Регистрация: 21.01.2024
Сообщений: 5,049
22.01.2025, 16:23
А вообще хоть что то работает?
В консоли ошибок нет?
Если раскомментарить строку 10, алерт появляется?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2025, 16:23
Помогаю со студенческими работами здесь

Расширение для Браузера
Дарова народ, я тут решил попробовать создать расширения для Браузера(Опера GX, если так важно). Но ни как не получается реализовать...

Расширение для браузера
у меня есть расширение просто файлом js идёт оно для гугла хрома и мазилы но его может стырить любой желающий тут я стал переделывать под...

Расширение для браузера(Цензура)
Дарова народ, я тут клепаю расширение для браузера(Цензура), однако мне нужно использовать нейросеть(к сожалению это обязательная часть)...

Расширение-автоклик для браузера
Привет! Я в программировании на JavaScript новичек. Мне нужно сделать расширение для браузера, которое на определённом сайте при нажатии к...

Расширение для браузера, возможности
Посдкажите, возможно ли в принципе реализовать следующий функционал на JS в рамках расширения для браузера (например, для Хрома). От...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru