как обратиться к полю, если оно массив

dimagolov

Новичок
usascha
читать книжки по JS надо, а не только копипастить.
+ в JS это сложение (чисел) и конкатенация (слов). Если один из операндов строка - будет конкатенация. Так вот, value это всегда строка.

п.с. как конвертить строки в числа в JS сам найдешь или ссылку давать?
 

usascha

Новичок
если бы проблемы решались простым "копипастить"! Эх, вот бы житуха была!

Про плюс как сложение и конкатенацию я всё же знаю. Не всё так запущено.
Вот я додумался до того, что у меня может быть несколько значений t (меню с возможностью multiple).

Значит надо создавать массив из значений t и обходить их в цикле?
Поэтому придумал вот такое:
Код:
function makeArray() {
    for (i = 0; i<makeArray.arguments.length; i++)
        this[i] = makeArray.arguments[i];
}

<select class="quest_sel" name="theme_num[]" onchange='alert("а");
if(this.form["theme_num[]"].selectedIndex >-1) {
		alert("б");
		var t = new Array();
		var result = 0;
		alert("в");
		for (var i=this.form["theme_num[]"].options.selectedIndex; i<this.form["theme_num[]"].options.length;i++) {
			alert("г");
			if (this.form["theme_num[]"].options[i].selected) {
				t[i] += this.form["theme_num[]"].options[i].value + "";
		alert("д");
				var MyArray = new makeArray();
		alert("е");
			}
			alert(MyArray);
			for(var r=0; r<MyArray.arguments.length;r++)
				result =+ MyArray.arguments[r] - 0;
			}
		}
		this.form.theme_num_sel.value = result;
		alert("ж");
	}
	this.form["theme_num[]"].value = this.form.theme_num[selectedIndex].value;
	alert("з");
}' dir="ltr" lang="ru" multiple>
скрипт доходит только до "д". Подскажите куда смотреть в этом коде или в функции?
 

dimagolov

Новичок
Вау :) какой стильный индуский код :D
а чем стандартный Array не угодил?
и это прикол такой - объявлять переменную внутри if (то есть иногда), а юзать ее снаружи всегда?

еще раз повторю. ну не нужно писать обработчики в атрибутах. ф-ии придумали для этого.
 

usascha

Новичок
за "индусский код", конечно. спасибо, но по другому пока не умею.

Переменную я уже объявлял в самых разных местах. Просто этот вариант сюда попал. До него скрипт даже и не доходит.

Внутри обработчика поставил специально, чтобы было видно на какой строке скрипт прекращается, как функция код просто не работает, если есть хоть какая-то ошибка.

Про стандартный Array, если можно, поподробнее.
я нашёл 3 варианта преобразования строки в число:
parseInt()
parseFloat()
t = + некое значение - 0; тогда t д.б. числом.

Как их применить в коде
Код:
<select class="quest_sel" name="theme_num[]" onchange='
	if(this.form["theme_num[]"].selectedIndex >-1) {
		alert("а");
		var t = 0;
		for (i=this.form["theme_num[]"].options.selectedIndex; i<this.form["theme_num[]"].options.length;i++) {
			alert("i_"+i);
			if (this.form["theme_num[]"].options[i].selected) {
				t = this.form["theme_num[]"].options[i].value;
				alert("t_"+t);
			}
		}
		this.form.theme_num_sel.value = t;
		alert("ж");
	}
	this.form["theme_num[]"].value = this.form.theme_num[selectedIndex].value;
	alert("з");
}' dir="ltr" lang="ru" multiple>
 

dimagolov

Новичок
по данному коду.
зачем var t = new Array(); ? все равно как массив не пользуете.
если уж сами отладить не в состоянии, то хоть постите реальный код и говорите "исполнилось до такого места включительно"

еще есть Number(), но я так понимаю, что parseInt вполне достаточно (не забывайте 10 вторым параметром ставить)

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

usascha

Новичок
я поменял в предыдущем посте t = new Array(); на t = 0;
С таким изменением мой код выполняется до конца и на выходе я получаю несколько значений в поле theme_num_sel выведенных одно за другим.

И, наконец-то, у меня получилось то что искал, я просто не добавлял второй параметр этих функций:

t += Number(this.form["theme_num[]"].options.value,10);

Спасибо за помощь, хотя могли бы уж и сразу указать на эту строчку и функцию.

Ещё раз спасибо.

-~{}~ 11.01.08 23:55:

в виде функции, естественно, пришлось поменять this.form на document.formname.

Отлаживаю сразу в двух броузерах: ФФ и ИЕ, так вот последний пишет: "selectedIndex - определение отсутствует."

