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 03.04.2009 09:58

Динамическое добавление нового option в form
 
Прошу прощения, если тема пробегала.

Меня интересует механизм динамического добавления к уже имеющимся option в form.

Допустим, имею форму:
<form action="list.asp" name="archive">
<select name="Year" id="Year">
<option value="noValue" selected>Выберите год</option>
<option value="2009">2009</option>
<option value="2008">2008</option>
<option value="2007">2007</option>
<option value="2006">2006</option>
</select>
<form>


Каким образом реализуется механизм автоматического добавления нового
<option value="2010">2010</option> по наступлению 2010 года?

Надеюсь понятно изъяснил :yes:

AzriMan 03.04.2009 12:05

при загрузке скрипта взять текущий год. проверить его на равность 2010. елси он равен - добавить чайлда селекту.

вы это хотели услышать?

artwalek 22.04.2009 14:02

Спасибо.
Скрипт вроде написал.
Но не могу сделать грамотную сортировку.
Необходима обратная последовательность.

Не поможите?

<html>
<head>
<script Language="JavaScript">
function checkYear() {
	var currDate = new Date()
	var currYear = currDate.getYear();

	var a = [];
	var i = 0;
	constYear = 2006;
	while(constYear <= currYear) {
		a[i] = constYear++;

	var listYear = new Option(a[i], a[i], false, false);
	var archive = document.archive.Year;
	archive.options[archive.options.length] = listYear;
	}
}
</script>
</head>
<body>
<form action="list.asp" name="archive">
	<select name="Year" id="Year" onchange="checkYear()">
		<option value="noValue" selected>Выберите год</option>
	</select>
<form>


</body>
</html>

AzriMan 22.04.2009 15:44

во первых, var archive = document.getElementsByName('Year')[0];

а вообще. что-то под FF оно у меня вообще не запускается. то ли лыжи не едут, то ли... вставил alert('..') первой строчкой в скрипте - и фиг.

--edited
а, всё. стоило заменить onchange на onclick


--edited x2
чисто ради интереса. а что у вас возвращает это?
var currDate = new Date();
    var currYear = currDate.getYear();
    alert (currYear);

AzriMan 22.04.2009 15:53

я бы это сделал так:
<html>
<head>
<script language="javascript" type="text/javascript">
function checkYear() {
    var archive = document.getElementsByName('Year')[0];
    if (archive.length == 1)     // вероятно нам не нужно заполнять повторно при клике.
    {
        var currDate = new Date();
        var currYear = currDate.getFullYear();
     
        constYear = 2006;
        //var a = [];
        //var i = 0;
        var i = currYear - constYear;

        while(constYear <= currYear) {
            var a = constYear++;
            var listYear = new Option(a, a, false, false);
            archive.options[i--] = listYear;
        }
    }
}
</script>
</head>

<body>
<form action="list.asp" name="archive">
    <select name="Year" onclick="checkYear();">
        <option value="noValue" selected>Выберите год</option>
    </select>
<form>
 
 
</body>
</html>

artwalek 22.04.2009 16:04

Цитата:

а, всё. стоило заменить onchange на onclick
Спасибо!

Т.е. в ФФ onchange вообще не работает?

onclick конечно хорошо, но при дефолтной загрузке страницы в выборке отображается «Выберите месяц», а уже когда щелкаем на выборке происходит резайс элемента и по-умолчанию предлагается 2008 с 2009 и т.д.
Мне честно говоря так не нравится.

Есть какой-то выход из положения?

Цитата:

во первых, var archive = document.getElementsByName('Year')[0]
Это обязательно прописывать?
Спрашиваю, потому что интересно.

Цитата:

чисто ради интереса. а что у вас возвращает это?
2009

AzriMan 22.04.2009 16:38

в фф onchange работает.
что в вашем понятии означает onchange? когда он должен срабатывать?
Цитата:

но при дефолтной загрузке страницы в выборке отображается «Выберите месяц», а уже когда щелкаем на выборке происходит резайс элемента и по-умолчанию предлагается 2008 с 2009 и т.д.
ну вообще по идее так и происходит. а как ВАМ нравится? имхо ВАШ код это и делает.

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

по поводу 2009. стоит тестировать свои скрипты/страницы более чем в одном браузере. желательно кроме ие проверять в ff и opera. и вы поймете что многое написанное может не выполняться. ибо нужно изначально писать кроссбраузерно. т.е. код, который поймут разные браузеры и адекватно его отработают.

artwalek 23.04.2009 07:56

Цитата:

ну вообще по идее так и происходит. а как ВАМ нравится? имхо ВАШ код это и делает.
Мне кажется неправильным, когда кликаешь на выбрать месяц сбивается выбора, загружается 2008 и приходится по-новой выбирать годы.
Не подскажите, как этого избежать?

Цитата:

прописывать обязательно, т.к. не все браузеры поймут что такое document.archive.Year. и не понятно зачем городить велосипед и обращаться к форму а потом к потомку если можно обратиться к потомку напрямую.
Спасибо.
Учту.
Но частично код брал из книги Флэнагана «JavaScript». 5-е издание.

Цитата:

стоит тестировать свои скрипты/страницы более чем в одном браузере. желательно кроме ие проверять в ff и opera. и вы поймете что многое написанное может не выполняться. ибо нужно изначально писать кроссбраузерно. т.е. код, который поймут разные браузеры и адекватно его отработают.
Да, конечно.
Обязательно проверяю.
Меня это и смутило.
Тем более код был приведен в вышеуказанной книге.

artwalek 23.04.2009 07:59

Цитата:

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

AzriMan 23.04.2009 10:27

Цитата:

Сообщение от artwalek (Сообщение 17410)
onchange, в моем понимании это загрузка скрипта, без использовании кнопки.

onchange -> on change -> срабатывает при изменении элемента
onclick -> on click -> срабатывает при клике по элементу


Цитата:

Сообщение от artwalek (Сообщение 17409)
Мне кажется неправильным, когда кликаешь на выбрать месяц сбивается выбора, загружается 2008 и приходится по-новой выбирать годы.
Не подскажите, как этого избежать?

именно что бы избежать это я вставил проверку в код
// вероятно нам не нужно заполнять повторно при клике.
if (archive.length == 1)
которая смотрит, если у нас кол-во элементов ==1 (надпись выберите год) то она заходит во внутрь и заполняет его годами. при повторном клике никакое заполнение не происходит. вообще, правильнее будет сравнивать не по длине а по
archive.selected == "noValue"
или по наличию "noValue" среди потомков archive. способов масса.



Цитата:

Сообщение от artwalek (Сообщение 17409)
Но частично код брал из книги Флэнагана «JavaScript». 5-е издание.
Тем более код был приведен в вышеуказанной книге.

зачастую книги набирают специальные люди. и они могут допускать опечатки, особенно в коде. да и не всегда код написанный в книгах бывает верный. точнее - не в каждой книге. может быть автор не знает про другие браузеры? я не знаком с творчеством Флэнагана, равно как и не читал ни одной книжки по JS. скажу более - я кроме Петзольда (программирование под Windows) и Шильдта не читал вообще ничего по программированию.

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, время: 10:28.