en
Feedback

Don't get caught by a cheater! Telemetrio finds and tags such channels 👉 If you want to see the tag, subscribe

Frontend | Вопросы собесов

Frontend | Вопросы собесов

Open in Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads

Show more

📈 Analytical overview of Telegram channel Frontend | Вопросы собесов

Channel Frontend | Вопросы собесов (@easy_javascript_ru) in the Russian language segment is an active participant. Currently, the community unites 17 368 subscribers, ranking 7 469 in the Technologies & Applications category and 37 786 in the Russia region.

📊 Audience metrics and dynamics

Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 17 368 subscribers.

According to the latest data from 01 November, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -277 over the last 30 days and by -26 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 6.94%. Within the first 24 hours after publication, content typically collects 4.39% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 1 205 views. Within the first day, a publication typically gains 762 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
  • Thematic interests: Content is focused on key topics such as ставь, браузер, html, border, flex.

📝 Description and content policy

The author describes the resource as a platform for expressing subjective opinions:
“Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @sendme_ads”

Thanks to the high frequency of updates (latest data received on 02 November, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.

17 368
Subscribers
-2624 hours
-1087 days
-27730 days
Posts Archive
\";\ndocument.getElementById(\"content\").innerHTML = userInput;\n\n🟠Проблемы с безопасностью CSP (Content Security Policy) \nЕсли в веб-приложении включена CSP (защита от XSS), то innerHTML может нарушать политику безопасности. \n\n\n🟠Случайное удаление обработчиков событий \nЕсли заменить содержимое элемента через innerHTML, все обработчики событий внутри него удалятся. \ndocument.getElementById(\"btn\").addEventListener(\"click\", () => {\n alert(\"Нажато!\");\n});\n\ndocument.getElementById(\"container\").innerHTML = \"\";\ndocument.getElementById(\"btn\").click(); // Ошибка, обработчик удален\n\nСтавь 👍 и забирай 📚 Базу знаний","datePublished":"2025-07-26T09:05:43Z","dateModified":"2025-07-26T09:05:43Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":3097},{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":14},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":15}]}},{"@type":"ListItem","position":20,"item":{"@type":"SocialMediaPosting","@id":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru/posts/1781","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru/posts/1781","mainEntityOfPage":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru/posts/1781","headline":"Ускорьте работу с отзывами на маркетплейсах в 5 раз Шаблоны + ИИ для ответов на отзывы. 9 маркетплейсов в еди…","articleBody":"Ускорьте работу с отзывами на маркетплейсах в 5 раз\n\nШаблоны + ИИ для ответов на отзывы. 9 маркетплейсов в едином кабинете\n\nАвтоответы на отзывы и аналитика товаров на основе отзывов 📊 \n\nПопробовать\n\n#реклама 16+\nspix.ru\nО рекламодателе","datePublished":"2025-07-25T22:26:36Z","dateModified":"2025-07-27T20:49:33Z","author":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"publisher":{"@type":"Organization","name":"Frontend | Вопросы собесов","url":"https://telemetr.io/en/channels/1917151177-easy_javascript_ru","image":"https://img.telemetr.io/c/25KaBb/5431453649143450783?ty=x"},"commentCount":0,"interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/ViewAction","userInteractionCount":1753}]}}]}
Получи грант до 1,2 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с пра
Получи грант до 1,2 млн руб. на обучение в магистратуре Хочешь развиваться в сфере ИТ и получить фундаментальные знания с практикой? Поступай в магистратуру Центрального университета! - 4 офлайн программы по востребованным направлениям ИТ - Онлайн-программа по машинному обучению - 300 мест с грантами до 1,2 млн руб. - Вечерние занятия и учеба по выходным — удобно совмещать с работой - Обучение по модели STEM-образования: на стыке науки, технологий и бизнеса - Возможность стажировок и трудоустройства в ведущих компаниях - Государственный диплом за 2 года Магистратура в Центральном университете — это современный подход к образованию, сильный преподавательский состав и актуальные кейсы от индустрии. Оставляй заявку на грант уже сейчас! Подать заявку #реклама 16+ apply.centraluniversity.ru О рекламодателе

