Files
AtomicOld/sovetnik-killer.js

164 lines
5.7 KiB
JavaScript
Raw Normal View History

2026-02-14 19:34:54 +03:00
/**
* Блокирует Яндекс-Советник на страницах вашего интернет-магазина
* https://github.com/SerjoPepper/kick_sovetnik
* Если скрипт по каким то причинам перестал работать или что-то ломает на вашем сайте, пожалуйста, создайте тикет:
* https://github.com/SerjoPepper/kick_sovetnik/issues
*/
//if ("Notification" in window) {
// Notification = {permission: 'denied'};
//}
var _yBrowser = (typeof navigator != 'undefined' && typeof navigator.appVersion != 'undefined' && navigator.appVersion.indexOf('YaBrowser') != -1) ? true : false;
if(_yBrowser){
!function(){var e=function(){var e=window.location.hash||!1,t=(document.currentScript||document.getElementById("ss_script"),function(t){e&&"#ssdebug"===e&&console.log(t)});if(!window.MutationObserver)return t("MutationObserver not supported!"),!1;if(navigator.userAgent.indexOf("MSIE")!=-1||navigator.userAgent.indexOf("Trident")!=-1||navigator.userAgent.indexOf("Edge")!=-1)return t("IE or Edge"),!1;var n={},o=!1,r={top:"-1px",display:"table",opacity:"1"},i=new MutationObserver(function(e){e.map(function(e){var n=e.addedNodes[0];if(n&&"DIV"===n.tagName)for(var a in r){if(window.getComputedStyle(n).getPropertyValue(a)!==r[a]){t("YandexDesktopFound-"+a+" false"),o=!1;break}t("YandexDesktopFound-"+a+" true"),o=!0}if(n&&"STYLE"===n.tagName&&/market_context_headcrab_container_relative/.test(n.innerHTML)&&(document.body.removeChild(n),t("style removed")),o){for(var s=n.childNodes,d=0;d<s.length;d++){var u=s[d];u.style&&(u.style.position="absolute")}n&&n.style&&(n.style.transform="translate(-10000px, -10000px)"),setTimeout(function(){i.disconnect()},1e4),t("Elements removed!")}})}),a=new MutationObserver(function(){var e=document.documentElement.style.marginTop;e&&parseInt(e)>0&&!n.panel&&(document.documentElement.style.marginTop="")}),s=new MutationObserver(function(){var e=document.body.style.marginTop;e&&parseInt(e)>0&&!n.panel&&(document.body.style.marginTop="")}),d=function(){return document.body?(i&&i.observe(document.body,{childList:!0,attributes:!0,subtree:!0,attributeFilter:["style"]}),a&&a.observe(document.documentElement,{attributes:!0,attributeFilter:["style"]}),void(s&&s.observe(document.body,{attributes:!0,attributeFilter:["style"]}))):void setTimeout(d,100)};e&&"#ssoff"===e||d()};e()}();
}else{
(function () {
function patchOnMessage() {
window.addEventListener('message', function (e) {
var data;
if (typeof e.data === 'string') {
try {
data = JSON.parse(e.data);
}
catch (e) {
return;
}
} else {
data = e.data;
}
if (data && data.type === 'MBR_ENVIRONMENT') {
e.stopImmediatePropagation();
e.stopPropagation();
e.data = {};
}
}, true);
}
var observer;
function init () {
try {
observer = new MutationObserver(function (records) {
check(records);
});
} catch (e) {
}
if (document.body) {
checkNodes(document.body.children);
}
}
function startObserve () {
if (!document.body) {
setTimeout(startObserve, 200);
return;
}
if (observer) {
observer.observe(document.body, {childList: true});
}
}
function stopObserve () {
if (observer) {
observer.disconnect();
observer = null;
}
}
// Проверки
function check (records) {
records.forEach(function (record) {
var addedNodes = record.addedNodes;
if (addedNodes && addedNodes.length) {
checkNodes(addedNodes);
}
});
}
function checkNodes (nodes) {
Array.prototype.slice.call(nodes).forEach(function (node) {
if (isDiv(node) && (hasSovetnikLink(node) || isYaBar(node))) {
remove(node);
}
});
}
// Скрываем яндекс-советник со страницы, возвращаем прежний margin-top для body
function remove (node) {
var style = node.style;
style.marginTop = '-200px';
style.zIndex = '-9999';
style.webkitTransform =
style.MozTransform =
style.msTransform =
style.OTransform =
style.transform = 'translate(-9999px, -9999px)';
// следим в течении 3 сек за изменением marginTop у html
var marginObserver = new MutationObserver(function () {
var marginTop = document.documentElement.style.marginTop;
if (marginTop && parseInt(marginTop, 10) !== 0) {
document.documentElement.style.marginTop = '';
}
});
setTimeout(function () {
marginObserver.disconnect();
marginObserver = null;
}, 5e3);
marginObserver.observe(document.documentElement, {attributes: true, attributeFilter: ['style']});
document.documentElement.style.marginTop = '';
}
// Определяем по косвенным признакам, что этот элемент - Яндекс-Советник
function isYaBar (node) {
var bgColor = getStyle(node, 'background-color');
return (bgColor === 'rgb(250, 223, 118)' || bgColor === 'rgb(250, 223, 117)') &&
getStyle(node, 'position') === 'fixed' &&
getStyle(node, 'display') === 'table';
}
function isDiv (node) {
return node.tagName === 'DIV';
}
function hasSovetnikLink (node) {
return !!node.querySelector('[href*="sovetnik.market.yandex.ru"]');
}
function getStyle (node, prop) {
return window.getComputedStyle(node).getPropertyValue(prop);
}
try {
init();
startObserve();
patchOnMessage();
setTimeout(stopObserve, 15e3);
} catch (e) {
}
})();
}
$(function(){
$('div').each(function(){
//console.log($(this))
})
})