Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Цикл, не работает без алерта. (https://javascript.ru/forum/misc/10619-cikl-ne-rabotaet-bez-alerta.html)

KamaZz 12.07.2010 20:43

Цикл, не работает без алерта.
 
var planet = document.getElementById('rechts').getElementsByClassName('smallplanet');
var planet_id = new Array();
var planet_pics = new Array();
var planet_name = new Array();
var planet_coords = document.getElementsByClassName('planet-koords')[0].innerHTML;
var moon_id = new Array();
var moon_pics = new Array();
var moon_name = new Array();
var moon_coords = new Array();
var planet_count = 0;
var moon_count = 0;
var planet_number = 0;
var moon_number = 0;

for (var i = 0; i <= planet.length; i++) {
	planet_id[i] = planet[i].innerHTML.split('moonlink')[0].slice(planet[i].innerHTML.split('moonlink')[0].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[0].indexOf('" title'));
	planet_pics[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planetPic')[0].src;
	planet_name[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-name')[0].innerHTML;
	planet_coords[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-koords')[0].innerHTML;
	if (planet[i].innerHTML.indexOf('src="img/planets/moon/') > 0) {
		moon_id[i] = planet[i].innerHTML.split('moonlink')[1].slice(planet[i].innerHTML.split('moonlink')[1].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[1].indexOf('" title'));
	}
}

alert(moon_id[3]);


Так как указано в примере не хочет работать, выдает:
Код:

Error: planet[i] is undefined
Но если вставить alert в тело цикла, цикл без проблем обрабатывается.
Подскажите пожалуйста, в чём я ошибся?

Gvozd 12.07.2010 20:51

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

KamaZz 12.07.2010 23:05

В таком случае почему, если alert вставить в тело цикла, все объекты считаются загруженными, и нормально выдают нужный мне результат?

Скрипт работает из под GreaseMonkey...

Gvozd 13.07.2010 00:52

за то время пока вы смотрите на алерт, успевает загрузится HTML_код страницы

KamaZz 13.07.2010 02:50

Добавил onLoad... Ситуации это не изменило...

С Alert - работает.
onLoad = get_vars();

function get_vars () {
	for (var i = 0; i <= planet.length; i++) {
		planet_id[i] = planet[i].innerHTML.split('moonlink')[0].slice(planet[i].innerHTML.split('moonlink')[0].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[0].indexOf('" title'));
		planet_pics[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planetPic')[0].src;
		planet_name[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-name')[0].innerHTML;
		planet_coords[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-koords')[0].innerHTML;
		if (planet[i].innerHTML.indexOf('src="img/planets/moon/') > 0) {
			moon_id[i] = planet[i].innerHTML.split('moonlink')[1].slice(planet[i].innerHTML.split('moonlink')[1].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[1].indexOf('" title'));
		}
		alert(moon_id[3]);
	}
}


Без Alert - не работает.
onLoad = get_vars();

function get_vars () {
	for (var i = 0; i <= planet.length; i++) {
		planet_id[i] = planet[i].innerHTML.split('moonlink')[0].slice(planet[i].innerHTML.split('moonlink')[0].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[0].indexOf('" title'));
		planet_pics[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planetPic')[0].src;
		planet_name[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-name')[0].innerHTML;
		planet_coords[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-koords')[0].innerHTML;
		if (planet[i].innerHTML.indexOf('src="img/planets/moon/') > 0) {
			moon_id[i] = planet[i].innerHTML.split('moonlink')[1].slice(planet[i].innerHTML.split('moonlink')[1].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[1].indexOf('" title'));
		}
	}
}


Не могли-бы вы посоветовать что-то более конкретное?
т.к. насколько мне известно GreaseMonkey подгружает скрипт после загрузки страницы, хотя возможно я не прав.

exec 13.07.2010 06:27

Во-первых, не onLoad, а window.onload. Во-вторых, вы опять же запускаете функцию до загрузки страницы.

window.onload = get_vars;

KamaZz 13.07.2010 12:52

window.onload = get_vars;
Error: Component is not available

window.onload = get_vars();
Error: planet[i] is undefined

jetli13 13.07.2010 14:47

Цитата:

Сообщение от KamaZz (Сообщение 63481)
window.onload = get_vars;
Error: Component is not available

window.onload = get_vars();
Error: planet[i] is undefined

а так?
window.onload = function(){
  get_vars();
}

KamaZz 13.07.2010 15:31

Error: Component is not available
Line: 42
window.onload = function(){


window.onload = function(){
  for (var i = 0; i <= planet.length; i++) {
        planet_id[i] = ....
  }
}

Тоже самое...

Вот весь код:

var url = location.href;
var nickname = document.getElementById('playerName').getElementsByClassName(
		'textBeefy')[0].innerHTML;
var server = url.split('/')[2];
var uni_name = document.getElementsByTagName('title')[0].innerHTML;
var address = url.split('/')[4];
var page = address.match(/page=([^&]+)/);
var session = address.match(/session=(.+)$/);
var planet = document.getElementById('rechts').getElementsByClassName('smallplanet');
var planet_id = new Array();
var planet_pics = new Array();
var planet_name = new Array();
var planet_coords = document.getElementsByClassName('planet-koords')[0].innerHTML;
var moon_id = new Array();
var moon_pics = new Array();
var moon_name = new Array();
var moon_coords = new Array();
var planet_count = 0;
var moon_count = 0;
var planet_number = 0;
var moon_number = 0;


window.onload = function(){
	  get_vars();
	}

function get_vars () {
	for (var i = 0; i <= planet.length; i++) {
		planet_id[i] = planet[i].innerHTML.split('moonlink')[0].slice(planet[i].innerHTML.split('moonlink')[0].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[0].indexOf('" title'));
		planet_pics[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planetPic')[0].src;
		planet_name[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-name')[0].innerHTML;
		planet_coords[i] = planet[i].getElementsByClassName('planetlink')[0].getElementsByClassName('planet-koords')[0].innerHTML;
		if (planet[i].innerHTML.indexOf('src="img/planets/moon/') > 0) {
			moon_id[i] = planet[i].innerHTML.split('moonlink')[1].slice(planet[i].innerHTML.split('moonlink')[1].indexOf('&amp;cp=')+8, planet[i].innerHTML.split('moonlink')[1].indexOf('" title'));
		}
	}
}


Всё что идёт до функции без проблем парситься и выводиться через те-же alert'ы...
Но сама функция не хочет...

GreaseMonkey, Firefox/3.6.6

Kolyaj 13.07.2010 15:44

Цитата:

Сообщение от KamaZz
for (var i = 0; i <= planet.length; i++) {

Строго меньше должно быть, как минимум.


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