🤔 Как из React осуществить доступ к данным? Через: - fetch/Axios для HTTP-запросов; - hooks (useEffect, useState) для загрузки и хранения данных; - контексты (useContext) для передачи данных по дереву компонентов; - глобальные хранилища (Redux, Zustand, Recoil и т.д.); - GraphQL-клиенты (Apollo, Relay). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чем spa отличается от классического сайта? SPA (Single Page Application) и классический сайт (MPA – Multi Page Application) — это два разных подхода к созданию веб-приложений. Они отличаются по способу загрузки данных, навигации и производительности. 🚩Классический сайт (MPA – Multi Page Application) Каждый раз при переходе на новую страницу браузер запрашивает HTML с сервера. Сервер формирует страницу и отправляет готовый HTML.
<?php
  echo "<h1>Добро пожаловать!</h1>";
?>
<a href="/about">О нас</a>
🚩SPA (Single Page Application) При первом заходе загружается одна HTML-страница и весь JavaScript. Дальше контент подгружается динамически через AJAX или Fetch API.
import React, { useState, useEffect } from "react";

function App() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch("/api/products")
      .then(res => res.json())
      .then(data => setData(data));
  }, []);

  return <div>{data ? JSON.stringify(data) : "Загрузка..."}</div>;
}

export default App;
Ставь 👍 и забирай 📚 Базу знаний

Продажа премиальных апартаментов в Крыму с выгодой! Премиальный комплекс в 30 метрах от собственного пляжа ✅ Комплекс — 4-х к
+4
Продажа премиальных апартаментов в Крыму с выгодой! Премиальный комплекс в 30 метрах от собственного пляжа ✅ Комплекс — 4-х кратный победитель премии в сфере недвижимости URBAN AWORDS как самый привлекательный инвестиционный проект ЮФО 🏠 Комплекс можно: - Сдавать посуточно через отельера международного класса и получать пассивный ежемесячный доход (при этом отдыхая в отпуске в собственном номере) - Выгодно перепродать ⚡ О проекте: - Первая береговая линия – всего в 30 метрах расположен собственный пляж - На территории открытый и 2 круглогодичных бассейна - Более 14,5 га впечатляющей территории: 4-этажный SPA-комплекс, амфитеатр, панорамный ресторан, медцентр, игровое пространство для детей, магазины и бутик ⚡Роскошные панорамные виды на потухший вулкан, море и виноградники ✅Получите цены и презентацию первыми: Перейти на сайт Проектная декларация на сайте https://наш.дом.рф/. #реклама mrqz.me О рекламодателе

🤔 Что такое promise и какие состояния у него есть? Promise в JavaScript — это объект, который представляет результат асинхронной операции. Он может находиться в одном из трёх состояний: pending (ожидание), fulfilled (выполнено) и rejected (отклонено). Fulfilled означает, что операция завершилась успешно, а rejected — что произошла ошибка. Это удобный способ работы с асинхронным кодом и упрощает обработку результатов таких операций. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие значения будут являться falsy значениями? В JavaScript значения, которые при приведении к логическому типу (boolean) становятся false, называются "falsy" значениями. Существует всего семь таких значений: 🟠`false` Логическое значение false.
console.log(Boolean(false)); // false    
🟠`0` Число ноль.
console.log(Boolean(0)); // false    
🟠`-0` Отрицательное число ноль (хотя это редко встречается на практике).
console.log(Boolean(-0)); // false    
🟠`0n` Число BigInt с значением ноль.
console.log(Boolean(0n)); // false    
🟠`""` (пустая строка) Строка без символов.
console.log(Boolean("")); // false    
🟠`null` Специальное значение, обозначающее отсутствие какого-либо значения.
console.log(Boolean(null)); // false    
🟠`undefined` Специальное значение, обозначающее необъявленное или неприсвоенное значение.
console.log(Boolean(undefined)); // false    
🟠`NaN` Специальное значение, обозначающее не число (Not-a-Number).
console.log(Boolean(NaN)); // false    
🚩Примеры использования 🟠Проверка значений на falsy В условиях (if statements) все falsy значения интерпретируются как false.
const values = [false, 0, -0, 0n, "", null, undefined, NaN];

values.forEach(value => {
    if (!value) {
        console.log(`${value} is falsy`);
    }
});
Примеры в условиях
if (!false) {
    console.log('false is falsy'); // выводится
}

if (!0) {
    console.log('0 is falsy'); // выводится
}

if (!"") {
    console.log('"" is falsy'); // выводится
}

if (!null) {
    console.log('null is falsy'); // выводится
}

if (!undefined) {
    console.log('undefined is falsy'); // выводится
}

if (!NaN) {
    console.log('NaN is falsy'); // выводится
}
🟠Использование в логических операторах Falsy значения также учитываются в логических операциях.
const value = null;

