Страниц (3): « 1 [2] 3 » |
|
Без описания |
Поиск в теме | Версия для печати |
Systemnik |
Отправлено: 27 Марта, 2008 - 01:47:04
|
ExBB Developer Team
Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007
Карма 0
|
Цитата:Извини, я ошибся; значит, это у selectа value обрабатывается корректно.
Скорее ты не ошибся.. так как у радио все обрабатывается корректно только в php....
видимо ты нечайно перепутал понятия этих языков..
Так насчет скрипта который ты предложил..
Проше нельзя??
так .. начинаем разбиратся вот как я понял код функции(если неправ - поправь)
CODE:function getRadioValue(radio)
{
for (var i=0; i<radio.length; i++)
if (radio[i].checked)
return radio[i].value;
return null;
}
Значит она получает параметр в данном случае имя радио переключателя(место расположения)
потом начинает узнавать сколько таких переключаталей всего..
потом она внутри цикла начинает искать тот переключатель который включен..
и ксли находит возвратит его имя если не находит возвратит null
я вроде понял все.. но немогу поняь одного.. почему написано не так:
CODE:function getRadioValue(radio)
{
for (var i=0; i<radio.length; i++) {
if (radio[i].checked) {
return radio[i].value;
} else {
return null;
}
}
Он что номера радио кнопок с одним именем в массив кидает?? Или уву откуда массив взялся?
Теперь вопрос нестолько по формам сколько по php (но не офффтоп!!)
Вот у меня есть код(PHP):
CODE:<?php
/*
Script writed by Systemnik for
teachering me
*/
if($_GET['element'] == "1") {
print("You select is 1 checkbox");
}
if($_GET['element'] == "1" && $_GET['element'] == "2") {
print("You select 2 checkboxes");
}
if($_GET['element'] == "2") {
print("You selct is 2 checkbox");
}
?>
<html>
<head>
<title>
Teachering script
</title>
</head>
<body>
<form>
<input type=checkbox name="element" value="1">
<input type=checkbox name="element" value="2">
<input type=submit value="Submit">
</form>
</body>
</html>
Что я от него хочу??
1 ) Если выбран первый чекбок он пишет
You select is 1 checkbox
2) Если выбран второй чекбокс он пишет
You selct is 2 checkbox
3) Если выбрано два чекбокса должен написать
You select 2 checkboxes
к большому сожалению первое второе работает а третье нет(( Почему??(Отредактировано автором: 27 Марта, 2008 - 02:06:25) |
|
|
Furax |
Отправлено: 27 Марта, 2008 - 03:28:08
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Systemnik пишет:Скорее ты не ошибся.. так как у радио все обрабатывается корректно только в php....
видимо ты нечайно перепутал понятия этих языков.. Нет, как раз в JS перепутал radio и select.
Systemnik пишет:Проше нельзя?? Короче можно, проще - вряд ли. Надо пройтись по всем радиобатонам и узнать, какой из них взведён (или узнать, что никакой не взведён).
Systemnik пишет:Значит она получает параметр в данном случае имя радио переключателя(место расположения) Уясни разницу между именем и указателем! Имя - это строка ("el1". Указатель - это то, что возвращает JavaScript, пройдя по указанному тебе пути в дереве объектов. Сделай alert() того и другого, сравни. Функция получает указатель на коллекцию. Если ей передать вместо указателя на эту коллекцию её имя, функция выдаст ошибку, попытавшись обратиться к элементам массива (а вместо массива - строка).
Systemnik пишет:почему написано не так: <код> Очень просто! Представь, что первая радиокнопка не взведена. Тогда сработает else и твоя функция сразу вернёт null, не проверяя остальные. В моём варианте return false выполняется только после завершения цикла, т. е. когда доподлинно известно, что ни один батон не взведён.
Systemnik пишет:Он что номера радио кнопок с одним именем в массив кидает?? Или уву откуда массив взялся? Он не номера в массив кидает. Он ссылки кидает, а номера от 0 до length-1 - это ключи массива. Массив HTML-элементов, предоставляемый браузером, называется коллекцией (отличия от массива минимальны). Этот массив и возвращается JavaScriptом по ссылке document.form1.el1, этот массив и передаётся в функцию.
По поводу твоего PHP-кода. Начнём с того, что страница написана абсолютно неправильно. (Скорми-ка этот код валидатору - validator.w3.org!) Где аттрибуты action и method у формы? Где тип (doctype)? Конкретно твою проблему вызывает то, что у тебя 2 чекбокса имеют одинаковые имена. Это не является допустимым в HTML. Кроме того, эта строка содержит глупость:CODE:if($_GET['element'] == "1" && $_GET['element'] == "2") В ней проверяется значение переменной $_GET['element']. Как одна переменная может иметь сразу 2 значения? Чекбоксы должны иметь разные имена!
Кстати, включи error_reporting и посмотри на те варнинги, которые тебе выдаст PHP. Нормальный скрипт не выдаёт варнингов. Никогда. Либо подави сообщения об ошибках (символом @), либо проверяй сначала существование соответствующих GET-переменных (функцией isSet), и только после этого - их значение. |
|
|
Furax |
Отправлено: 27 Марта, 2008 - 03:36:06
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Конкретно та ошибка, из-за которой не работает, состоит в том, что ты в 20 строке используешь ссылку document.testingform.radio1, которая получает смысл только в строках 31-35: браузер выполняет код последовательно, и при выполнении 20 строки формы, а уж тем более - принадлежащего ей радиобатона, ещё нет. |
|
|
Furax |
Отправлено: 27 Марта, 2008 - 07:20:18
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
Systemnik пишет:Указатель - document.form.element ??
Имя - element ??
length возвращает колличество эллементов с именем element?? А массив это вот document.form.element ?? Да. JavaScript - язык с нотацией выражений. Выражение 2*2 возвращает 4, выражение 'document' - строку со словом document, выражение document - указатель на объект документа (хотя в JS можно сказать, что ссылку, или что сам объект - здесь эти типы не различаются). Выражение document.form или document['form'] возвращает ссылку на объект формы, выражение document.form.element (или document['form']['element'], или document.form['element'], или document['form'].element) - ссылку на элемент формы.
В случае с радиобатонами, когда одному имени соответствует не один объект, а несколько, возвращается массив этих самых объектов. Хотя у каждого из них может быть свой id, и document.getElementById() будет возвращать ссылку на конкретный объект радиобатона.
В JavaScript стандартнее return null. Или даже return undefined. В PHP - другое дело.
Почему не работает? Во-первых, ещё раз говорю, return null должен стоять после цикла, а не в цикле; у Тебя он выполняется при первой же итерации, если галочка в первом батоне не стоит. Если непременно хочется написать с фигурными скобками, пиши так:CODE:function getRadioValue(radio)
{
for (var i=0; i<radio.length; i++)
{
if (radio[i].checked) {
return radio[i].value;
}
}
return null;
}
Это во-первых. Во-вторых, Systemnik, пойми наконец: компьютер выполняет твою программу последовательно. Что он делает? Сначала создаёт форму с двумя радиобатонами и одной кнопкой. Затем доходит до скрипта. В скрипте он сначала выполняет синтаксический анализ и, не найдя ошибок, обрабатывает код функций, вводя их в область видимости, т. е. сэтого момента он знает, что такое getRadioValue(), test() и start().
Наконец, он выполняет те инструкции, что стоят вне функций. В Nвоём случае это присвоение значений переменной peremennaya. Какого значения? Которое вернёт функця getRadioValue(). Какое она вернёт значение в тот момент, когда не только Ты ещё не щёлкнул ни на одном радиобатоне, но даже и страница-то не до конца загрузилась? Правильно, null!
После щелчка выполняется функция start(), которая передаёт значение переменной peremennaya в функцию test. Понятно, что сравнение null и с "1", и с "2" даёт отрицательный результат, вот никакие окошки и не открываются.
И общеидейное замечание. Мне непонятна Твоя тенденция всюду использовать глобальные переменные. Там, где без них можно обойтись, их не должно быть вообще! Существуют эмпирические правила написания кода, позволяющие значительно сэкономить силы при отладке. Одно из них гласит: каждая переменная должна иметь настолько узкую область видимости, насколько это возможно. Согласись, что когда у тебя 10 000 строк кода, искать, какая же функция выставляет не так значение глобальной переменной, утомительно! Да и в Твоём простом примере это уже привело к путанице (будь peremennaya локальной переменной функции start(), проблем не возникло бы!).(Отредактировано автором: 27 Марта, 2008 - 07:25:56) |
|
|
|
Поиск в теме | Версия для печати |
Страниц (3): « 1 [2] 3 » |
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |
« HTML » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|