"Привет! Добавил функцию блокировки открытия товаров в новой вкладке. Теперь все ссылки на товары должны (в каталоге и на страницах) открываться только в текущей вкладке, даже при клике средней кнопкой или через контекстное меню. Обновите скрипт и проверьте! ."
Пользователь просит добавить функцию, которая блокирует открытие товаров в новой вкладке на маркетплейсах (Ozon, Wildberries, Simaland, Яндекс.Маркет), где работает этот скрипт. Давайте разберем, как это можно реализовать в рамках предоставленного кода. Задача: Заблокировать открытие ссылок на товары в новых вкладках (например, при клике средней кнопкой мыши или через контекстное меню "Открыть в новой вкладке"), чтобы пользователь оставался в текущей вкладке. Решение: Можно перехватывать события кликов по ссылкам на товары и предотвращать их стандартное поведение (открытие в новой вкладке), перенаправляя действие на текущую вкладку. Это можно сделать с помощью event.preventDefault() и управления навигацией через window.location.href. Вот как это можно добавить в скрипт: Изменения в коде: Добавим новую функцию blockNewTabLinks и вызовем её в соответствующих местах для каждого маркетплейса. Я размещу её в общем блоке, чтобы она работала для всех ссылок на товары, которые уже обрабатываются в скрипте. 1. Добавляем функцию blockNewTabLinks: javascript
// Блокировка открытия ссылок в новой вкладке function blockNewTabLinks() { if (config.SettingsOnOff) { // Выбираем все ссылки на товары (адаптируем селекторы под маркетплейсы) const productLinks = document.querySelectorAll( 'a[href^="/product/"], ' + // Ozon 'a[href*="/catalog/"][href*="/detail.aspx"], ' + // Wildberries 'a[href*="/product/"][href*="/feedbacks"], ' + // Wildberries Global 'a[href^="/"][href*=".sima-land.ru/"], ' + // Simaland 'a[href*="/product--"][href*="&uniqueId="]' // Яндекс.Маркет );
productLinks.forEach(link => { // Убираем возможность открытия в новой вкладке через атрибуты link.removeAttribute('target'); // Удаляем target="_blank", если есть
// Перехватываем клики link.addEventListener('click', (event) => { // Проверяем, если это средняя кнопка мыши (wheel) или контекстное меню с новой вкладкой if (event.button === 1 || event.ctrlKey || event.metaKey) { event.preventDefault(); // Предотвращаем стандартное поведение window.location.href = link.href; // Перенаправляем в текущей вкладке } });
// Перехватываем событие contextmenu для блокировки "Открыть в новой вкладке" link.addEventListener('contextmenu', (event) => { event.preventDefault(); // Блокируем контекстное меню window.location.href = link.href; // Открываем в текущей вкладке }); }); } }
2. Интеграция в существующий код: Вызовем blockNewTabLinks в ключевых местах, где скрипт уже работает с DOM, чтобы обработка ссылок происходила после их загрузки или изменения. Ozon (каталог и страницы товаров): В функции addOzonSortParamToLinks после обработки ссылок добавим вызов: javascript
function addOzonSortParamToLinks() { if (config.SettingsOnOff) { const links = document.querySelectorAll('a[href^="/product/"]:not([href*="&sort=score_asc"])'); links.forEach(link => { // Существующий код... }); blockNewTabLinks(); // Добавляем блокировку после обработки ссылок } }
Wildberries (каталог): В функции addWildberriesSortParamToLinks после обработки ссылок: javascript
function addWildberriesSortParamToLinks() { if (config.SettingsOnOff) { // Существующий код... handleNewElement(element); blockNewTabLinks(); // Добавляем блокировку } }
Simaland (каталог): В функции SimaLandCatalogReviews после обработки рейтингов: javascript
function SimaLandCatalogReviews() { const interval = setInterval(() => { // Существующий код... if (aReviews) { clearInterval(interval); // Существующий код обработки divs... blockNewTabLinks(); // Добавляем блокировку } }, 50); }
Общий вызов при загрузке страницы: Добавим вызов функции после полной загрузки страницы для всех маркетплейсов: javascript
// Вызов при загрузке и динамическом изменении window.addEventListener('load', blockNewTabLinks); const observer = new MutationObserver(blockNewTabLinks); observer.observe(document.body, { childList: true, subtree: true });
Как это работает: Селекторы: Функция выбирает ссылки на товары, специфичные для каждого маркетплейса.
Перехват событий: click: Блокирует среднюю кнопку мыши (button === 1), Ctrl+клик и Cmd+клик (metaKey).
contextmenu: Блокирует контекстное меню (правый клик → "Открыть в новой вкладке").
Перенаправление: Вместо открытия в новой вкладке перенаправляет в текущей через window.location.href.
Динамика: MutationObserver следит за новыми ссылками, добавляемыми в DOM.
Ограничения: Контекстное меню: Полное блокирование contextmenu может отключить другие функции (например, "Копировать ссылку"). Если это нежелательно, можно убрать event.preventDefault() из contextmenu и оставить только перенаправление.
Пользовательский опыт: Некоторые пользователи могут захотеть открыть ссылку в новой вкладке вручную. Можно добавить настройку в config (например, blockNewTabs), чтобы включать/выключать эту функцию.
"Привет! Добавил функцию блокировки открытия товаров в новой вкладке. Теперь все ссылки на товары должны (в каталоге и на страницах) открываться только в текущей вкладке, даже при клике средней кнопкой или через контекстное меню.
Обновите скрипт и проверьте! ."
Пользователь просит добавить функцию, которая блокирует открытие товаров в новой вкладке на маркетплейсах (Ozon, Wildberries, Simaland, Яндекс.Маркет), где работает этот скрипт. Давайте разберем, как это можно реализовать в рамках предоставленного кода.
Задача:
Заблокировать открытие ссылок на товары в новых вкладках (например, при клике средней кнопкой мыши или через контекстное меню "Открыть в новой вкладке"), чтобы пользователь оставался в текущей вкладке.
Решение:
Можно перехватывать события кликов по ссылкам на товары и предотвращать их стандартное поведение (открытие в новой вкладке), перенаправляя действие на текущую вкладку. Это можно сделать с помощью event.preventDefault() и управления навигацией через window.location.href.
Вот как это можно добавить в скрипт:
Изменения в коде:
Добавим новую функцию blockNewTabLinks и вызовем её в соответствующих местах для каждого маркетплейса. Я размещу её в общем блоке, чтобы она работала для всех ссылок на товары, которые уже обрабатываются в скрипте.
1. Добавляем функцию blockNewTabLinks:
javascript
// Блокировка открытия ссылок в новой вкладке
function blockNewTabLinks() {
if (config.SettingsOnOff) {
// Выбираем все ссылки на товары (адаптируем селекторы под маркетплейсы)
const productLinks = document.querySelectorAll(
'a[href^="/product/"], ' + // Ozon
'a[href*="/catalog/"][href*="/detail.aspx"], ' + // Wildberries
'a[href*="/product/"][href*="/feedbacks"], ' + // Wildberries Global
'a[href^="/"][href*=".sima-land.ru/"], ' + // Simaland
'a[href*="/product--"][href*="&uniqueId="]' // Яндекс.Маркет
);
productLinks.forEach(link => {
// Убираем возможность открытия в новой вкладке через атрибуты
link.removeAttribute('target'); // Удаляем target="_blank", если есть
// Перехватываем клики
link.addEventListener('click', (event) => {
// Проверяем, если это средняя кнопка мыши (wheel) или контекстное меню с новой вкладкой
if (event.button === 1 || event.ctrlKey || event.metaKey) {
event.preventDefault(); // Предотвращаем стандартное поведение
window.location.href = link.href; // Перенаправляем в текущей вкладке
}
});
// Перехватываем событие contextmenu для блокировки "Открыть в новой вкладке"
link.addEventListener('contextmenu', (event) => {
event.preventDefault(); // Блокируем контекстное меню
window.location.href = link.href; // Открываем в текущей вкладке
});
});
}
}
2. Интеграция в существующий код:
Вызовем blockNewTabLinks в ключевых местах, где скрипт уже работает с DOM, чтобы обработка ссылок происходила после их загрузки или изменения.
Ozon (каталог и страницы товаров):
В функции addOzonSortParamToLinks после обработки ссылок добавим вызов:
javascript
function addOzonSortParamToLinks() {
if (config.SettingsOnOff) {
const links = document.querySelectorAll('a[href^="/product/"]:not([href*="&sort=score_asc"])');
links.forEach(link => {
// Существующий код...
});
blockNewTabLinks(); // Добавляем блокировку после обработки ссылок
}
}
Wildberries (каталог):
В функции addWildberriesSortParamToLinks после обработки ссылок:
javascript
function addWildberriesSortParamToLinks() {
if (config.SettingsOnOff) {
// Существующий код...
handleNewElement(element);
blockNewTabLinks(); // Добавляем блокировку
}
}
Simaland (каталог):
В функции SimaLandCatalogReviews после обработки рейтингов:
javascript
function SimaLandCatalogReviews() {
const interval = setInterval(() => {
// Существующий код...
if (aReviews) {
clearInterval(interval);
// Существующий код обработки divs...
blockNewTabLinks(); // Добавляем блокировку
}
}, 50);
}
Общий вызов при загрузке страницы:
Добавим вызов функции после полной загрузки страницы для всех маркетплейсов:
javascript
window.addEventListener('load', () => {
blockNewTabLinks();
});
Динамическое обновление (MutationObserver):
Чтобы блокировать новые ссылки, появляющиеся динамически, добавим наблюдатель:
javascript
const observer = new MutationObserver(() => {
blockNewTabLinks();
});
observer.observe(document.body, { childList: true, subtree: true });
3. Полный код с интеграцией:
Добавьте этот блок в начало скрипта (после 'use strict' и определения config):
javascript
// Блокировка открытия ссылок в новой вкладке
function blockNewTabLinks() {
if (config.SettingsOnOff) {
const productLinks = document.querySelectorAll(
'a[href^="/product/"], ' +
'a[href*="/catalog/"][href*="/detail.aspx"], ' +
'a[href*="/product/"][href*="/feedbacks"], ' +
'a[href^="/"][href*=".sima-land.ru/"], ' +
'a[href*="/product--"][href*="&uniqueId="]'
);
productLinks.forEach(link => {
link.removeAttribute('target');
link.addEventListener('click', (event) => {
if (event.button === 1 || event.ctrlKey || event.metaKey) {
event.preventDefault();
window.location.href = link.href;
}
});
link.addEventListener('contextmenu', (event) => {
event.preventDefault();
window.location.href = link.href;
});
});
}
}
// Вызов при загрузке и динамическом изменении
window.addEventListener('load', blockNewTabLinks);
const observer = new MutationObserver(blockNewTabLinks);
observer.observe(document.body, { childList: true, subtree: true });
Как это работает:
Селекторы: Функция выбирает ссылки на товары, специфичные для каждого маркетплейса.
Перехват событий:
click: Блокирует среднюю кнопку мыши (button === 1), Ctrl+клик и Cmd+клик (metaKey).
contextmenu: Блокирует контекстное меню (правый клик → "Открыть в новой вкладке").
Перенаправление: Вместо открытия в новой вкладке перенаправляет в текущей через window.location.href.
Динамика: MutationObserver следит за новыми ссылками, добавляемыми в DOM.
Ограничения:
Контекстное меню: Полное блокирование contextmenu может отключить другие функции (например, "Копировать ссылку"). Если это нежелательно, можно убрать event.preventDefault() из contextmenu и оставить только перенаправление.
Пользовательский опыт: Некоторые пользователи могут захотеть открыть ссылку в новой вкладке вручную. Можно добавить настройку в config (например, blockNewTabs), чтобы включать/выключать эту функцию.