Я не знаю какая из двух строчек его не устраивает и, главное, как исправить! При этом оба броузера выдают нужный результат.
Подскажите как поправить.
 

dimagolov

Новичок
usascha, ИЕ не устраивает, что он найти selectedIndex не может. естественно оба раза :D
выкиньте selectedIndex нафиг и просто переберайте все options.

вообще понимание того, что каждый оператор делает и зачем сильно упрощает отладку :D
 

usascha

Новичок
ИЕ действительно в обоих случаях ругается на selectedIndex, но если я его заменяю на options, то скрипт не работает... :(

Решил внять Вашему аргументу и не использовать id. Выбрал title:
t += Number(document.create["theme_num[]"].options.getElementByTitle, 10);

Но скрипт выдает NaN. Что это означает я знаю - Not A Number. Тогда какие вообще возможны варианты? Google нашёл рекордно мало ссылок на getElementByTitle.
 

dimagolov

Новичок
какая каша.... вы что такое "алгоритм" слышали? хоть в общих чертах? понимать что скрипт делает пытались?
selectedIndex в том скрипте исключительно чтобы не перебирать опции если ничего не выбрано (что не верно, так как после снятия выбора с последнего сумма не пересчитается и не станет 0) - это первое место, а второе - начинать цикл с первого выбранного.
надо ли объяснять что без всего этого можно обойтись и всегда перебирать все options?
причем тут id, title и т.д? объясните словами, что с суммой делать хотите и зачем
 

usascha

Новичок
по первому месту: после выбора, его нельзя убрать, как минимум один выбор в этом меню останется. Значит он не должен и не может становиться равным 0.

По поводу второго, мне и надо начинать цикл, только тогда, когда пользователь сделал выбор (если я понял, что Вы мне написали). :)

С суммой собираюсь делать следующее: есть ещё один параметр формы, который указывает пользователь, при сабмите формы, этот второй параметр не должен быть больше суммы.
 

dimagolov

Новичок
Автор оригинала: usascha
По поводу второго, мне и надо начинать цикл, только тогда, когда пользователь сделал выбор (если я понял, что Вы мне написали). :)
Вы вешаете на onchange. Это значит что обработчик в принципе вызовиться, если выбор в селекте юзер поменяет

Автор оригинала: usascha
С суммой собираюсь делать следующее: есть ещё один параметр формы, который указывает пользователь, при сабмите формы, этот второй параметр не должен быть больше суммы.
ну MyCoolForm.MyCoolSumm= summ, потом в обработчика сабмита
PHP:
if (MyCoolForm.MyCoolSumm === undefined || MyCoolForm.MyCoolSumm > parseInt(MyCoolForm.FieldZZZ.value, 10) {
alert ("Error in field FieldZZZ");
return false;
}
нафига трогать какие-то предопределенные атрибуты?
 

usascha

Новичок
я бы использовал этот вариант с большим удовольствием. Проблема в том,что мне надо от каждого option одного выпадающего меню получить и передать по-разному (js, php) по два разных значения.

собственно поэтому и пытаюсь присвоить второе значение (для js) какому-то другому элементу (title, id ...)

-~{}~ 14.01.08 19:31:

Всем снова привет. Я решил проблему, как раздать из одного value два разных значения (для js и php):

Код:
function count_max() {
	if(document.create["theme_num[]"].selectedIndex >-1) {
		var t = 0;
		var tt = new Array();
		for (i=document.create["theme_num[]"].options.selectedIndex; i<document.create["theme_num[]"].options.length;i++) {
			if (document.create["theme_num[]"].options[i].selected) {
				//считаем максимум вопросов
				t += Number(document.create["theme_num[]"].options[i].value.split("|")[0], 10);
				alert("t_"+t);
				//собираем номера тем вопросов
				tt += document.create["theme_num[]"].options[i].value.split("|")[1];
				tt = tt.split("").join(",");
			}
		}
		document.create['theme_num_sel'].value = t;
	}
	alert("tt_"+tt);
//	document.create["theme_num[]"].value = document.create.theme_num[selectedIndex].value;
	document.create["theme_num[]"].value == tt;
}
Значение value параметра theme_num создаётся вида "a|b".

Всё с этим замечательно, значения те что "a" складываются, а те что "b" объединяются и, как я думаю, становятся массивом (1,2,3 и т.п.).

Но остаётся проблема на последней строке этого скрипта: на следующую php-страницу у меня по-прежнему передаётся первое выбранное в theme_num значение в виде "a|b". Подскажите почему?

-~{}~ 14.01.08 19:52:

поправка: на следующую страницу передаются все значения theme_num (возможно multiple) в этом самом виде - "a|b"
 
Сверху