Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Динамическое добавление нового option в form (https://javascript.ru/forum/dom-window/3281-dinamicheskoe-dobavlenie-novogo-option-v-form.html)

artwalek 23.04.2009 12:16

Цитата:

именно что бы избежать это я вставил проверку в код
Ага. Теперь понятно.

Не поймите меня неправильно, но ни в IE, ни в FF2 у меня не работает :(

Все равно происходит повторное заполнение при клике, но теперь уже по годам.

У вас работает?

Цитата:

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

Цитата:

равно как и не читал ни одной книжки по JS
Зато у вас ловко все получается. :)
И скрипт в вашем исполнении красив ;)

AzriMan 23.04.2009 12:34

Цитата:

Сообщение от artwalek (Сообщение 17426)
Не поймите меня неправильно, но ни в IE, ни в FF2 у меня не работает :(

Все равно происходит повторное заполнение при клике, но теперь уже по годам.

так. стоп. что именно не работает в ie и ff2? мой код или пример из книги?

artwalek 23.04.2009 13:12

Цитата:

Сообщение от AzriMan (Сообщение 17427)
так. стоп. что именно не работает в ie и ff2? мой код или пример из книги?

Ваш код работает.

Только работает он так (у меня, в ИЕ7 и ФФ2).
При загрузке страницы в выборке установлено «Выберите год».
Кликаем.
Происходит ресайз формы до ширины 2008. Т.е. происходит повторное заполнение формы, только теперь годами.
Т.е. чтобы выбрать год, нужно щелкнуть 2 раза.

Вот это меня и смущает.

AzriMan 23.04.2009 14:58

если мне не изменяет память, то до момента клика в селекте находится только "Выберите год". в момент клика срабатывает событие onclick() и выполняется JS код, который заполняет селект годами. ибо если бы там было что-то кроме "Выберите год", то не сработало бы условие где .length==1 и код бы не выполнился.

artwalek 23.04.2009 15:27

Цитата:

Сообщение от AzriMan (Сообщение 17435)
если мне не изменяет память, то до момента клика в селекте находится только "Выберите год". в момент клика срабатывает событие onclick() и выполняется JS код, который заполняет селект годами. ибо если бы там было что-то кроме "Выберите год", то не сработало бы условие где .length==1 и код бы не выполнился.

Да, именно так.
Извините, если вас замучал.

В таком случае думаю нужно прописать в body onload="checkYear();"

Но теперь другая засада, при загрузке по-умолчанию в селекте становится 2008, а хочется текущий.

Не подскажите, как исправить?

AzriMan 23.04.2009 17:03

Цитата:

Сообщение от artwalek (Сообщение 17438)
Да, именно так.

по-моему, это немного противоречит этому:
Цитата:

Сообщение от artwalek (Сообщение 17428)
Только работает он так (у меня, в ИЕ7 и ФФ2).
При загрузке страницы в выборке установлено «Выберите год».
Кликаем.
Происходит ресайз формы до ширины 2008. Т.е. происходит повторное заполнение формы, только теперь годами.
Т.е. чтобы выбрать год, нужно щелкнуть 2 раза.

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


Цитата:

Сообщение от artwalek (Сообщение 17438)
В таком случае думаю нужно прописать в body onload="checkYear();"

если вам нужно, что бы в момент клика селект УЖЕ был заполнен - тогда да. такой вариант будет наиболее оптимальным. но, насколько я понял, изначально речь не шла о том, что бы он был заполнен автоматически. поэтому и код был соответствующий.

Цитата:

Сообщение от artwalek (Сообщение 17438)
Но теперь другая засада, при загрузке по-умолчанию в селекте становится 2008, а хочется текущий.

Не подскажите, как исправить?

function checkYear() {
    var yearsList = document.getElementsByName('Year')[0];
    if (yearsList.value == "noValue")  
    {    // вероятно, нам не нужно заполнять повторно при клике.
        var currDate = new Date();
        var currYear = currDate.getFullYear();
     
        constYear = 2006;
        var i = currYear - constYear;

        while(constYear <= currYear) {
            var a = constYear++;
            var listYear = new Option(a, a, false, false);
            yearsList.options[i--] = listYear;
        }
    }
    yearsList.selectedIndex=0;
}

x-yuri 23.04.2009 21:04

http://javascript.ru/forum/offtopic/...html#post16016

по поводу document.form_name.el_name -> document.getElementById('el_name') - в общем-то оно вроде везде работает, но может лучше и не пользоваться такой штукой, не знаю

artwalek, такие вещи лучше на сервере делать, а не на клиенте

я бы сделал так:
function addYears() {

    var year = document.form1.year;
    var currDate = new Date();
    var currYear = currDate.getFullYear();
    for( var i=currYear; i >= 2006; i-- ) {
        var opt = new Option(i, i);
        year.options[ year.options.length ] = opt;
    }
    year.selectedIndex = 1;
}

p.s. constYear получилась глобальной переменной

artwalek 24.04.2009 07:15

AzriMan
Спасибо вам.
Вы мне помогли!

x-yuri
document.form_name.el_name
Мы с AzriMan выяснили, что в ФФ2 не работает.
Поэтому наверное лучше не пользоваться.
И этот метод описан в книге Флэнагана.

Цитата:

artwalek, такие вещи лучше на сервере делать, а не на клиенте
Расскажите пожалуйста, почему?

AzriMan 24.04.2009 09:27

Цитата:

Сообщение от artwalek (Сообщение 17487)
document.form_name.el_name
Мы с AzriMan выяснили, что в ФФ2 не работает.

утверждать не буду, нет второго фф что бы проверить )

x-yuri 24.04.2009 17:42

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
	<title>title</title>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body onload="alert(document.form1.asd1.value);">
<form name="form1" action="index.php">
<div><input type="hidden" name="asd1" value="4"></div>
</form>
</body>
</html>

вот такой код в ff2 (2.0.0.20) работает
есть другой нюанс, в xhtml 1.0 strict у элемента form нету атрибута name :blink:
p.s. но, как я говорил, я не знаю как лучше поступать

Цитата:

Расскажите пожалуйста, почему?
1) это можно сделать на сервере (т.е. не будет использоваться javascript), 2) думаю, эта страничка может быть помещена в кэш сервера (хотя сам не сталкивался с кэшированием на сервере)
p.s. я сказал лучше, в твоем случае вряд ли это имеет значение


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