const result = value || 'default value';
console.log(result); // 'default value', потому что value является falsy
Ставь 👍 и забирай 📚 Базу знаний

Как повысить эффективность вебинаров? Организация продающего вебинара - не простая задача, ведь необходимо предусмотреть множ
Как повысить эффективность вебинаров? Организация продающего вебинара - не простая задача, ведь необходимо предусмотреть множество деталей: удобную дату, вовлекающий контент, методы продвижения и взаимодействия с участниками. Вебинары от МТС Линк помогают привлекать новых клиентов и увеличивать конверсию из участника в лид. В сервисе доступен анализ поведения пользователей во время вебинара, синхронный перевод, автовебинары и интерактивные инструменты для вовлечения участников. Делимся методичкой с кейсами, чек-листами и инструкциями для маркетологов, PR и event-менеджеров, чтобы сделать вебинары эффективным инструментом для лидогенерации. Получите методичку бесплатно на сайте. Скачать #реклама 16+ mts-link.ru О рекламодателе

🤔 Что известно как видится идеальный процесс работы в команде над задачей? - Чёткая постановка задачи и её декомпозиция; - Обсуждение реализации, согласование интерфейсов; - Деление ответственности; - Использование гита, code review, CI/CD; - Поддержка документации; - Честная и быстрая обратная связь; - Ретроспектива и доработка процессов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем отличие атрибутов от свойств в html тегах? Атрибуты — это то, что записано в HTML. Свойства — это то, что появляется в JavaScript-объекте element. Когда браузер загружает страницу, он парсит HTML и создает DOM-объекты, в которых атрибуты превращаются в свойства. Однако атрибуты и свойства не всегда совпадают! 🟠Атрибуты (`attributes`) Хранятся в HTML. Всегда являются строками. Их можно получить с помощью .getAttribute() и изменить через .setAttribute(). Они не меняются динамически при изменении свойства элемента в JS.
<input id="myInput" type="text" value="Hello">
const input = document.getElementById("myInput");
console.log(input.getAttribute("value")); // "Hello"
🟠Свойства (`properties`) Хранятся в объекте элемента (HTMLElement). Имеют разные типы данных (строки, числа, булевые и т. д.). Меняются динамически при взаимодействии с DOM.
console.log(input.value); // "Hello"
input.value = "New text"; // Меняем свойство
console.log(input.getAttribute("value")); // "Hello" (атрибут НЕ поменялся)
console.log(input.value); // "New text" (свойство изменилось)
Пример с checked у чекбокса
<input type="checkbox" id="myCheckbox" checked>
const checkbox = document.getElementById("myCheckbox");

console.log(checkbox.getAttribute("checked")); // "checked" (атрибут есть, значит включен)
console.log(checkbox.checked); // true (свойство JS - boolean)

checkbox.checked = false; // Меняем состояние чекбокса
console.log(checkbox.getAttribute("checked")); // "checked" (атрибут не поменялся!)
console.log(checkbox.checked); // false (свойство изменилось)
🟠Как правильно работать с атрибутами и свойствами? Если хотите работать с DOM → используйте свойства (element.value, element.checked и т. д.). Если хотите работать с атрибутами в HTML → используйте .getAttribute() и .setAttribute().
const img = document.querySelector("img");

// Меняем атрибут src
img.setAttribute("src", "new-image.jpg");

// Меняем свойство width
img.width = 300;
Ставь 👍 и забирай 📚 Базу знаний

Бесплатный курс по PostgreSQL от практиков рынка Присоединяйтесь к бесплатному курсу по основам PostgreSQL от Selectel и Эльб
Бесплатный курс по PostgreSQL от практиков рынка Присоединяйтесь к бесплатному курсу по основам PostgreSQL от Selectel и Эльбрус Буткемп. Он будет полезен Junior- и Middle-специалистам: администраторам баз данных, разработчикам, DevOps-инженерам и аналитикам.   Вы научитесь: 🔹создавать и связывать таблицы, 🔹выполнять базовые операции с данными, 🔹работать с РСУБД. Бонусы: вы можете получить сертификат о прохождении курса, а также промокоды для практики на мощностях Selectel. Начните обучение уже сегодня. Реклама. АО «Селектел», ИНН 7810962785, ERID: 2VtzqvTS9v8

Такси для бизнеса. Яндекс Go Оптимизируйте свои расходы и повысьте эффективность бизнеса с Яндекс Go Узнать больше #реклама b
Такси для бизнеса. Яндекс Go Оптимизируйте свои расходы и повысьте эффективность бизнеса с Яндекс Go Узнать больше #реклама business.go.yandex О рекламодателе Реклама на Яндексе

