Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.08.2023, 08:45
Новичок на форуме
Отправить личное сообщение для kocmohabt228 Посмотреть профиль Найти все сообщения от kocmohabt228
 
Регистрация: 03.08.2023
Сообщений: 6

Как достать значение из поля ввода на 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;">
Ответить с цитированием
  #2 (permalink)  
Старый 09.08.2023, 10:25
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

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;
    }
    );

Последний раз редактировалось voraa, 09.08.2023 в 10:44.
Ответить с цитированием
  #3 (permalink)  
Старый 09.08.2023, 15:23
Новичок на форуме
Отправить личное сообщение для kocmohabt228 Посмотреть профиль Найти все сообщения от kocmohabt228
 
Регистрация: 03.08.2023
Сообщений: 6

Спасибо, разобрался. Оказывается было дело в другом: поле для ввода преобразовывалось в другой элемент. Переделал код, теперь работает более-менее корректно кроме одного момента: при отправке письма на чужой домен выходит предупреждение, при нажатии на "Отмена" предупреждение закрывается и отправка останавливается, а при нажатии на "ОК" предупреждение закрывается и моментально бесконечно открывается заново, не отправляя письмо. Есть ли какие-то идеи как можно это пофиксить?
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()
Ответить с цитированием
  #4 (permalink)  
Старый 09.08.2023, 18:14
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,750

Вижу такой недостаток. При каждом вызове checkAndWarnRecipient из observeMutations на кнопку отправки будет вешаться ваш обработчик. При этом и старые остаются. Вешая новый обработчик, не отменяется старый. Таким образом на кнопку может быть повешано 100500 одинаковых обработчиков, и все они будут последовательно срабатывать при клике.

Последний раз редактировалось voraa, 09.08.2023 в 18:48.
Ответить с цитированием
  #5 (permalink)  
Старый 10.08.2023, 08:12
Новичок на форуме
Отправить личное сообщение для kocmohabt228 Посмотреть профиль Найти все сообщения от kocmohabt228
 
Регистрация: 03.08.2023
Сообщений: 6

Я пытаюсь сделать расширение и поэтому мне нужно чтобы код работал постоянно. Пытался убрать observeMutations и сделать интервальный запуск функции/игрался со слипами. Но ничего не выходит, можно ли как-то сделать по другому чтобы код всегда работал?
Ответить с цитированием
  #6 (permalink)  
Старый 10.08.2023, 08:13
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

kocmohabt228, использовать код, который я предложил в предыдущем твоём вопросе. С поправками. Там вешается один единственный обработчик на окно, а кнопки и текст получаются уже внутри. И никаких MutationObserver не надо.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с выпадающим списком JavaScript ursus102 Общие вопросы Javascript 0 16.01.2016 19:30
Как ввести в поле ввода значение где есть javascript MOZG Общие вопросы Javascript 8 19.04.2013 10:28
Как зафиксировать постоянно меняющееся значение Kaviton Элементы интерфейса 1 08.01.2012 17:27
Как в IE динамически установить значение события onClick? Гость Элементы интерфейса 6 16.01.2011 23:46
Переменная от переменной или как к имени переменной конкатенировать значение другой Aderba jQuery 5 12.11.2008 15:25