Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: взаимоисключающие поля
 
 автор: Valick   (23.12.2012 в 13:34)   письмо автору
 
 

Всем привет. Моя логика заточена под РНР и MySQL, поэтому в JS мне тяжело.
Поставил себе задачу.
При вводе в поле input (если на этом поле нет блокировки) значения, должно блокироваться поле select, при удалении текста из input есдественно disabled селекта должно сбросится.
и тоже самое наоборот, при выборе любого значения кроме значения по умолчанию select (если оно не блокировано), блокируется input и соответственно при выборе дефолтного значения input должен разблокироваться.
В идеале конечно наделить функцию универсальностью, чтобы количество блокируемых не ограничивалось двумя полями и их типом, но пока хочу сделать как написано в задании.
Пробовал начинать учить JS "с первой страницы" книг, но просто растворяюсь, хочу попробовать заход со стороны практики :)
вот форма:

echo "<form action='' method='POST'>
<p>Введите название фирмы или выбирите из списка</p>
<p>Новая фирма: <input type='text' name='firm' value='' /></p>
<p>Фирма из БД: ";
if(mysql_num_rows($res)>0){
    echo "<select name='fsel' id='fsel' size='1'>
            <option selected value=''>выбирайте</option>";
    while($m=mysql_fetch_assoc($res)){
        echo "<option value='$m[f_id]'>$m[f_name]</option>";
    }
}else{
        echo "<select disabled name='fsel' size='1'>
                <option selected value=''>Фирмы не найдены</option>";
}
echo  "</select></p>
<p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
<p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
<p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
<p><input type='submit' name='go' value='Добавить запись в БД' /></p>
</fopm>";

кому интересно вот тема с полным скриптом в конце темы

  Ответить  
 
 автор: ЯСА   (23.12.2012 в 13:38)   письмо автору
 
   для: Valick   (23.12.2012 в 13:34)
 

запустите свой файл в браузере, скопируйте браузерный исходный код и выложите его здесь
тогда поможем

  Ответить  
 
 автор: Valick   (23.12.2012 в 13:43)   письмо автору
 
   для: ЯСА   (23.12.2012 в 13:38)
 

 <form action='' method='POST'>
<p>Введите название фирмы или выбирите из списка</p>
<p>Новая фирма: <input type='text' name='firm' value='' /></p>
<p>Фирма из БД: <select name='fsel' id='s1' size='1'>
<option selected value=''>выбирайте</option>
<option value='1'>Маргарита</option></select></p>
<p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
<p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
<p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
<p><input type='submit' name='go' value='Добавить запись в БД' /></p>
</fopm>

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

<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8">
  <title>Пример страницы</title>
 </head>
<body>
<p><a href='?action=crbase'>создать базу данных</a></p>
<form action='' method='POST'>
  <p>Введите название фирмы или выбирите из списка</p>
  <p>Новая фирма: <input type='text' name='firm' value='' /></p>
  <p>Фирма из БД: 
  <select name='fsel' id='s1' size='1'>
        <option selected value=''>выбирайте</option>
        <option value='1'>Маргарита</option>
        <option value='2'>Рога и копыта</option>
        <option value='3'>Строймонтажсервис</option>
  </select></p>
  <p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
  <p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
  <p>Укажите сумму: <input type='text' name='sum[]' value='' /></p>
  <p><input type='submit' name='go' value='Добавить запись в БД' /></p>
</fopm>
</body>
</html>

тут еще один нюанс, при совершенно пустой базе будет <select name='fsel' id='s2' size='1'> сразу блокированный селект, и при очистке input disable уже не должен сбрасываться
я так понимаю событие должно быть onfocus
на отключенный элемент я так понимаю onfocus уже не сработает?

  Ответить  
 
 автор: Valick   (23.12.2012 в 14:16)   письмо автору
 
   для: Valick   (23.12.2012 в 13:43)
 

значит как-то так?
<input type='text' name='firm' id='f1' onfocus='kacheli(s1)' value='' />

  Ответить  
 
 автор: ЯСА   (23.12.2012 в 14:47)   письмо автору
 
   для: Valick   (23.12.2012 в 14:16)
 

