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] и т.п., так как на разных страничках подопытного сайта он лежит то последним, то где-то посередине... Как повезет, короче. |
|
Цитата:
|
Спасибо. Но это не работает:
if(location.hostname.indexOf('porno-xxx.ru') != -1) { window.opera.defineMagicFunction ( 'showBanner', function (oRealFunc, oThis, oParam1, oParam2) { alert('VICTORY!'); } ); } Даже сообщение не выскакивает. В чем дело?:help: |
Kolyaj,
разве это не должно работать только в опере? |
Gvozd,
Цитата:
the_name, а сам скрипт-то хоть запускается? |
Цитата:
document.body.innerHTML=document.body.innerHTML.replace(/пищевод/g, 'кирпичи');Или для русских слов нужно как-то по другому? |
Цитата:
|
Цитата:
только что проверил на этой странице же. я бы на вашем месте читал ссулки даваемые вам, полностью. там на второй странице есть скрипт, не передергивающий страницу. также вот, еще одна тема про замену эти скрипты будут получше, чем простая замена, тем что не перерисовывают страницу. но есть пара мелких багов(они все описаны), исправление которых предоставляется вам |
Цитата:
|
Не, если алерт пернести в самое начало скрипта, он, конечно, работает. Вот, например, в следующем скрипте алерт срабатывает, а вот замена - нет.
alert('asdf'); document.addEventListener ( 'load', function () { document.body.innerHTML = document.body.innerHTML.replace(/работает/gi, 'пашет'); }, false );Явно ведь, что косяк в русском языке! Ведь попытка заменить 'Kolyaj' на 'asdfasfd' была почти успешной. "Почти", потому что замены сделаны были, а вот местный ДжаваСкрипт работать перестал (кнопочки типа "процитировать", "выделить курсивом" и т.д.). Пришлось отключать плагин и перезагружать страницу. В чем глюк? |
На счет МэджикФанкшн. В мануале сказано следующее:
Цитата:
|
Цитата:
потому что все отлично "пашет" тестировал опять таки на этой странице. все работает как с русским языком, так и с английским. Уважаемый.Для кого пишутся мои посты и даются ссылки? вы читали темы, указанные мною полностью? тогда почему вы все еще пытаетесь пользоватся этим способом замены? да, этот вариант портит JS. да, он передергивает страницу.да, в указанных мною темах есть скрипты также не лишенные глюков, но которые получше чем этот,и не портят JS к примеру. и они также работают отлично с русским языком, как и этот. почему у вас не получается работать с русским языком, я понятия не имею. выложите код простейшей страницы, на которой у вас не срабтывает замена русских слов, и мы посмотрим что не так. какой у вас браузер?в другом пробовали? короче говоря пробуйте скрипты из указанных мною тем. исправляйте в них глюки, и будет вам счастье |
Цитата:
|
Цитата:
правда в коде страницы есть обработчики повешенные с помощью атрибута. вот почему они не работают, не понятно. но, в любом случае такой заменоя пользоватся не стоит. самый лучший вариант, работать исключительно с текстовыми нодами в индивидуальном порядке. писал человеку из одного вышеупомянутого треда доведенную до ума версию скрипта. тормозов нету.нажал, и оно почти мигом проделало все замены, не нарушая DOM-структуру, и меняя ее только там где надо(там замена с добавлением тегов требовалась, поэтому текстовые ноды естественно менялись на набор нод с тегами и без) |
Ладно бог с ней, с заменой. За ссылки спасибо, конечно. За скрипты в особенности. А что с МаджикФанкшн-то не так?
У меня опера 9.25. |
Код, который вокруг определения showBanner в вражеском скрипте, покажите.
|
Вот целиком весь тег с вражеской функцией.
<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 аргумента. Сути это не меняет. |
Зная оперу, можно предположить, что в данном случае ей нужен defineMagicVariable.
|
Знакомый код :lol:
|
только функция называется BannerLoader...
|
Цитата:
//------------------Если смотрим порно ;) ----------------------- 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 ); }Всем Спасибо за помощь!!! |
Моя титаническая борьба с баннерами продолжается... Возникли новые вопросы. С вашего позволения я их озвучу.
Как найти тег в документе, у которого атрибут 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? |
'blalba'.indexOf('bla') возвращает -1, если подстрока не найдена.
|
Отлично! Большое спасибо! А как раздобыть строчку src у объекта?
|
elem.src
|
Большое спасибо, Gvozd, Kolyaj! Все работает просто замечательно! :victory: Между прочим, после удаления баннеров, композиция страниц изменилась в лучшую сторону. Они стали красивее! :)
|
the_name,
я вот думаю. а не проще ли было купить нормальны платный хостинг без рекламы?) стоит он копейки. можно меньше чем за 2 доллара в месяц хостинг взять, и его будет хватать под любого хомяка |
а при чём здесь хостинг и useJS?
|
Цитата:
я вообще, сказал это к тому, что чем мучатся резать банеры, лучше заплатить за хостинг, и не крутить/резать чужую рекламу. По моему мою фразу в контексте треда вполне можно было понять |
эээ, я так понял, что человек пишет себе юзерJS, чтобы:
Цитата:
|
Извиняюсь.
да, это я протуканил. я просто не в курсе был, что такое UserJS (точнее мне только само название не было известно), поэтому и решил, что человек режет банеры, встраиваемые хостером. |
баннеры встраиваемые хостером режутся с полпинка просто скриптом на страничке... только вот это запрещено на бесплатных хостингах...
|
Цитата:
|
Моя освободительная борьба против рекламы в нете продолжается. Снова нужен совет зантоков, которые с JS на "ты".:) Значительная часть скрипта, который я использую, срабатывает в ответ на событие load, то есть в момент, когда вся страничка уже загружена. Выглядит это приемлимо но не безупречно. А существует ли специальное событие, отробатывающее момент, когда html-код уже загружен, а контент (картинки, анимация) еще нет?
|
|
DOMContentLoaded - именно то, что мне нужно. Спасибо Riim.
|
Часовой пояс GMT +3, время: 15:36. |