Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибка function is not defined (https://javascript.ru/forum/misc/11706-oshibka-function-not-defined.html)

KamaZz 08.09.2010 16:02

Ошибка function is not defined
 
for (var i = 0; i < 14; i++) {
	document.getElementById('details' + fleet[i][0]).setAttribute('onclick', 'check(' + fleet[i][0] + '); return false;');
}

function check(fleet) {
	alert(fleet);
}

При нажатии на ссылку, FireFox выдаёт:
Цитата:

Error: check is not defined

И еще, если я пишу:
var fleetbox = document.getElementById('buttonz');
for (var i = 0; i < 14; i++) {
	fleetbox.getElementById('details' + fleet[i][0]).setAttribute('onclick', 'check(' + fleet[i][0] + '); return false;');
}

Цитата:

Error: fleetbox.getElementById is not a function

Kolyaj 08.09.2010 16:06

Цитата:

Сообщение от KamaZz
Error: check is not defined

Значит нет в глобальной области видимости функции check.

Цитата:

Сообщение от KamaZz
Error: fleetbox.getElementById is not a function

getElementById есть только у документа, т.к. id должен быть уникальным для всего документа.

B@rmaley.e><e 08.09.2010 16:07

Метод getElementById определен только для объекта document.
Задавать обработчики событий лучше через addEventListener / attachEvent или задавая соответствующее свойство для узла. Тут Вам понадобятся замыкания (хотя можно обойтись без них).

KamaZz 08.09.2010 16:42

Браузер каким-то образом разделяет пространства имен скриптов сайта и моего скрипта?

Kolyaj 08.09.2010 16:47

А что вы подразумеваете под вашим скриптом?

KamaZz 08.09.2010 16:52

Это скрипт под GreaseMonkey...

Kolyaj 08.09.2010 17:12

Назначайте обработчик нормально.

KamaZz 08.09.2010 17:18

Пытался, но судя по всему моих познаний в JavaScript недостаточно...

var fleet = new Array(13);

fleet[0] = new Array( 202, 2000, 2000, 0 );
fleet[1] = new Array( 203, 6000, 6000, 0 );
fleet[2] = new Array( 204, 3000, 1000, 0 );
fleet[3] = new Array( 205, 6000, 4000, 0 );
fleet[4] = new Array( 206, 20000, 7000, 2000 );
fleet[5] = new Array( 207, 45000, 15000, 0 );
fleet[6] = new Array( 208, 10000, 20000, 10000 );
fleet[7] = new Array( 209, 10000, 6000, 2000 );
fleet[8] = new Array( 210, 0, 1000, 0 );
fleet[9] = new Array( 211, 50000, 25000, 15000 );
fleet[10] = new Array( 212, 0, 2000, 500 );
fleet[11] = new Array( 213, 60000, 50000, 15000 );
fleet[12] = new Array( 214, 5000000, 4000000, 1000000 );
fleet[13] = new Array( 215, 30000, 40000, 15000 );

for (var i = 0; i < 14; i++) {
     document.getElementById('details' + fleet[i][0]).addEventListener('click', function() { check(fleet[i][0]) }, false);
}

var check = function(fleet) {
    alert(fleet);
}


В FireFox(GM), выдаёт.
Error: fleet[i] is undefined

В Опере всё работает...

Kolyaj 08.09.2010 17:27

http://javascript.ru/basic/closure#p...-ispolzovaniya

subzey 08.09.2010 21:08

Цитата:

Сообщение от KamaZz (Сообщение 70167)
Это скрипт под GreaseMonkey...

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

KamaZz 26.09.2010 17:47

if (page) {
	var buttons = document.getElementById("buttonz");
	for (i = 0; i < page.length; i++) {
		try {
			buildings = buttons.getElementsByClassName(buildId + page[i][0]);
			buildings[0].firstChild.nextSibling.innerHTML += "<a href=\"javascript: setQueue('" + pagename + "', " + page[i][0] + ");\" title=\"|Поставить в очередь на постройку\" class=\"fastBuild tipsStandard feldwebel\"><img width=\"22\" height=\"14\" src=\"img/layout/pixel.gif\"><img width=\"22\" height=\"14\" src=\"img/layout/pixel.gif\"></a>";
		} catch (e) {
			GM_log(e.message);
		}
	}
}

function setQueue(pagename, id) {
	GM_setValue('build', new Array(id, pagename));
	alert(GM_getValue('build'));
}


В консоли выдает:
Error: setQueue is not defined
javascript: setQueue('station', 14);

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

exec 26.09.2010 17:52

Функция setQueue объявлена внутри замыкания? Если да, то надо добавить

window.setQueue = setQueue;

KamaZz 26.09.2010 19:50

Замыкание возникает внутри цикла?
Если да, то она вне замыкания... Просто при вызове этой функции (на ссылку жму), в консоли пишется что функция не объявлена...

KamaZz 27.09.2010 12:25

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

KamaZz 27.09.2010 15:49

Помогло unsafeWindow.setQueue = setQueue;
Цитата:

Error: Greasemonkey access violation: unsafeWindow cannot call GM_setValue.
Но при использовании unsafeWindow, GreaseMonkey не даёт мне пользоваться функциями GM'a... Такими как GM_setValue, etc...
Существуют-ли другие способы решения этой проблемы?

KamaZz 28.09.2010 13:36

Error: missing formal parameter
Line: 1, Column: 10
Source Code:
(function('station', 21) { return function() { setQueue('station', 21); } })(1);
"<a href=\"#\" onclick=\"(function('" + pagename + "', " + page[i][0] + ") { return function() { setQueue('" + pagename + "', " + page[i][0] + "); } })(" + i + ");\" class=\"fastBuild\">";

exec 28.09.2010 13:38

Цитата:

(function('station', 21) {
В аргументах функции должны быть только их названия, а не строки и числа.

KamaZz 28.09.2010 14:07

Error: missing ) after formal parameters (указатель показывает на квадратную скобку)
(function(pagename, page[i][0]) { return function() { setQueue('station', 14); } })(0);

Error: missing formal parameter (указатель показывает на одинарную кавычку)
(function('pagename', page[i][0]) { return function() { setQueue('station', 14); } })(0);

Kolyaj 28.09.2010 14:09

KamaZz,
за вас тут ещё и синтаксические ошибки разбирать? Учебник почитайте, чтобы бред не писать.

KamaZz 28.09.2010 14:38

Прошу прощение, действительно глупость написал :)
Но замыкание не срабатывает... Зато ошибок уже не выдаёт...
Укажите пожалуйста, где я еще обшибся?

if (page) {
	var buttons = document.getElementById("buttonz");
	for (i = 0; i < page.length; i++) {
		try {
			buildings = buttons
					.getElementsByClassName(buildId + page[i][0]);
			buildings[0].firstChild.nextSibling.innerHTML += "<a href=\"#\" onclick=\"(function(pagename, page) { return function() { setQueue('" + pagename + "', " + page[i][0] + "); } })(" + i + ");\" class=\"fastBuild\"><img width=\"22\" height=\"14\" src=\"img/layout/pixel.gif\"></a>";
		} catch (e) {
			GM_log(e.message + "\nOccurred in function \"turnButtons\"");
		}
	}
}

//setQueue('sadasd', 1212);

function setQueue(pagename, id) {
	/*
	 * var array = new Array(id, pagename); GM_setValue('build', array);
	 * alert(GM_getValue('build'));
	 */
	alert('test');
}


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