Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Окно смайлов (https://javascript.ru/forum/misc/2623-okno-smajjlov.html)

Kinweb 24.01.2009 01:56

Окно смайлов
 
Приветствую знатоков 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:

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

x-yuri 24.01.2009 03:42

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

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

p.s. не пользуйся document.write ;-)

Zibba 24.01.2009 12:40

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

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

x-yuri 24.01.2009 17:09

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);
    }
}

Но изначально такой совет в книжке прочитал (там это как-то со словом парадигма связывали), но уже не помню

Zibba 24.01.2009 17:45

Да про парадигму то понятно :) в таком случае можно и тернарный оператор ? : тоже посылать куда подальше :) чтобы читабельней было. В общем тут думаю дело привычки и стиля написания кода отдельным индивидумом, ибо например меня в отличие от Вас больше интересует производительность (пусть то будет доля секунды незначительная) чем читабельность :) (да я из разряда тех людей :D )

x-yuri 24.01.2009 18:43

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

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

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

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

Zibba 24.01.2009 18:49

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

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


Более читабельно чем во втором случае, но как показал случай с топик стартером темы откуда вы взяли пример, ему это было не очевидно. Потому и говорю, тут дело привычки и стиля написания кода (в некоторых случаях и знание синтаксиса), тоже будут играть роль как Вы выразились во "Времени программиста" которое дорого. Все зависит от конкретного случая :) и как Вы правильно заметили "выбор, конечно, за вами ;-)"

Kinweb 24.01.2009 20:21

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

Zibba 24.01.2009 20:44

Если правильно понял Вас, то думаю это решение Вашей проблемы, ну или по крайней мере поможет Вам разобраться в нём:
<!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>

x-yuri 24.01.2009 21:05

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

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


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