[пустое value и type="text" указывать вовсе не обязательно, они по-умолчанию таковые]

итак, для
<input name='firm' id='f1' /> и <select name='fsel' id='s1' size='1'>
можно сделать следующее:
1) по onfocus в инпуте включаем таймер, который периодически проверяет наличие/отсутствие значения у инпута и, соответственно, делает селект c id="s1" недоступным/доступным

2) по onblur таймер выключаем

3) так как при пустой базе у вас изменится id у селекта на "s2", то, значит, в п. 1 надо включать проверку наличия тега с id="s1"
для упрощения кода используем то, что при указании валидного значения для id во всех браузерах автоматически создаётся объект с именем == этому значению id
[в скобках отмечу, что именно ПОЭТОМУ надо давать валидные значения для id, а именно - содержащие латинские буквы любого регистра, арабские цифры и символ подчёркивания, причём начинаться id должно с буквы
и именно ПОЭТОМУ значения id должны быть уникальными на странице не только в HTML-коде, но и в скрипте, т.е. если уж дал какому-то тегу id="abcd", то более это abcd нигде использовать не надо - ни как имя переменной/объекта/функции, ни как имя класса, ни как name какого-нить тега]


...
<input name='firm' id='f1' onfocus="kacheli (this)" onblur="clearInterval (TMR)" />
...
<select name='fsel' id='s1' size='1' onchange="this.form.firm.disabled = this.selectedIndex">
<script>
function kacheli (x)
{
if (x) this.FRM = x.form; this.TMR = setInterval (function ()
{if (s1) FRM.fsel.disabled = (FRM.firm.value.length)}, 100);
}
</script>

скриптовой блок можете поместить либо в хедере страницы (между <head> и </head>)
либо в любом месте страницы после закрывающего тега формы </form>

  Ответить  
 
 автор: Deed   (23.12.2012 в 15:21)   письмо автору
 
   для: ЯСА   (23.12.2012 в 14:47)
 

Спасибо большое за лекцию об id!

  Ответить  
 
 автор: Valick   (23.12.2012 в 15:39)   письмо автору
 
   для: ЯСА   (23.12.2012 в 14:47)
 

ЯСА, спасибо.
value в последствии будут заполнены, если возникнет необходимость изменить или дополнить значения формы после валидации на сервере.
про text не знал, спасибо.
в коде почти разобрался, добавил второй параметр для передачи id блокируемого элемента
но не совсем понятно как проходит проверка длины данных инпута, на счет этого погуглю
я так понимаю для селекта такой код уже не проканает, да и события там onchange и onreset соответственно скорее всего.
про именование id помню еще с первого обращения к книгам, но вот наступает какой-то момент и все стопориться :)
скрипт предпочитаю в хедере для порядка, если логика не требует конкретного места, ну до таких логик я еще не добирался.

  Ответить  
 
 автор: ЯСА   (23.12.2012 в 15:41)   письмо автору
 
   для: Valick   (23.12.2012 в 15:39)
 

про селект ничего не понял - для него скрипт я же написал
onchange="this.form.firm.disabled = this.selectedIndex"

или не увидели?
-------

кстати, исправьте мою ошибку
вместо if (s1) пропишите if (typeof s1 != 'undefined')

  Ответить  
 
 автор: Deed   (23.12.2012 в 15:47)   письмо автору
 
   для: ЯСА   (23.12.2012 в 15:41)
 

Извините, а что происходит в недрах памяти с элементами, id которых не указан явно? Им что-то присваивается? И возможно ли узнать, что именно?
Спасибо.

  Ответить  
 
 автор: ЯСА   (23.12.2012 в 16:36)   письмо автору
 
   для: Deed   (23.12.2012 в 15:47)
 

1. всякий HTML-тег на странице - это объект

2. как только в процессе загрузки файла очередной тег прочитан и разобран парсером, в динамической объектной модели (DOM) СРАЗУ появляется новый объект, причём он сразу занимает своё место в иерархии
причём тег ещё может не успеть отобразился на странице, но через DOM к нему уже есть доступ

