Как достать значение из поля ввода на mail.ru?
В общем стоит задача написать код на JS, чтобы когда пользователь отправляет письмо не на домен организации (@vtb.uk), то ему вылазит окошко с предупреждением об этом.
const org = '@vtb.uk'; function checkAndWarnRecipient() { const sendButton = document.querySelector('[tabindex="570"]'); if (!sendButton) return; sendButton.addEventListener('click', (event) => { console.log('Send button clicked'); const addressNodes = document.querySelectorAll('[tabindex="100"]'); const value = addressNodes.value console.log('Address nodes:', value); const addresses = Array.from(addressNodes, (addressNode) => addressNode.textContent || addressNode.value ); console.log('Addresses:', addresses); const isValid = addresses.every( (address) => !address || address.endsWith(org) ); console.log('IsValid:', isValid); if (!isValid) { const isConfirmed = window.confirm('WARNING!'); console.log('Confirmation:', isConfirmed); if (!isConfirmed) { event.preventDefault(); event.stopImmediatePropagation(); event.stopPropagation(); console.log('Event prevented'); } } }); } checkAndWarnRecipient(); Тестирую прямо в консоли браузера и вот что выдает при отправке на сторонний домен: Send button clicked Address nodes: undefined Addresses: [''] IsValid: true Он как-будто не читает поле ввода с адресом или же не достает его значение, а может и не успевает его прочесть. Может ли кто-то зайти на mail.ru и помочь разобраться в чем дело? Буду благодарен за любую помощь! Название поля ввода выглядит вот так: <input class="container--H9L5q size_s_compressed--2c-eV" type="text" tabindex="100" value="" style="width: 12px;"> |
const addressNodes = document.querySelectorAll('[tabindex="100"]'); const value = addressNodes[0].value querySelectorAll - выдает не один элемент, а список. Список даже если такой элемент один. Поэтому надо либо const addressNodes = document.querySelector('[tabindex="100"]'); const value = addressNodes.value , если элемент точно один, либо const addressNodes = document.querySelectorAll('[tabindex="100"]'); const value = addressNodes[i].value , если их может быть несколько, но надо взять i-ый Почему Addresses: [''] сказать трудно не видя всей страницы. Надо смотреть, что там выдается. const addressNodes = document.querySelectorAll('[tabindex="100"]'); console.log('addressNodes', addressNodes) const value = addressNodes[0].value console.log('Address nodes:', value); const addresses = Array.from(addressNodes, (addressNode, i) =>{ console.log('addressNode', i, addressNode); addressNode.textContent || addressNode.value; } ); |
Спасибо, разобрался. Оказывается было дело в другом: поле для ввода преобразовывалось в другой элемент. Переделал код, теперь работает более-менее корректно кроме одного момента: при отправке письма на чужой домен выходит предупреждение, при нажатии на "Отмена" предупреждение закрывается и отправка останавливается, а при нажатии на "ОК" предупреждение закрывается и моментально бесконечно открывается заново, не отправляя письмо. Есть ли какие-то идеи как можно это пофиксить?
const org = '@vtb.uk'; function checkAndWarnRecipient() { const sendButton = document.querySelector('[tabindex="570"]'); if (!sendButton) return; sendButton.addEventListener('click', (event) => { console.log('Send button clicked'); const tooltipElement = document.querySelector('[class^="tooltip-"][data-test-id^="tooltip-operand-"]'); const tooltipId = tooltipElement.getAttribute('data-test-id'); const emailMatch = tooltipId.match(/tooltip-operand-(.+)$/); const email = emailMatch[1]; console.log(email); if (emailMatch) { console.log('OK') } else { console.log('Mail not found'); } if (email.indexOf(org) === -1) { const isConfirmed = window.confirm('ВНИМАНИЕ! Отправить сообщение на сторонний домен?'); console.log('Confirmation:', isConfirmed); if (!isConfirmed) { event.preventDefault(); event.stopImmediatePropagation(); event.stopPropagation(); console.log('Event prevented'); } else { console.log('Da'); } } }); } function observeMutations() { const targetNode = document.body; const observer = new MutationObserver((mutationsList) => { for (let mutation of mutationsList) { if (mutation.type === 'childList') { checkAndWarnRecipient(); } } }); const config = { childList: true, subtree: true }; observer.observe(targetNode, config); } observeMutations() |
Вижу такой недостаток. При каждом вызове checkAndWarnRecipient из observeMutations на кнопку отправки будет вешаться ваш обработчик. При этом и старые остаются. Вешая новый обработчик, не отменяется старый. Таким образом на кнопку может быть повешано 100500 одинаковых обработчиков, и все они будут последовательно срабатывать при клике.
|
Я пытаюсь сделать расширение и поэтому мне нужно чтобы код работал постоянно. Пытался убрать observeMutations и сделать интервальный запуск функции/игрался со слипами. Но ничего не выходит, можно ли как-то сделать по другому чтобы код всегда работал?
|
kocmohabt228, использовать код, который я предложил в предыдущем твоём вопросе. С поправками. Там вешается один единственный обработчик на окно, а кнопки и текст получаются уже внутри. И никаких MutationObserver не надо.
|
Часовой пояс GMT +3, время: 13:52. |