🤔 Сталкивался ли во Vue, с таким понятием как потеря реактивности? Да, это возможно при: - добавлении новых свойств в объект напрямую (obj.newProp = value); - мутировании вложенных структур; - использовании Object.assign, Object.freeze; - Vue 2: важно использовать Vue.set или this.$set. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Срочно требуются Веб-Дизайнеры в Figma. Обучим с нуля. Онлайн-программа с наставником и чатом. Осторожно! 80% практики. По ре
Срочно требуются Веб-Дизайнеры в Figma. Обучим с нуля. Онлайн-программа с наставником и чатом. Осторожно! 80% практики. По результату обучения у вас будет портфолио из нескольких работ. Сертификат о прохождении курса. Возможность пройти полное обучение и получить карьерное сопровождение! Учитесь дизайну у профессионалов. Переходи по кнопки: "Узнать больше" и начинай свое обучение. Доступ 0 руб. Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе

🤔 Какие есть альтернативы у redux? Redux – мощный инструмент, но не всегда он необходим. Существует множество альтернатив, каждая из которых подходит для разных сценариев. 🚩React Context API + useReducer Подходит для небольших и средних приложений Встроено в React (не требует установки дополнительных библиотек) useContext` позволяет передавать данные по дереву компонентов без "прокидывания" через props useReducer работает как Redux, но проще
const AuthContext = createContext();

function authReducer(state, action) {
  switch (action.type) {
    case "LOGIN":
      return { ...state, isAuthenticated: true, user: action.payload };
    case "LOGOUT":
      return { ...state, isAuthenticated: false, user: null };
    default:
      return state;
  }
}

function AuthProvider({ children }) {
  const [state, dispatch] = useReducer(authReducer, {
    isAuthenticated: false,
    user: null,
  });

  return (
    <AuthContext.Provider value={{ state, dispatch }}>
      {children}
    </AuthContext.Provider>
  );
}

function LoginButton() {
  const { dispatch } = useContext(AuthContext);
  return (
    <button onClick={() => dispatch({ type: "LOGIN", payload: "Иван" })}>
      Войти
    </button>
  );
}
🚩Zustand Проще Redux, но с теми же возможностями Нет лишних actions и reducers, только функции
import { create } from "zustand";

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));

function Counter() {
  const { count, increment } = useStore();
  return <button onClick={increment}>Счетчик: {count}</button>;
}
🚩Recoil Идеален для React-приложений Гибче, чем Redux, с концепцией "атомов" (раздельные состояния)
import { atom, useRecoilState } from "recoil";

const countState = atom({
  key: "count",
  default: 0,
});

function Counter() {
  const [count, setCount] = useRecoilState(countState);
  return <button onClick={() => setCount(count + 1)}>Счетчик: {count}</button>;
}
🚩Jotai Напоминает Recoil, но без сложных концепций Поддерживает React Suspense и асинхронные состояния
import { atom, useAtom } from "jotai";

const countAtom = atom(0);

function Counter() {
  const [count, setCount] = useAtom(countAtom);
  return <button onClick={() => setCount(count + 1)}>Счетчик: {count}</button>;
}
🚩MobX Автоматически отслеживает изменения состояния Удобен для сложных приложений
import { makeAutoObservable } from "mobx";
import { observer } from "mobx-react-lite";

class CounterStore {
  count = 0;

  constructor() {
    makeAutoObservable(this);
  }

  increment() {
    this.count++;
  }
}

const store = new CounterStore();

const Counter = observer(() => (
  <button onClick={() => store.increment()}>Счетчик: {store.count}</button>
));
🚩XState Подходит для сложных логик (например, UI-анимаций, состояний формы) Удобно описывать последовательности действий
import { createMachine, interpret } from "xstate";

const toggleMachine = createMachine({
  id: "toggle",
  initial: "inactive",
  states: {
    inactive: { on: { TOGGLE: "active" } },
    active: { on: { TOGGLE: "inactive" } },
  },
});

const service = interpret(toggleMachine).start();
service.send("TOGGLE"); // Меняет состояние
Ставь 👍 и забирай 📚 Базу знаний

Онлайн-магистратура с IT специальностями от Яндекса Совместно с ИТМО, МИФИ, МФТИ. Онлайн-магистратура с актуальными программами и гибким графиком обучения. Получите высокооплачиваемую IT профессию, официальный диплом и практические знания. Господдержка оплаты. Совмещение с работой! Подать заявку #реклама 16+ practicum.yandex.ru О рекламодателе

🤔 Что известно про доступность A11y? A11y (Accessibility) — практика создания интерфейсов, доступных для всех, включая людей с ограниченными возможностями: - Использование семантической разметки (<nav>, <main>, <button>); - Поддержка клавиатурной навигации; - Использование aria-атрибутов; - Контрастность, масштабируемость текста; - Тестирование с помощью экранных читалок. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как общаться между iframe и самой страницой? Общение между iframe и родительской страницей может происходить с помощью: Метода postMessage (лучший способ) Доступа к window.frames или window.parent (если тот же домен) Передачи данных через localStorage или cookies 🟠`postMessage` – безопасный способ для разных доменов Метод window.postMessage() позволяет передавать сообщения между разными окнами (iframe, popup, другие вкладки) даже если они на разных доменах. 🚩Передача данных из `iframe` в родительскую страницу *Код в iframe (child.html)
// Отправляем сообщение родительскому окну
window.parent.postMessage({ type: "hello", data: "Привет, родитель!" }, "*");
Код в родительской странице (index.html)
window.addEventListener("message", (event) => {
    console.log("Получено сообщение от iframe:", event.data);
});
* в postMessage означает, что сообщение отправляется любому домену. Лучше указывать конкретный, например:
window.parent.postMessage({ type: "hello" }, "https://example.com");
🚩Передача данных из родителя в `iframe` Код в родительской странице (index.html)
const iframe = document.getElementById("myIframe");

// Ждём, когда iframe загрузится
iframe.onload = () => {
    iframe.contentWindow.postMessage({ type: "greeting", data: "Привет, iframe!" }, "*");
};
Код в iframe (child.html)
window.addEventListener("message", (event) => {
    console.log("Получено сообщение от родителя:", event.data);
});
🚩Доступ к `window.frames` и `window.parent` (только если тот же домен!) Если iframe и основная страница находятся на одном домене, можно обращаться к их window напрямую. Родительская страница → iframe
const iframe = document.getElementById("myIframe");

// Получаем объект `window` внутри `iframe`
iframe.contentWindow.document.body.style.backgroundColor = "lightblue";
iframe → Родительская страница
console.log(window.parent.document.title); // Доступ к заголовку страницы
🚩`localStorage` или `cookies` (если оба окна на одном домене) Можно сохранять данные в localStorage или cookies, а другая сторона будет их читать. Запись в localStorage из iframe
localStorage.setItem("message", "Привет от iframe!");
Чтение localStorage в родительской странице
console.log(localStorage.getItem("message")); // "Привет от iframe!"
Ставь 👍 и забирай 📚 Базу знаний

🤔 При каких значениях position работает z-index? z-index работает, если position — не static, то есть: - relative, absolute, fixed, sticky. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Опасности использования `innerHTML` в JavaScript innerHTML – это свойство, которое позволяет вставлять HTML-код внутрь элемента как строку. Однако оно небезопасно и может привести к серьезным проблемам.
document.getElementById("content").innerHTML = "<h1>Привет!</h1>";
🟠Уязвимость: XSS-атаки (внедрение вредоносного кода) Если innerHTML получает данные от пользователя (например, из формы или URL), хакер может вставить вредоносный JavaScript-код.
const userInput = "<script>alert('Вас взломали!');</script>";
document.getElementById("content").innerHTML = userInput;
🟠Проблемы с безопасностью CSP (Content Security Policy) Если в веб-приложении включена CSP (защита от XSS), то innerHTML может нарушать политику безопасности.
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
🟠Случайное удаление обработчиков событий Если заменить содержимое элемента через innerHTML, все обработчики событий внутри него удалятся.
document.getElementById("btn").addEventListener("click", () => {
  alert("Нажато!");
});

document.getElementById("container").innerHTML = "<button id='btn'>Клик</button>";
document.getElementById("btn").click(); // Ошибка, обработчик удален
Ставь 👍 и забирай 📚 Базу знаний

Ускорьте работу с отзывами на маркетплейсах в 5 раз Шаблоны + ИИ для ответов на отзывы. 9 маркетплейсов в едином кабинете Авт
Ускорьте работу с отзывами на маркетплейсах в 5 раз Шаблоны + ИИ для ответов на отзывы. 9 маркетплейсов в едином кабинете Автоответы на отзывы и аналитика товаров на основе отзывов 📊 Попробовать #реклама 16+ spix.ru О рекламодателе