powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Изобрёл велосипед
25 сообщений из 94, страница 2 из 4
Изобрёл велосипед
    #35322136
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в ие6 - дропдаун не работает. MS дебаггер говорит "вах-вах, неизвестная ошибка выполнения в строке 304". Подсвечивает строку - document.getElementById("_calendur").innerHTML=html+"</table>". Заменяю на document.getElementById("_calendur").innerHTML="йцуке". Работает. Значит дело в хтмл-странице. Извилистым путем прихожу к выводу, что скрипт конфликтует с незакрытым тегом <TABLE cellSpacing=0 cellPadding=0 border=0> в фрагменте
Код: plaintext
1.
2.
3.
....<B>"пробел"</B> вводит всегда текущюю дату. 
<DIV align=center><BR><BR><BR>
<TABLE cellSpacing= 0  cellPadding= 0  border= 0 >
  <TBODY>....
лезу обратно в скрипт, читаю сначала. Сразу подпадает под подозрение большое и красивое document.body.innerHTML+='<div id="_calendur" style="position:absolute;top:0;left:0;z-index:1000;background-color:white"></div>';. Заменяю на
Код: plaintext
1.
2.
3.
4.
5.
6.
	var div = document.createElement('div');
	div.style.position = 'absolute';
	div.style.zIndex =  1000 ;
	div.style.background = "#fff";
	div.id = "_calendur";
	document.body.appendChild(div);
ура, работает.

P.S. Дык это, может все-таки юзать createElement, appendChild и табличные insertRow,insertCell, а не трехэтажный innerHTML, который будет конфликтовать с кем попало ?
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35322787
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illion
ура, работает.

Спасибо!
Точно у меня в aspx глюк был - теперь (после аппенд чилд) заработало.
illionP.S. Дык это, может все-таки юзать createElement, appendChild и табличные insertRow,insertCell, а не трехэтажный innerHTML, который будет конфликтовать с кем попало ?
Не советую (я этим баловался) - ещё хуже.
Помоему - исправил . Как оно в ИЕ6?
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35323078
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По уму, надо ещё кнопочку в инпуте сделать абсолютно позиционированной и на неё клик повесить, т.е. сделать спан, свапНоде с инпутом, аппенд чилд инпута и имажи. И самое главное - заменить регэксп на больше-меньше кейкоде (не работает нумпад). Конструкция String.fromCharCode(event.keyCode) в нумпаде для 1 возвращает a, для 2 - b.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35323178
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeКак оно в ИЕ6?
работает.

Ну раз решено innerHTML оставлять, то можно постепенно перейти к следующему этапу, так горячо мною любимому. Сокращение кода. Предлагаю следующее:

Довольно длинная фраза
Код: plaintext
addZero(_currDate.getDate())+'.'+addZero(_currDate.getMonth()+ 1 )+'.'+_currDate.getFullYear()
встречается в коде постоянно. Выносим в функцию:
Код: plaintext
function setValue(date) { return addZero(date.getDate())+'.'+addZero(date.getMonth()+ 1 )+'.'+date.getFullYear(); }

Очевидно, что в if(ev.keyCode==38) и в if(ev.keyCode==40) задано одно и то же условие. Объединяем.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
if(ev.keyCode== 38  || ev.keyCode== 40 )
	{
		if(val.length< 10 ) return true;
		
		var step = (ev.keyCode== 38 )? 1 :- 1 ;
		if(_currFragment=="d")
		{
			_currDate.setDate(_currDate.getDate()+step);
			el.value=setValue(_currDate);
			selectDay(el);
		}
		else if(_currFragment=="m")
		{
			_currDate.setMonth(_currDate.getMonth()+step);
			el.value=setValue(_currDate);
			selectMonth(el);
		}
		else if(_currFragment=="y")
		{
			_currDate.setYear(_currDate.getFullYear()+step);
			el.value=setValue(_currDate);
			selectYear(el);	
		}
		if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
		return false;
	}

Аналогично очевидно, что monthLeft() и monthRight() - это тоже одна функция, так же как и yearLeft() и yearRight(). Вводим вспомогательный параметр и объединяем.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function monthChange(direction)
{
	var step = (direction=='up')? 1 :- 1 ;
	if(_currDate==null) _currDate=new Date();
	_currDate.setMonth(_currDate.getMonth()+step);
	_currInput.value=setValue(_currDate);
	selectMonth(_currInput); _currFragment="m";
	calCreate(_currInput,_currDate);
}

function yearChange(direction)
{
	//аналогично
}

итого получим ~-10% в количестве строк и примерно столько же в байтах.

P.S. ох, какая симпатичная куча if'ов посреди скрипта... (if((val.length==0)&&(ss.match(reg)))...). Не пойму только с какой стороны к ней подъехать. Жаль бубна нет :-(.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35323199
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeПо уму, надо ещё кнопочку в инпуте сделать абсолютно позиционированной и на неё клик повесить
а еще по уму надо сделать в дропдауне столбец с названием месяца фиксированной ширины, а то переключаешь месяцы и кнопка под мышом влево-вправо мечется
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35323313
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ух-ты! Спасибо. Я конечно сделаю как ты говоришь. Но ведь получается, что ты (а не я) программу и написала, ёлки-палки!
illion...надо сделать в дропдауне столбец с названием месяца фиксированной ширины...
Да пробовал - всё криво получается. Опять же, это я размер шрифта в цсс прописал, а ведь он может быть разный. По поводу иннерХТМЛ таблички. Я давным-давно под 5 ИЕ писал визуальный редактор для таблиц (количество столбцов и строк менялось на ончанже соотв. инпута), так вот - креате и аппенд чилд помирали уже при 100 строк, а иннерХТМЛ - работал и при 10000 без проблем и почти мгновенно!
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35326496
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeполучается, что ты (а не я) программу и написала
как раз таки до текущего момента я ничего не писала, а совсем даже наоборот (копипаст + delete). Но можно и наваять че-нить. Например добраться до той самой кучи if'ов. В принципе тот кусок можно и сократить вполовину как минимум, но есть еще пара пожеланий относительно ввода дат.
Первое. Оставить возможность вводить точку руками. Например: юзер желает ввести дату 2.5.2008 и не желает догадываться о том, что на самом деле оно должно быть 02.05.2008
Второе. Отвлечься от идеи о том, что число в дате обязательно должно начинаться с 0-3, а месяц - с 0-1. Например: юзер хочет ввести дату 9.05.2008, жмет 9 и ничего не происходит.
А еще - точка в дате появляется почему-то в неподходящий момент. Т.е. не тогда, когда число или месяц стали двузначными, а в тот момент, когда осуществляется ввод месяца или года.

Ну и чтобы не только критиковать, но и содействовать, могу предложить заместо куска
Код: plaintext
1.
2.
3.
4.
5.
6.
ss=String.fromCharCode(ev.keyCode)+"";
reg=/[^ 0 - 3 ]/g;
...//около  25 - 30  строк
if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
return false;
}
нечто подобное:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
ss = (ev.keyCode== 190  || ev.keyCode== 191 )?'.':((ev.keyCode <  96 )?ev.keyCode- 48 :ev.keyCode- 96 );
if (!/^[ 0 - 9 .]$/.test(ss) || (val.lenght>= 6  && !/^[ 0 - 9 ]$/.test(ss)) ) return false; 
var newValue = val + ss;
if (val.length ==  0  && ss >  3 ) newValue = '0' + ss + '.';
if (val.length ==  1 ) newValue = (ss=='.')?('0'+newValue):(newValue+'.'); 
if ((day = parseInt(newValue.substr( 0 , 2 ))) >  31 ) return false;
if (val.length ==  3  && ss >  1 ) newValue = el.value + '0' + ss + '.'; 
if (val.length ==  4 ) newValue = (ss=='.')?(el.value.substr( 0 , 3 )+'0'+el.value.substr( 3 , 1 )+'.'):(el.value + ss +'.');
if ((month = parseInt(newValue.substr( 3 , 2 ))- 1 ) >  12 ) return false;
if (val.length> 9 ) return false;
if (newValue.length ==  10 )
{
  year = parseInt(newValue.substr( 6 , 4 ));
  try{ _currDate=new Date(year,month,day); }
  catch(e){alert("Ошибка в дате!"); el.value=""; return false;}
  el.value=setValue(_currDate);
  selectDay(el);
  if(document.getElementById("_calendur").innerHTML!="") calCreate(document.getElementById("_calendur"),_currDate);
}
else el.value = newValue;
return false;
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35326516
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавный метод получения действительной даты из введенной руками. Пишу 31.2.2008, получаю 02.03.2008. Хотя с точки зрения js все логично.... Хм.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35326542
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge illion...надо сделать в дропдауне столбец с названием месяца фиксированной ширины...Да пробовал - всё криво получается. Опять же, это я размер шрифта в цсс прописал, а ведь он может быть разный.
ну тогда не фиксированной ширины, а кнопки-стрелки ближе к краям дропдауна. Например табличке с навигацией по месяцам/годам задать ширину ~90%, колонкам с кнопками - ширину кнопки.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35326656
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illion...ну тогда не фиксированной ширины...
Я ещё не выложил код. Потом выложу, когда внесу изменения. С шириной разобрался с помощью кувалды - присваиваю таблице с месяцем-годом clientWidth таблички с номерами дней (она более-менее фиксированная, т.к. там Пн Вт - самые широкие клеточки.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35326987
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illion...могу предложить заместо куска...
Класс! Выложил. Правда ещё не все некрасивости кода убрал и не сократил его (не принципиально).
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327342
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это намного лучше, чем подключать многокилобайтные библиотеки из-за календариков, которые в большинстве случаев ещё и платные (с хреновым юзабилити - extjs). Дело в том, что такие календарики нужны всем, но никто их не пишет, потому что времени на это много уходит и требуется некоторая квалификация.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327452
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно, я надеюсь, что мы с illion доведём это дело до совершенства (уже почти доведено), а ещё есть integer, float и money.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327506
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так держать. Полтора года назад искал календарик, который можно было бы использовать, но так и не нашел подходящего. Это сможет подойти :) (при необходимости).
Немножко поюзал его. Конечно, до совершенства далеко ... Приведу несколько советов (типа как тестер):
1. Более удачным шрифтом будет Verdana - он системный, у всех есть, более округлый и при малых шрифтах лучше выглядит.
2. Кнопки великоваты и аляписты.
3. В ФФ не видно мигания, а в ИЕ при каждом нажатии на стрелки перерисовывается окошко. Как бы от этого избавиться?
4. Ячейки маловаты для шрифта или шрифт великоват для ячеек - не очень уютно.
5. Тескт в ячейках лучше отцентрировать, будет симпатичнее.
6. При выборе даты надо выделить дату и сделать маленькую задержку - 400-600 млсек, будет приятнее для глаза.
7. Это совсем для выпендрежа: окошко сделать сворачивающимся/разворачивающимся - будет смотреться неплохо, только скорость отрегулировать, чтобы и не слишком мигало и чтобы не задерживало ввод даты.
8. Цветовой стиль, а также форма кнопок не соответствуют общему стилю. С ним надо поработать.
9. Насколько понимаю, красным должна выделяться текущая дата. Почему есть красная дата в каждом месяце? - Это не есть правильно.
10. Отработка выделения даты должна осуществляться по onclick, а тут она по onmousedown. Было бы хорошо, чтобы по нажатию на кнопку мыши дата выделялась, но окошко оставалось открытым. А уже при отпускании мыши оно закрывалось. А то нажимаю на кнопку и остаюсь как дурак с нажатой кнопкой посреди странички ... :) (типа как при нажатии стрелок при открытом окошке)

Удачи!
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327546
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ловим баги. Ввожу 8.09.2008. Получаю невесть что (в любом браузере). Оказалось, что
parseInt("08") и parseInt("09") возвращают 0, в то время как parseInt("07") == 7, parseInt("06") == 6 и т.д. (а именно эти конструкции используются для определения day и month). Выглядит как бред, то тем не менее. Лечится отказом от parseInt
Код: plaintext
1.
2.
day = newValue.substr( 0 , 2 )
...
month = newValue.substr( 3 , 2 )- 1 
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327590
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
illion...parseInt("08") и parseInt("09") возвращают 0...
Известный факт, если с нуля - значит число восьмеричное, поэтому 8 и 9 - NaN, остаётся 0 - хе-хе.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327735
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
parseInt("09", 10 )
Вот так вылечил .
IDVsbruck
9. Насколько понимаю, красным должна выделяться текущая дата.

Неа. Та, что в инпуте. Там просто цсс-класс такой, что колор:ред.
IDVsbruck
10. Отработка выделения даты должна осуществляться по onclick, а тут она по onmousedown.

Так сделано из-за того, что dropDown закревается при потере фокуса инпута. Например, если пользователь клавиатуру юзает табом.
Дизайном я вообще почти не занимался. До этого не дошло. За советы - спасибо. Подключайся.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35327761
Фотография illion
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSergeесли с нуля - значит число восьмеричное
ну вот, пришлось лезть в описание функции (интересно же, а раньше лень было). Действительно так. Но как оказалось, не всегда удобно.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35328242
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
if((ss=='.')&&((val.length== 0 )||(val.substr(val.length- 1 , 1 )=='.')||(val.length> 4 ))) return false;
Не даю вводить неправильные точки.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35329862
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С оперой была проблема. Теперь - нет и браузер теперь не проверяю. Однако же, с этой самой оперой есть проблема. Как ей запретить обрабатывать управляющие клавиши? Чего-то не получаеццо.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35329938
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот в 9.50 beta (токо что установил) - всё работает, как часы.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35329944
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не - не как часы (хотя получше). Ёлки-палки!
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35329996
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ура AOL 2.7.13.1 - работает!
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35336308
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот и пригодился элементик. Правда, пришлось потратить полдня на его оптимизацию и подгонку. Результат прилагаю.
У меня, правда, возникло несколько проблем, так как форма подгружается динамически и это накладывает некоторые особенности в работу.
Что нехорошо - это то, что при ручном редактировании строки не срабатывают системные кнопки или сочетания клавиш (F5, Ctrl-F5).
Также хочу поделиться наблюдениями. В предложенном варианте при нажатии кнопок изменения месяца и года происходит перерисовка этих кнопок, из-за чего они мигают и это раздражает. Я в ячейки с кнопками вставил background-image и поставил символы < и >. Мигание исчезло совершенно.
Еще я привязал div и ячейки к одной ширине, из-за чего теперь визуально клеточки выглядят более правильно - совершенно равными.
Ну, и то, что бросается в глаза (мне это более подходит по дизайну сайта) - я разбил строку ввода и кнопку выбора календаря. Теперь надо просто разграничить события и передать в функцию определения событий два элемента.

А так - огромное спасибо за идею и практически законченный функционал. Можно, конечно, сделать больший акцент на DOM, а не innerHTML, и сделать элемент полностью на объектах (объектно-ориентированным) - чтобы он сам за собой следил "изнутри", а не навязывать ему действия "извне", но это все развлечения на досуг.
...
Рейтинг: 0 / 0
Изобрёл велосипед
    #35336495
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подзабросил календарик. Сегодня м.б. вернусь к теме. Тем более, что появилась идея сделать числовые (интежер, флоат и мани) инпуты, у которых в дропдауне будет калькулятор (хе-хе). Кстати, может кто подскажет идею как прикрутить конвертор валют (например по курсу ЦБ)? Может кто такое делал?
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 2 из 4
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Изобрёл велосипед
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]