Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проблемы со скриптом от Оперы (https://javascript.ru/forum/events/9168-problemy-so-skriptom-ot-opery.html)

Black_Sun 03.05.2010 10:59

Проблемы со скриптом от Оперы
 
Собственно есть userjs код
Тут самое начало и тут же проблема, как преобразовать в greasemonkey этот код
var cookieName = 'userjs_data';
*!*
opera.addEventListener("BeforeExternalScript",function(l)
 {
   var m=l.element.getAttribute("src",false);
*/!*
   if(m)
   {
     if(m.search(/^http:\/\//i)!=-1&&m.search(/http:\/\/(\w\.)*mysite\.net(:\d+)?\//i)==-1)
     {
       l.preventDefault()
     }
   }
 }
 ,false);

Тут я незнаю чем заменить set(document.getElementById("downl"));
function g()
 {
   if(location.href.search(/^http:\/\/(www\.)?mysite\.net\/download\/.+\.html$/i)!=-1)
   {
*!*
set(document.getElementById("downl"));
*/!*
     var o=document.getElementById("dvdownl");
     if(o)
     {
       if(o.md5crypt&&o.md5crypt.value)
       {
         j(cookieName,e(o.md5crypt.value),0,".mysite.net")
       }
       o.submit()
     }
     return
   }

Тут пытался заменить var l=document.selectNodes("//a[@href]"); на get...byTagName, ...evaluate не вышло
if(location.href.search(/mysite\.net\/tmpl\/download\.php(\?link=)?/i)!=-1)
   {
     if(top!=self&&location.href.indexOf("#userjs")==-1)
     {
       top.location.href=location.href+"#userjs";
       return
     }
*!*
 var l=document.selectNodes("//a[@href]");
*/!*
     for(var m=0;m<l.length;m++)
     {
       if(l[m].href.search(/^http:\/\/(\w+\.)?mysite\.net\/download[\da-f]+\//)!=-1)
       {
         l[m].onclick=null
       }
     }
     var n=f(cookieName);
     k(cookieName,".mysite.net");
 ......

Ну а тут начинается самое интересное, по идее cookies он должен захватывать и преобразовывать или же нет?
function j(m,o,l,n)
 {
   o=o?escape(o):"";
   n=n?n:"";
   l=l?l.toGMTString():"";
   document.cookie=m+"="+o+"; domain="+n+"; path=/; expires="+l
 }
 function f(m)
 {
   var p=m+"=";
   var o=document.cookie.indexOf(p);
   if(o==-1)
   {
     return null
   }
   var n=document.cookie.indexOf(";",o+p.length);
   if(n==-1)
   {
     n=document.cookie.length
   }
   var l=p.length;
   return unescape(document.cookie.substring(o+l,n))
 }
 function k(l,m)
 {
   m=m?m:"";
   document.cookie=l+"=; domain="+m+"; path=/; expires="+new Date((new Date).getTime()-100000000000).toGMTString()
 }


на Опере работает идеально, но в Firefox (greasemonkey) работать на всю мощь отказывается
Вот что мне удалось сделать(изменил только верх, где addEventListener)
var cookieName = 'userjs_data';
 *!*
window.addEventListener("load",function(l)
 {   aelements = document.getElementsByTagName("a");

 for (l=0;l<aelements.length;l++) 
  {
   var m = aelements[l].getAttribute("src",false);
*/!*
   if(m)
   {
     if(m.search(/^http:\/\//i)!=-1&&m.search(/http:\/\/(\w\.)*mysite\.net(:\d+)?\//i)==-1)
     {
       l.preventDefault()
     }
   }
  }
 }
 ,false);


Помогите плиз отладить скрипт и где надо что-то добавить/удалить/изменить и т.п.

p.s. Я так полагаю проблема в cookies и в var l=document.selectNodes("//a[@href]"); и ещё Консоль ошибок показывает что неизвестно l.element

subzey 03.05.2010 11:16

Вы опубликовали очень много кода.

Пожалуйста, локализуйте проблему!

Выделите фрагмент кода, по которому есть вопрос и опубликуйте его отдельно.

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

Спасибо.

P.S. код форматируют специальные теги [js] ... [/js], [html] ... [/html] и другие аналогичные, см. http://javascript.ru/formatting

Black_Sun 03.05.2010 11:41

Ок, сделал, если всё равно много напишите тогда буду по кускам просто в каждом посте писать и разбираться

Black_Sun 04.05.2010 14:11

так, по порядку
1. чем можно заменить
var m=l.element.getAttribute("src",false);

потому как пишет что l.element is undefined
2. чем можно заменить
var l=document.selectNodes("//a[@href]");

3. чем можно заменить
opera.addEventListener("BeforeExternalScript",function(l)
под firefox greasemonkey
и
4.Как проверить перехватываются ли cookie и изменяются ли?
(куда поставить alert или что-то подобное?)

Lexi 06.05.2010 00:27

Цитата:

потому как пишет что l.element is undefined
«BeforeExternalScript
Fired when a script element with a src attribute is encountered.
The script element is available as the element attribute of the UserJSEvent.
...
element
Object, readonly: the script or plug-in element.
All the usual DOM methods are available, such as getAttribute and setAttribute.
Available for BeforeExternalScript»

Black_Sun 06.05.2010 13:16

А по русски можно? а то немного понял, т.е. BeforeExternalScript надо использовать вместо load?

p.s. Ещё с куки беда, я тут поколдовал с alert он функцию md5crypt.value не видит вообще(не выводит ничего alert) так же выводит null при написании var n=f(cookieName);alert(f(cookieName)); :( беда в общем

Lexi 07.05.2010 00:13

BeforeExternalScript блочит загрузку скрипта, который соответствует регэкспу. Не факт, что он обязателен. Но это проще посмотреть в опере, выкинув этот кусок кода.

Black_Sun 07.05.2010 09:54

Lexi, вы правы, работает и без него, но вот после ввода каптчи cookie не записывается, а в консоле ошибок пишется
Код:

Ошибка: document.selectNodes is not a function
Источник: /extensions/%7Be4a8a97b-f2ed-450b-b12d-ee082ba24781%7D/components/greasemonkey.js
Строка: 427


Lexi 07.05.2010 13:30

Логично, ведь фокс это не поддерживает. Но в данном случае оно должно сводиться к document.getElementsByTagName('a')

Black_Sun 07.05.2010 13:45

Lexi,
ясно, но всё равно f(cookieName) alert выдаёт null. вверху скрипта
var cookieName = 'userjs_data';
а получение взято отсюда http://www.codenet.ru/webmast/php/cookies.php

function f(m)  //Получение куки (function getCookie(name) )
 {
   var p=m+"="; //var prefix = name + "="
   var o=document.cookie.indexOf(p);   //var cookieStartIndex = document.cookie.indexOf(prefix)
   if(o==-1)   //if (cookieStartIndex == -1)
   {
     return null
   }
   var n=document.cookie.indexOf(";",o+p.length); //var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length)
   if(n==-1)    //if (cookieEndIndex == -1)
   {
     n=document.cookie.length   //cookieEndIndex = document.cookie.length
   }
   var l=p.length;
   return unescape(document.cookie.substring(o+l,n))  //return unescape(document.cookie.substring (cookieStartIndex + prefix.length, cookieEndIndex))
 }


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