Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.01.2009, 01:56
Новичок на форуме
Отправить личное сообщение для Kinweb Посмотреть профиль Найти все сообщения от Kinweb
 
Регистрация: 24.01.2009
Сообщений: 4

Окно смайлов
Приветствую знатоков Javascript и надеюсь на вашу помощь! :o

У меня такая вот проблема - хочу с javascript и html спрограммировать окно для чата(showModelessDialog), которое бы в зависимости от выбранной категории выдавало бы мне смайлы, которые потом через onClick я смог выводить в поле ввода текста в чате. Собственно все для этого уже сделано и все работает за исключением одной жуткой детали над которой я ломаю голову уже не одну неделю...
Вобщем, выглядит это примерно так:

из HTML :
<span onClick="selectkat(1);">Приветствие</span><span onClick="selectkat(2);">Прощание</span>


<SCRIPT>
function selectkat(kat){
if(kat=="1"){
var sm = new Array("smile1", "smile2", "smile3");
}
if(kat=="2"){
var sm = new Array("smile4", "smile5", "smile6");
}}

var i=0;
while(i<sm.length) {
        var s = sm[i++];
        document.write('<IMG SRC=chat/smile/'+s+'.gif>');
}
</SCRIPT>


Как мне кажется, при вызове функции selectkat, kat, в зависимости от того 1 это или 2, должно определять переменную sm. Но после нажатия на одну из категорий окно мнгновенно белеет, в тоже время показывая смайлы. Словно весь HTML код пропадает и остаются лишь смайлы на белом фоне, нет ни категорий, ни графики.... :rolleyes:

Кто знает в чем дело, подскажите пожалуйста чего тут не хватает или почему вообще система не работает...

Последний раз редактировалось Kinweb, 24.01.2009 в 02:01.
Ответить с цитированием
  #2 (permalink)  
Старый 24.01.2009, 03:42
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

если хочешь пройтись по массиву используй for( var i=0; i<sm.length; i++ ). Оставь while для других случаев

по поводу проблемы: [telepat mode]document.write, после того как страница загрузилась, стирает документ и начинает писать его с нуля[/telepat mode]

p.s. не пользуйся document.write ;-)
Ответить с цитированием
  #3 (permalink)  
Старый 24.01.2009, 12:40
...
Отправить личное сообщение для Zibba Посмотреть профиль Найти все сообщения от Zibba
 
Регистрация: 13.10.2008
Сообщений: 225

x-yuri,
Хотел сказать что в твоем случае лучше использовать innerHTML

P.S. А почему следует держать while для других случаев? Мне казалось что он как и инвертированный цикл работает быстрее в js O_o
Ответить с цитированием
  #4 (permalink)  
Старый 24.01.2009, 17:09
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

P.S. А почему следует держать while для других случаев? Мне казалось что он как и инвертированный цикл работает быстрее в js O_o

Дело не в быстродействии. Мне обычно читабельность интересует. В большинстве случаев стоит пользоваться конструкциями (и т..д) в соответствии с их предназначением))). Основное назначение for ( var i= ... ) - пройтись по массиву, for ( var k in ... ) - по ассоциативному массиву, while - чтобы выполнить какие-либо другие действия в цикле, например
Код:
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0) { 
    if (bRet == -1) {
        // handle the error and possibly exit
    } else {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
}
Но изначально такой совет в книжке прочитал (там это как-то со словом парадигма связывали), но уже не помню
Ответить с цитированием
  #5 (permalink)  
Старый 24.01.2009, 17:45
...
Отправить личное сообщение для Zibba Посмотреть профиль Найти все сообщения от Zibba
 
Регистрация: 13.10.2008
Сообщений: 225

Да про парадигму то понятно в таком случае можно и тернарный оператор ? : тоже посылать куда подальше чтобы читабельней было. В общем тут думаю дело привычки и стиля написания кода отдельным индивидумом, ибо например меня в отличие от Вас больше интересует производительность (пусть то будет доля секунды незначительная) чем читабельность (да я из разряда тех людей )
Ответить с цитированием
  #6 (permalink)  
Старый 24.01.2009, 18:43
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

по поводу тернарного оператора, мне кажется, что так
var TicketExit =   TicketPrice   ? parseFloat(TicketPrice) * TicketCount
                                 : 0;

читабельнее, чем
if (TicketPrice != '0') {
    var TicketExit            = parseFloat(TicketPrice) * TicketCount;
 }
 else {
    var TicketExit            = 0;
 }

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

а по поводу оптимизации много есть фраз. Тот же Кнут сказал, что "Оптимизация - корень всех зол" или "Время программиста дорого; сократите его, используя машинное время" или это (да и сама статья интересная). И я что-то не помню, чтобы известный программист проповедовал оптимизацию. Обычно оптимизируют "узкие места". Но выбор, конечно, за вами ;-)

Последний раз редактировалось x-yuri, 24.01.2009 в 18:45.
Ответить с цитированием
  #7 (permalink)  
Старый 24.01.2009, 18:49
...
Отправить личное сообщение для Zibba Посмотреть профиль Найти все сообщения от Zibba
 
Регистрация: 13.10.2008
Сообщений: 225

Мне по поводу тернарного оператора тоже кажется что так:

var TicketExit =   TicketPrice   ? parseFloat(TicketPrice) * TicketCount
                                 : 0;


Более читабельно чем во втором случае, но как показал случай с топик стартером темы откуда вы взяли пример, ему это было не очевидно. Потому и говорю, тут дело привычки и стиля написания кода (в некоторых случаях и знание синтаксиса), тоже будут играть роль как Вы выразились во "Времени программиста" которое дорого. Все зависит от конкретного случая и как Вы правильно заметили "выбор, конечно, за вами ;-)"
Ответить с цитированием
  #8 (permalink)  
Старый 24.01.2009, 20:21
Новичок на форуме
Отправить личное сообщение для Kinweb Посмотреть профиль Найти все сообщения от Kinweb
 
Регистрация: 24.01.2009
Сообщений: 4

Спасибо за ответы, однако все же проблема пока остается открытой
Оптимизация кода и правильный синтаксис это конечно хорошо, особенно если учесть что я пока еще ламер в яваскрипте, хотя знаю неплохо некоторые другие языки программирования, но все же хотелось бы узнать как же все таки преодоеть эту зарисовку диалога смайлами, когда словно теряется весь остальной HTML код..
:rolleyes:
Я думал использовать innerHTML(document.getElementById("smiles").innerH TML="<IMG SRC=chat/smile/"+s+".gif>"; ), но судя по всему это тут не поможет - ведь смайлы должны идти друг за другом, логически подумать если оно их и должно поидее писать вот так вот на том месте где вмонтирован document.write, но стоит выбрать категорию и снова воспользоваться функцией и опять тоже самое.
Ответить с цитированием
  #9 (permalink)  
Старый 24.01.2009, 20:44
...
Отправить личное сообщение для Zibba Посмотреть профиль Найти все сообщения от Zibba
 
Регистрация: 13.10.2008
Сообщений: 225

Если правильно понял Вас, то думаю это решение Вашей проблемы, ну или по крайней мере поможет Вам разобраться в нём:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>Untitled Document</title>
		<script type="text/javascript">
			function addSmile(sm){
				var i = 0;

				var txt = document.getElementById('text');
				var str = txt.innerHTML;

				while(i<sm.length) str += '<IMG SRC=chat/smile/'+sm[i++]+'.gif>';

				txt.innerHTML = str;
			}

			function selectkat(kat){
				if(kat=="1"){
					var sm = new Array("smile1", "smile2", "smile3");
					addSmile(sm);
				}
				if(kat=="2"){
					var sm = new Array("smile4", "smile5", "smile6");
					addSmile(sm);
				}
			}
		</script>
	</head>
	<body>
		<span onClick="selectkat(1);">Приветствие</span><span onClick="selectkat(2);">Прощание</span>
		<p id="text">Какойто текст.</p>
	</body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 24.01.2009, 21:05
Аватар для x-yuri
Отправить личное сообщение для x-yuri Посмотреть профиль Найти все сообщения от x-yuri
 
Регистрация: 27.12.2008
Сообщений: 4,201

или воспользоваться document.createElement, document.appendChild
var img = document.createElement('img');
img.src = '...';
container.appendChild(img);

но лучше добавлять в DOM что-либо за один вызов, а не по очереди все img. Т.е. Лучше создать контайнер, в него поместить img, а потом уже вставлять в документ этот контейнер

Последний раз редактировалось x-yuri, 24.01.2009 в 21:07.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модальное окно BEER_HUNTER Общие вопросы Javascript 2 13.09.2010 21:14
Диалоговое окно !? MD6 Общие вопросы Javascript 5 22.01.2009 02:34
Как сделать справочное окно? Vlaimir Events/DOM/Window 13 05.01.2009 14:06
Как узнать свернуто окно браузера или нет. bar-boss Events/DOM/Window 3 25.09.2008 16:09
Почти popup окно ravnur Общие вопросы Javascript 8 26.08.2008 22:20