Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   InnerHTML & IE (https://javascript.ru/forum/css-html-internet-explorer/3804-innerhtml-ie.html)

x-yuri 18.11.2010 23:35

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

vinet 19.11.2010 00:03

Спасибо :)

Freakmeister 15.01.2011 22:40

Народ, подскажите плз как исправить такой косяк... Делаю органайзер для сайта, на странице добавления нового события есть форма из трёх раскрывающихся списков - day, month и year:



Понятно, что в каждом месяце определённое количество дней и я делал, чтобы при смене месяца, просчитывалось количество дней в этом месяце и менялось содержимое списка day. Вот скрипт полностью (сильно не пинайте, я новичёк в JS):

<script type='text/javascript'>

function isLeapYear(year) {   // узнаём високосный ли год
 if (year % 4 == 0) return true
 return false
}

function getDays(month, year) {   //узнаём сколько дней в месяце
 var ar = new Array(12)
 ar[1] = 31 // Январь
 ar[2] = (isLeapYear(year)) ? 29 : 28 // Февраль
 ar[3] = 31 // Март
 ar[4] = 30 // Апрель
 ar[5] = 31 // Май
 ar[6] = 30 // Июнь
 ar[7] = 31 // Июль
 ar[8] = 31 // Август
 ar[9] = 30 // Сентябрь
 ar[10] = 31 // Октябрь
 ar[11] = 30 // Ноябрь
 ar[12] = 31 // Декабрь
 return ar[month]
}

function gethtml(numb, selected) {    //получаем вёрстку инпута
 var b;
 var i;
 var r;
 var s;
   for (i=1; i<=numb; i++){
     r=''+i
       if (r.length<2) {  //добавляем 0 вначало, если число однозначное
       r='0'+r;
       }
     s=''
     if (i==selected) {  //выставляем день, который был выставлен вначале
     s=' selected'
     }
   b = b+\"<option value='\"+r+\"'\"+s+\">\"+r+\"</option>\"
   }
 return b
}

function countday() {   //главная функция, которая запускает все остальные
 var day = document.getElementById('day');
 var s=day.value;
 var month = document.getElementById('month');
 var year = document.getElementById('year');
 var a = getDays(month.value, year.value);
 day.innerHTML = '';
 day.innerHTML = gethtml(a, s);
}
</script>


При смене месяца вызывается функция countday(). Всё отлично работает во всех браузерах кроме IE - в day получается пустой список. Я стал досконально перебирать код и выяснил, что innerHTML в IE вообще не работает, по крайней мере на селектак. Даже если для простоты вместо всего вышеизложенного написать так:
function countday() {
var day = document.getElementById('day');
day.innerHTML = '<option>test</option>';
}

IE всё-равно возвращает в day пустой список, а другие браузеры возвращают test. Подскажите плз как исправить ситуацию. =\

Aetae 15.01.2011 22:50

Даж вдумываться не хочу, есть же объект Date()

Дней в месяце m годa y:
var y=2011,m=2;
alert(new Date(y,m,0).getDate())


Как это работает:
Объект Date принимает значение месяца от 0 до 11, т.о. мы задаём нужным_нам+1, при этом ставя день месяца в 0 мы заставляем его принимать значение: последний день месяца, предыдущего заданнному.

Amphiluke 15.01.2011 22:55

Freakmeister, для кроссбраузерности необходимо использовать метод add(). Вот, посмотрите пример.
function foo() {
	var optn;
	var sel = document.getElementById("month");
	for (var i = 0; i < 5; i++) {
		optn = document.createElement("option");
		optn.text = i;
		optn.value = i;
		try { sel.add(optn, null); } catch(e) { sel.add(optn); }
	}
}


<form action="#">
	<input type="button" value="add options" onclick="foo();" />
	<select id="month"></select>
</form>


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