Greasy Fork is available in English.

Ozon, Wildberries, Simaland и Яндекс.Маркет настройка: сначала плохие отзывы + улучшения интерфейса

Ozon, Wildberries, Simaland и Яндекс.Маркет: сортировка отзывов по товару по возрастанию рейтинга

< Feedback de Ozon, Wildberries, Simaland и Яндекс.Маркет настройка: сначала плохие отзывы + улучшения интерфейса

Avaliação: Bom - o script funciona

§
Publicado em: 01/04/2025

"Привет! Добавил функцию блокировки открытия товаров в новой вкладке. Теперь все ссылки на товары должны (в каталоге и на страницах) открываться только в текущей вкладке, даже при клике средней кнопкой или через контекстное меню.
Обновите скрипт и проверьте! ."


Пользователь просит добавить функцию, которая блокирует открытие товаров в новой вкладке на маркетплейсах (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), чтобы включать/выключать эту функцию.

Enviar resposta

Entre para publicar uma resposta.