3. DOM - это, грубо говоря, некая таблица, условно напоминающая вид проводника Windows и где каждый объект (HTML-тег), имеющий дочерние теги, представлен как "папка", а не имеющий - как файл
т.е. сразу видно - кто во что входит

4. и СРАЗУ же пополняются все DHTML-коллекции для всех уже имеющихся в DOM объектов

5. обращение к любому объекту из DOM происходит по его месту в DOM
потому что в DOM на самой "верхней ступеньке" находится "папка" window, в неё ниже ступенькой входит папка document, а через два эти объекта всегда можно обратиться к любому объекту, в них входящие

6. кроме того, в DOM есть и ещё один "зарезервированный" в DOM объект - это тело документа (тег <body>)
кстати, даже если вы в коде <body></body> вовсе не пропишете - он будет создан автоматически, перед первым не-"хедерным" тегом ("хедерными" являются только те, что должны быть между <head> и </head>: <Base>, <Link>, <Script>, <Head>, <Meta>, <Style>, <Isindex>, <NextID>, <Title>)

проверьте на примере - тега <body> нет, он ещё не закрыт (и никогда не будет закрыт), а ко второму <span>'у уже можно обратиться и именно через объект body
<span>bla</span>
<span>bla_bla</span>
<script>alert (document.body.getElementsByTagName ('span') [1].innerHTML)</script>
<span>bla_bla_bla</span>


7. каждому объекту (HTML-тегу) сразу же по помещении его в DOM прописываются абсолютно ВСЕ его предустановленные свойства и атрибуты: и те, которые указаны в HTML-коде, и те, которые не прописаны - независимо от того, имеют ли они дефолтные значения или не имеют
и все доступные для этого тега события тоже прописываются - значением для них является функция null
т.е. если вы напишете просто <b></b>, то в DOM'e для него СРАЗУ и АВТОМАТИЧЕСКИ появятся и атрибут CLASS=""(свойство className=""), и атрибут DIR="ltr" (свойство dir="ltr"), и свойство offsetWidth="фактическая ширина", и событие onclick=null... и ещё много-много чего

8. причём с появлением каждого нового тега в DOM всем предыдущим объектам "перепрописываются" их свойства - для первого <span>'a из предыдущего примера сначала свойство nextSibling будет равен null, а после появления второго <span>'a у первого изменится nextSibling - он станет ссылкой на второй <span>
так что первое слово в DOM - "динамическая" - оно оправдывает себя ещё в процессе загрузки страницы

9. атрибуты и свойства тегов - это разные вещи
атрибут - это всегда ещё и свойство объекта и принимать может значения только трёх типов: Nubmer, Boolean или String
а вот свойство - это не всегда атрибут, и принимать может значение любого типа

10. id - это всего лишь атрибут (оно же - свойство) любого тега
если id не указан в HTML-коде, то у объекта будет прописано id="" (пустая строка)

  Ответить  
 
 автор: Deed   (23.12.2012 в 17:03)   письмо автору
 
   для: ЯСА   (23.12.2012 в 16:36)
 

Спасибо большущее! Вы так все хорошо объяснили, что я буквально увидел структуру DOM перед глазами!
С Наступающим Вас! Здоровья и счастья!!

  Ответить  
 
 автор: Valick   (23.12.2012 в 15:50)   письмо автору
 
   для: ЯСА   (23.12.2012 в 15:41)
 

хм, и правда не увидел про селект))
ошибку исправлю, но вроде и так работает, сейчас убегаю, позже разберусь в разнице

  Ответить  
 
 автор: Deed   (23.12.2012 в 15:11)   письмо автору
 
   для: Valick   (23.12.2012 в 14:16)
 

http://jsfiddle.net/kilotonna/Zba9z/3/

  Ответить  
 
 автор: Valick   (23.12.2012 в 15:52)   письмо автору
 
   для: Deed   (23.12.2012 в 15:11)
 

спасибо, изучу

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования