Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   User JS! (нужна консультация) (https://javascript.ru/forum/misc/3168-user-js-nuzhna-konsultaciya.html)

the_name 24.03.2009 12:34

User JS! (нужна консультация)
 
Уважаемые форумчане, помогите пожалуйста разобраться со следующими вопросами:


1. Как при помощи пользовательского JS ПРЕДОТВРАТИТЬ исполнение вражеской функции с чужой странички, если я знаю ее имя (showBanner), но не знаю положения в DOM (странички генерятся динамически, и функция showBanner располагается по разному)?

2. Как в теле хтмл-документа находить и заменять конкретный текст на другой конкретный текст? Например, мне надо везде в документе слово "пищевод" заменить на слово "кирпичи", чтобы весь остальной текст остался нетронутым? Пусть даже этот текст содержится в объявлении тега. То есть чтобы хтмл-текст
"что угодно пищевод <a href="www.ru" пищевод>ссылка</a>"
был заменен на
"что угодно кирпичи <a href="www.ru" кирпичи>ссылка</a>".
Как это сделать?

Сразу скажу, что JS я знаю достаточно поверхностно. Вообще меня больше волнует первый вопрос. Как несложно догадаться, хочу убить злую рекламу. Для этого я использовал следующий скрипт:

if(location.hostname.indexOf('porno-xxx.ru') != -1)
{
document.addEventListener (
    'load',
    function () 
    {
	var bnr = document.getElementById("banner001");
	var prnt = bnr.parentNode;
	prnt.removeChild(bnr);
	bnr = document.getElementById("banner002");
	prnt = bnr.parentNode;
	prnt.removeChild(bnr);
    },
    false
  );	
}


Скрипт работает нормально, но есть проблема. Я удаляю два тега DIV с идентификаторами banner001 и banner002, куда вражеская функция (showBanner) подгружает баннер. Скрипт срабатывает по факту загрузки страницы, и поэтому с момента окончания загрузки баннера до момента окончания загрузки страницы (несколько секунд) баннер красуется на страничке, повергая меня в ярость:-E . Как убить функцию showBanner?!?!?!

На всякий случай опишу врага. Объявляется функция следующим образом:
var showBanner = function(id, params){
код функции
}
При этом лежит она прямо на самой страничке в одном из тегов <script> </script>. Тег нельзя отследить с помощью конструкций типа document.getElementsByTagName("script")[k] и т.п., так как на разных страничках подопытного сайта он лежит то последним, то где-то посередине... Как повезет, короче.

AzriMan 24.03.2009 12:39

2. http://javascript.ru/forum/misc/2946...html#post13718

Kolyaj 24.03.2009 12:40

Цитата:

Сообщение от the_name
Как при помощи пользовательского JS ПРЕДОТВРАТИТЬ исполнение вражеской функции с чужой странички

http://operafan.net/component/option...emagicfunction

the_name 24.03.2009 13:26

Спасибо. Но это не работает:

if(location.hostname.indexOf('porno-xxx.ru') != -1)
{
window.opera.defineMagicFunction (
    'showBanner',
    function (oRealFunc, oThis, oParam1, oParam2) 
    {
	alert('VICTORY!');
    }
  );	
}


Даже сообщение не выскакивает. В чем дело?:help:

Gvozd 24.03.2009 13:34

Kolyaj,
разве это не должно работать только в опере?

Kolyaj 24.03.2009 13:38

Gvozd,
Цитата:

Сообщение от the_name
User JS! (нужна консультация)


the_name,
а сам скрипт-то хоть запускается?

the_name 24.03.2009 13:42

Цитата:

Сообщение от Gvozd (Сообщение 15043)
Kolyaj,
разве это не должно работать только в опере?

Мне и нужно в опере. Но это не работает! Не работает также и замена:

document.body.innerHTML=document.body.innerHTML.replace(/пищевод/g, 'кирпичи');
Или для русских слов нужно как-то по другому?

the_name 24.03.2009 13:48

Цитата:

а сам скрипт-то хоть запускается
С магической функцией? Видимо, нет. Во всяком случае на запуск showBanner не срабатывает. В консоле ошибок тишина.

Gvozd 24.03.2009 13:51

Цитата:

Сообщение от the_name
Не работает также и замена:

прекрасно работает.
только что проверил на этой странице же.
я бы на вашем месте читал ссулки даваемые вам, полностью.
там на второй странице есть скрипт, не передергивающий страницу.
также вот, еще одна тема про замену
эти скрипты будут получше, чем простая замена, тем что не перерисовывают страницу.
но есть пара мелких багов(они все описаны), исправление которых предоставляется вам

Kolyaj 24.03.2009 14:22

Цитата:

Сообщение от the_name
Видимо, нет.

alert в начало файла добавьте, у проверьте.

the_name 24.03.2009 15:02

Не, если алерт пернести в самое начало скрипта, он, конечно, работает. Вот, например, в следующем скрипте алерт срабатывает, а вот замена - нет.
alert('asdf');
document.addEventListener (
    'load',
    function () 
    {
	document.body.innerHTML = document.body.innerHTML.replace(/работает/gi, 'пашет');
    },
    false
  );
Явно ведь, что косяк в русском языке! Ведь попытка заменить 'Kolyaj' на 'asdfasfd' была почти успешной. "Почти", потому что замены сделаны были, а вот местный ДжаваСкрипт работать перестал (кнопочки типа "процитировать", "выделить курсивом" и т.д.). Пришлось отключать плагин и перезагружать страницу. В чем глюк?

the_name 24.03.2009 15:11

На счет МэджикФанкшн. В мануале сказано следующее:
Цитата:

Этот метод может использоваться UserJS для отмены глобальных функций, определенных постоянными скриптами
Посмотрите пожалуйста на объявление функции showBanner. Я, конечно, могу ошибаться, но ведь var создает переменную, да еще и локальную. Может проблема именно в этом?

Gvozd 24.03.2009 15:19

Цитата:

Сообщение от the_name
Явно ведь, что косяк в русском языке!

нет.проблема в чем-то другом у вас.
потому что все отлично "пашет"
тестировал опять таки на этой странице.
все работает как с русским языком, так и с английским.

Уважаемый.Для кого пишутся мои посты и даются ссылки?
вы читали темы, указанные мною полностью?
тогда почему вы все еще пытаетесь пользоватся этим способом замены?
да, этот вариант портит JS. да, он передергивает страницу.да, в указанных мною темах есть скрипты также не лишенные глюков, но которые получше чем этот,и не портят JS к примеру.
и они также работают отлично с русским языком, как и этот.
почему у вас не получается работать с русским языком, я понятия не имею.
выложите код простейшей страницы, на которой у вас не срабтывает замена русских слов, и мы посмотрим что не так.
какой у вас браузер?в другом пробовали?

короче говоря пробуйте скрипты из указанных мною тем.
исправляйте в них глюки, и будет вам счастье

Kolyaj 24.03.2009 15:29

Цитата:

Сообщение от the_name
местный ДжаваСкрипт работать перестал (кнопочки типа "процитировать", "выделить курсивом" и т.д.). Пришлось отключать плагин и перезагружать страницу. В чем глюк?

Таким кодом вы фактически заменяете весь DOM, поэтому навешанные ранее события перестают работать.

Gvozd 24.03.2009 15:39

Цитата:

Сообщение от Kolyaj
Таким кодом вы фактически заменяете весь DOM, поэтому навешанные ранее события перестают работать.

это конечно да.
правда в коде страницы есть обработчики повешенные с помощью атрибута. вот почему они не работают, не понятно.
но, в любом случае такой заменоя пользоватся не стоит.
самый лучший вариант, работать исключительно с текстовыми нодами в индивидуальном порядке.
писал человеку из одного вышеупомянутого треда доведенную до ума версию скрипта.
тормозов нету.нажал, и оно почти мигом проделало все замены, не нарушая DOM-структуру, и меняя ее только там где надо(там замена с добавлением тегов требовалась, поэтому текстовые ноды естественно менялись на набор нод с тегами и без)

the_name 24.03.2009 15:44

Ладно бог с ней, с заменой. За ссылки спасибо, конечно. За скрипты в особенности. А что с МаджикФанкшн-то не так?
У меня опера 9.25.

Kolyaj 24.03.2009 16:22

Код, который вокруг определения showBanner в вражеском скрипте, покажите.

the_name 24.03.2009 18:02

Вот целиком весь тег с вражеской функцией.
<script type="text/javascript">
<!--
var showBanner = function(id, onScroll, size, params){
	var cm=(document.compatMode=="CSS1Compat"),de=document.documentElement,db=document.body;
	var code=function(){
		var rnd = Math.round(Math.random()*1000000000), src = 'http://porno-xxx.ru/cgi-bin/erle.cgi?'+params;
		return '<iframe src="'+src+'" id="'+id+'_'+rnd+'" frameborder="0" vspace="0" hspace="0" '+size+' marginwidth="0" marginheight="0" scrolling="no" style="overflow:hidden"></iframe>';
	};
	var banner = obj = document.getElementById(id); 
	if (!obj)return;
	if (!onScroll) { obj.innerHTML = code(); return; }
	var ar_top = parseInt(obj.style.height)/2;
	while(obj.offsetParent){ ar_top += obj.offsetTop; obj = obj.offsetParent; }
	var ar_scroll = function(){
		var ch = self.innerHeight || cm && de.clientHeight || db.clientHeight;
		var st = self.pageYOffset || cm && de.scrollTop || db.scrollTop;
		if (ar_top > st && st + ch > ar_top) {
			removeEvent(window, 'scroll', ar_scroll);
			banner.style.visibility = "visible";
			banner.innerHTML = code();
		}
	};
	addEvent(window, 'scroll', ar_scroll);
	ar_scroll(id, size, params);
};
onDomReady(function(){
//addEvent(window, 'load', function(){
	new showBanner("banner001", false, 'width="120" height="300"', 'sid=103715&bt=30&pz=1&sz=m_35_44&rnd=' + Math.round(Math.random() * 100000000));
	new showBanner("banner002", true, 'width="600" height="90"', 'sid=103715&bt=19&pz=1&sz=m_35_44&rnd=' + Math.round(Math.random() * 100000000));
	//clean AR
	var c = document.cookie.split(/\s*;\s*/);
	var date = new Date(); date.setTime(1); var exp = date.toGMTString();
	for (var i=0;i<c.length;i++) {
		var n = c[i].split('=')[0];
		if (n.substr(0, 3) == "ar_") {
			document.cookie = n + "= ; expires=" + exp + "; path=/";
		}
	}
});

//-->
</script>
Выше я намеренно для простоты писал, что showBanner имеет только 2 аргумента. Сути это не меняет.

Kolyaj 24.03.2009 18:06

Зная оперу, можно предположить, что в данном случае ей нужен defineMagicVariable.

ZoNT 24.03.2009 18:25

Знакомый код :lol:

ZoNT 24.03.2009 18:26

только функция называется BannerLoader...

the_name 24.03.2009 18:42

Цитата:

Зная оперу, можно предположить, что в данном случае ей нужен defineMagicVariable.
Именно так!:yes: Вопрос снимается.:dance: Окончательный вариант скрипта выглядит так:

//------------------Если смотрим порно  ;) -----------------------

if(location.hostname.indexOf('porno-xxx.ru') != -1)
{



//-------------------гасим вражескую функцию-------------------

    window.opera.defineMagicVariable (
        'showBanner',
        function (c) { return 0; },
        function (n) { return 0; } );  



//-------------------Удаляем контейнер под рекламу--------------

    document.addEventListener (
        'load',
        function () 
        {
            var bnr = document.getElementById("banner001");
            var prnt = bnr.parentNode;
            prnt.removeChild(bnr);
            bnr = document.getElementById("banner002");
            prnt = bnr.parentNode;
            prnt.removeChild(bnr);
        },
        false );  
}
Всем Спасибо за помощь!!!

the_name 27.03.2009 09:01

Моя титаническая борьба с баннерами продолжается... Возникли новые вопросы. С вашего позволения я их озвучу.

Как найти тег в документе, у которого атрибут src содержит определенную подстроку? Например, чтобы для подстроки 'zamokk.ru' были бы найден тег <img src="http://zamokk.ru/goods/section.php?SECTION_ID=744">.

Хотел сделать примерно следующее:
var all_elem = document.getElementsByTagName('*');
for(i=0; i<all_elem.length; i++) {
	if(проверка на содержание подстроки в src){
		var elem = all_elem[i];
		var parent = elem.parentNode;
		parent.removeChild(elem);
	}
}
Как осуществить эту самую проверку?

И вообще, где можно найти полный список свойств и атрибутов элементов DOM?

Kolyaj 27.03.2009 10:52

'blalba'.indexOf('bla') возвращает -1, если подстрока не найдена.

the_name 27.03.2009 11:23

Отлично! Большое спасибо! А как раздобыть строчку src у объекта?

Gvozd 27.03.2009 11:31

elem.src

the_name 27.03.2009 13:57

Большое спасибо, Gvozd, Kolyaj! Все работает просто замечательно! :victory: Между прочим, после удаления баннеров, композиция страниц изменилась в лучшую сторону. Они стали красивее! :)

Gvozd 27.03.2009 14:15

the_name,
я вот думаю.
а не проще ли было купить нормальны платный хостинг без рекламы?)
стоит он копейки.
можно меньше чем за 2 доллара в месяц хостинг взять, и его будет хватать под любого хомяка

ZoNT 27.03.2009 16:18

а при чём здесь хостинг и useJS?

Gvozd 27.03.2009 16:26

Цитата:

Сообщение от ZoNT
а при чём здесь хостинг и useJS?

а к чему эта ваша фраза?

я вообще, сказал это к тому, что чем мучатся резать банеры, лучше заплатить за хостинг, и не крутить/резать чужую рекламу. По моему мою фразу в контексте треда вполне можно было понять

ZoNT 27.03.2009 16:47

эээ, я так понял, что человек пишет себе юзерJS, чтобы:
Цитата:

Сообщение от the_name
при помощи пользовательского JS ПРЕДОТВРАТИТЬ исполнение вражеской функции с чужой странички

Ключевое слово "чужой".

Gvozd 27.03.2009 16:54

Извиняюсь.
да, это я протуканил.
я просто не в курсе был, что такое UserJS (точнее мне только само название не было известно), поэтому и решил, что человек режет банеры, встраиваемые хостером.

ZoNT 27.03.2009 17:01

баннеры встраиваемые хостером режутся с полпинка просто скриптом на страничке... только вот это запрещено на бесплатных хостингах...

the_name 28.03.2009 07:20

Цитата:

лучше заплатить за хостинг, и не крутить/резать чужую рекламу
Это конечно так. Но дело в том, что я режу баннеры на чужих сайтах, которые чаще всего посещаю. Так что я исключительно для себя стараюсь. ;)

the_name 05.06.2009 09:53

Моя освободительная борьба против рекламы в нете продолжается. Снова нужен совет зантоков, которые с JS на "ты".:) Значительная часть скрипта, который я использую, срабатывает в ответ на событие load, то есть в момент, когда вся страничка уже загружена. Выглядит это приемлимо но не безупречно. А существует ли специальное событие, отробатывающее момент, когда html-код уже загружен, а контент (картинки, анимация) еще нет?

Riim 05.06.2009 09:55

http://dpp.su/blog/jslib-event-js/

the_name 05.06.2009 10:10

DOMContentLoaded - именно то, что мне нужно. Спасибо Riim.


Часовой пояс GMT +3, время: 15:36.