2010-11-05 5 views
1

Я развиваю свой первый Greasemonkey скрипт (пытается редактировать и добавлять содержимое страницы конкретного сайта) и по какой-то причине, он отказывается работать за один while цикла .. Например:Loops в GreaseMonkey

var anchorTag = window.document.getElementsByTagName('a'); 
var anchorTagNumber = window.document.getElementsByTagName('a').length; 
.. 
.. 
i = 0 
j = 0; 
function collectId(i,link) { 
    linkArray[j] = new Array(2); 
    linkArray[j][0] = i; 
    linkArray[j][1] = link; 
    j++; 
} 


while(i <= anchorTagNumber) 
{ 
    testHref = anchorTag[i].href; 
    testHTML = anchorTag[i].innerHTML; 
    patHref = /some regex/; 
    patCaptureId = /some regex/; 
    testId = patCaptureId.exec(testHref); 
    patHTML = /some regex/; 
    patHTML2 = /some regex/; 
    patHTML3 = /some regex/; 
    if(patHref.test(testHref) && !patHTML.test(testHTML) && !patHTML2.test(testHTML)) 
    { 
     linkId = testId[1]; 
     collectId(i,linkId); 
    } 
    i++; 
} 

Что-нибудь после этого цикла кончится, отказывается работать. Даже простой alert, похоже, не выполняется. У меня есть еще одна петля while с аналогичной структурой, и если я сначала поставлю ее, она будет выполнена, а этого нет. Есть идеи ? Заранее спасибо !

+0

Вы пытались помещать некоторые предупреждения в свой цикл, чтобы увидеть, в какой момент это не удается? извини, я бы догадался о exec. –

+0

также, возможно, попробуйте с Firefox и используйте консоль ошибок, если только Chrome не имеет то же самое. –

+1

Почему вы получаете привязывающие метки дважды? Просто используйте 'var anchorTagNumber = anchorTag.length', чтобы сделать его более эффективным. И выяснить, что проблема может добавить 'console.log (i, anchorTagNumber)' в цикл while. – 2010-11-05 09:02:09

ответ

3

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

Этот: while(i <= anchorTagNumber)
Должно быть: while(i < anchorTagNumber).
Если массив имеет длину 5, к примеру, его последний элемент будет иметь индекс 4.

Кроме того, это:

var anchorTag = window.document.getElementsByTagName('a'); 
var anchorTagNumber = window.document.getElementsByTagName('a').length; 


Может быть упрощена:

var anchorTag  = window.document.getElementsByTagName('a'); 
var anchorTagNumber = anchorTag.length; 


Это немного ускорит выполнение кода, а также упростит обслуживание или повторное использование кода в будущем.

+0

Вы также можете избавиться от 'window.' –

+0

Спасибо большое .. Получил это .. – 0xff0000

1

Вместо того, чтобы использовать некоторое время, вы можете попробовать setInterval для вызова функции каждые 100 миллисекунд.

interval = setInterval(function(){ 
    iDidIt = doSomethin() 
    if(iDidIt){ 
     clear interval; 
    } 
},100)