Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как зделать такое? (https://javascript.ru/forum/dom-window/8069-kak-zdelat-takoe.html)

JAre 06.03.2010 19:44

Если смеха ради:
Вот Хайтэк вариант:
Запрашиваем у сервера данные каким-то Google Data Protocol - экономия трафика!
Строим страницу jQuery XSLT - расширяемость, стандартизация, гибкость, кеширование и экономия серверных мощностей!

PS. jQuery святое. Не нужно парится со спецификой браузеров, код гораздо понятней и компактней. Это вообще стандарт.

JAre 06.03.2010 19:47

Цитата:

Сообщение от Gozar (Сообщение 46992)
Вот еще одно такое решение: http://divannadom.ru/catalog/nshowall/?mid=81

Это Флеш а не JS. Такое на JS сделать трудно. Тем более не из чего, если даже фоток всех нет.

Gozar 06.03.2010 19:50

Цитата:

Сообщение от JAre (Сообщение 46995)
Это Флеш а не JS. Такое на JS сделать трудно. Тем более не из чего, если даже фоток всех нет.

А в чем проблема? Почему трудно?

JAre 06.03.2010 19:54

Нужно иметь данные о поверхности объекта (как материал на него ложится)
Нужно иметь сам материал в чистой форме.
Нужно выполнить это наложение.

То есть нужна трёхмерная модель и текстура. Наложение это вообще отдельная история. Тут нужно делать на флеше, все остальные варианты будут не переносимы.

Octane 06.03.2010 19:55

JAre, про Canvas не слышали?

JAre 06.03.2010 19:56

А нет, тут, похоже, не учтено наложение. Это практически тоже самое, что я предлагал с выризками. С теми же минусами. И тоже нужна и модель и материалы. Но смотрится хуже чем на 3-Д

Gozar 06.03.2010 19:57

Чета я не понял о каких трехмерных моделях идет речь?

В ссылке что я дал все плоское.

JAre 06.03.2010 19:57

Цитата:

Сообщение от Octane (Сообщение 46998)
JAre, про Canvas не слышали?

ЫЫЫ! Для каждой модели?

JAre 06.03.2010 19:59

Цитата:

Сообщение от Gozar (Сообщение 47000)
Чета я не понял о каких трехмерных моделях идет речь?

В ссылке что я дал все плоское.

Это проекция. Ее нужно или ручками, как видимо Octane предложил считать. Или из модели прегнать скриптом. Это убивает всю расширяемость.

Octane 06.03.2010 20:00

Цитата:

Сообщение от JAre
ЫЫЫ! Для каждой модели?

Что ЫЫЫ? Что для каждой модели? Написать на JavaScript, тоже что и по ссылке, совсем не проблема.

JAre 06.03.2010 20:00

Если перегонять то уж пробще 3-Д с рюшечками(на флеше) сделать чем такое.

JAre 06.03.2010 20:00

Цитата:

Сообщение от Octane (Сообщение 47003)
Что ЫЫЫ? Что для каждой модели? Написать на JavaScript, тоже что и по ссылке, совсем не проблема.

А данные кто вбивать будет?

JAre 06.03.2010 20:03

Тем более, посмотри какие браузеры его, этот твой канвас, поддерживают. Нафига такое нужно в магазине?

Gozar 06.03.2010 20:06

Цитата:

Сообщение от JAre (Сообщение 47005)
А данные кто вбивать будет?

А тот же кто и базу поддерживает, человек со звучным статусом модератор!

JAre 06.03.2010 20:07

Octane
Ты еще SVG предложи :)

Octane 06.03.2010 20:07

Цитата:

Сообщение от JAre
А данные кто вбивать будет?

Все тоже, что и с флеш вариантом.

Цитата:

Сообщение от JAre
Тем более, посмотри какие браузеры его, этот твой канвас, поддерживают.

Все кроме IE поддерживают Canvas. В IE это все можно сделать с помощью VML, есть даже библиотеки транслирующие Canvas и SVG в VML.

Цитата:

Сообщение от JAre
Ты еще SVG предложи

Почему нет?

рекомендую заглянуть:
http://www.chromeexperiments.com/
http://raphaeljs.com/

JAre 06.03.2010 20:09

Цитата:

Сообщение от Gozar (Сообщение 47007)
А тот же кто и базу поддерживает, человек со звучным статусом модератор!

Там нужно работать с координатами, заливкой и прочей бредятиной. Это совсем не тоже самое, что просто залить фотку. Да - в теории можно автоматизировать. Но это просто ппц задача + нет поддержки в популярных браузерах.

Octane 06.03.2010 20:12

Цитата:

Сообщение от JAre
нет поддержки в популярных браузерах

Проснись, уже 2010 год!

JAre 06.03.2010 20:13

Octane
Нент ну вот зачем все эти танцы с бубном вокруг непереносимых фишек и кто этим будет заниматься? Я говорю о том, что во Флеш сделать проще так как:
1. Это еще и IDE
2. Он установлен почти у всех = переносимость.
3. Есть стандартные методы отображения 3D обънектов. Они медлянные, но всёравно быстрее чем на JS самопылы делать.

JAre 06.03.2010 20:15

Цитата:

Сообщение от Octane (Сообщение 47011)
Проснись, уже 2010 год!

Донеси эту мысль офисному планктону и домохозяйкам. Тогда все хором скажут тебе спасибо.

Octane 06.03.2010 20:17

Цитата:

Сообщение от JAre
кто этим будет заниматься?

вы сами начали варианты с нейронными сетями предлагать, а тут вдруг отображения с помощью JS напугались :D

Цитата:

Сообщение от JAre
Донеси эту мысль офисному планктону и домохозяйкам.

Это относится в большей степени к IE6, а в нем есть VML, так что проблема решается так же, как и для нового IE8. А доля других старых браузеров, не поддерживающих эти технологии, пренебрежительно мала.

JAre 06.03.2010 20:17

Цитата:

Сообщение от Octane (Сообщение 47015)
вы сами начали варианты с нейронными сетями предлагать, а тут вдруг отображения с помощью JS напугались :D

Я не про разработку, а про поддержку силами сотрудников магазина. Нейронная сеть простой(ага звучит громко, на самом деле это просто умножалка и складывалка) но ненадежный инструмент для уменьшения гемороя владельцу. Канвасы и векторная графика - напротив...

надо завязывать. А то это уже полный оффтоп. У автора нет даже доступа к фоткам, какие тут хайтыки могут быть? Нужно просто наладить подгрузку и отображение с возможностью расширения.

Gozar 06.03.2010 20:29

Нечего тут налаживать, овчинка выделки не стоит.

PeaceCoder 06.03.2010 22:24

Цитата:

Сообщение от Octane
еще и jQuery

+1. Ради 10 строк кода, включать его. Его походу включают уже где надо и где нет...

Цитата:

Сообщение от JAre
Такое на JS сделать трудно.

Вот как раз на JS и реально, а jQ тут даже лишним будет =)

JAre 06.03.2010 22:35

Легко и перенасимо, да еще и можно будет так же легко загружать данные как во flash? А примеры есть? Вот мой пример http://wow.incgamers.com/blog/commen...aracter-feeds/ Есть что-то такого масштаба на JS?

Цитата:

+1. Ради 10 строк кода, включать его. Его походу включают уже где надо и где нет...
Подход в корне неверный. Тут 10 строк, там 10 строк, код превращяется в кучу мусора с кучей дублированных вставок бразерозависимого кода. А потом хвататся за голову и переписывать весь код? Нет, ну если есть желание усложнять себе жизнь... ИМХО лучше сразу писать на jQ чем потом иметь гемор.

Я подключил JQ в шапку один раз и больше не парюсь. Расширяй сколько хочеш, нужно - добавлю еще и палгин какой. + повторное использование.

И вообще нужно читать внимательно. Я привел списоr приемуществ Флеша для векторного 2Д и тем более 3Д (по крайней мер до webGL) В первую очередь это развитое IDE и переносимость. Это первое на, что приходится обратить внимание при решении даже мелких задач.


PS. Прошено же, по теме... Опять понесло блин.

Gibor21 07.03.2010 00:29

Octane,
Круть! Попрубую это реализовать! Спасибо, в ЛС кинь номер кошелька или телефона, положу обещанные 500р:)

JAre 07.03.2010 01:58

Для всех неверующих в мощь JQ:
Практически за 5 минут можно сделать свапалку, которая:
Разделяет стиль, данные, представление(html), JS сценарии.
Код, отвечающих за создание представления, может выполнятся как на стороне клиента(как сейчас) так и сервера. На клиенте = экономия ресурсов.

В итоге. Спец по рюшечкам работает с CSS. Спец по верстке с HTML, ну а мы кодим JS и никто ни от кого не зависит.

Этот костяк, очень гибок и масштабируем!
Код страницы:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<div id="goods_nav"></div>
<script>$.getScript('js/build_it.js');</script>
</body>
</html>


Сам скрипт:
$.getScript('js/jquery.xslt.js', function(){
	$('#goods_nav').xslt({xmlUrl: 'service/goods.xml', xslUrl: 'service/standard_display.xsl'});
});


и транслятор:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet>
    <xsl:template match="/">
        <xsl:apply-templates select="box/default"/>
    </xsl:template>
    <xsl:template match="box/default">
        <img src="{.}" id="goods_img" />
    </xsl:template>
 

        <xsl:template match="/">
            <xsl:apply-templates select="box/img"/>
        </xsl:template>
        <xsl:template match="box/img">
            <img src="{@icn}" onclick="$('#goods_img').attr('src', '{.}')" onMouseOver="$(this).attr('style','cursor:pointer');"/>
        </xsl:template>        

</xsl:stylesheet>


вот сборка: http://fileua.com/download.php?file=...ca7e78d8db0a9e

JS из транслятора можно вынести, для инкапсуляции или заменить на хэндл, но это ДЕМКА и тут главное наглядность.
goods.xml в рабочем коде может быть ...goods.xml?type=box - выбирается модель при переходе на страницку выбора цвета. Естественно goods.xml может содержать куда больше информации: рейтинги, цены, описание и тп. и тд. И всё это можно добавить в любой момент. Так же можо полностью изменить внешний вид страницы не трогая данные через display.xsl?type= то же на любой стадии.

ЗЫ. Я не учавствую в конкурсе ;)

Kolyaj 07.03.2010 10:26

Цитата:

Сообщение от JAre
Разделяет стиль, данные, представление(html), JS сценарии.

Вот как раз представление и js он не разделяет. Т.е. переверстал страницу, будь добр скрипты переписать, ибо там в каждой строчке куча селекторов, которые уже неактуальны для новой вёрстки.

JAre 07.03.2010 13:30

Kolyaj
Окей.

$.getScript('js/jquery.xslt.js', function(){
	$('#goods_nav').xslt({xmlUrl: 'service/goods.xml', 
						 xslUrl: 'service/standard_display.xsl',
						 callback: function() {
		$.ajax({ url: "js/standard_display.js", 
				 dataType: "script",
				 cache: true				 
		       });
	}
						 });
});


<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet>
    <xsl:template match="/">
        <xsl:apply-templates select="box/default"/>
    </xsl:template>
    <xsl:template match="box/default">
        <img src="{.}" id="goods_img" />
    </xsl:template>
 
    <xsl:template match="/">
        <xsl:apply-templates select="box/img"/>
    </xsl:template>
    <xsl:template match="box/img">
        <img name="goods_nav_btn" src="{@icn}" g_img="{.}" />
    </xsl:template>  
</xsl:stylesheet>


$('[name=goods_nav_btn]').click(function(){
	  $('#goods_img').attr('src', $(this).attr('g_img'));
});

Kolyaj 07.03.2010 17:15

JAre,
и что это доказывает?

JAre 07.03.2010 17:54

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

Тем более xsl и xml это не файл, а информация сформированная сервисом в ответ на запрос и ее легко компоновать.

Kolyaj 07.03.2010 18:03

Цитата:

Сообщение от JAre
В представлении кнопка говорит: "я кнопка для переключения цвета" и всё.

Ну разумеется можно не пользоваться селекторами и помечать нужные элементы классами (как, собственно, и должно быть), но зачем тогда jQuery? Вся концепция jQuery построена вокруг селекторов.

JAre 07.03.2010 18:38

В jQuery полно плагинов и эллементов интерфейса, которые можно использовать как "черный ящик" и разнообразных AJAX-ов. При желании можно найти плагин на любой случай жизни. Всё с более менее стандартным интерфейсом, всё компактно упаковано и лишнее можно просто не подключать. Конечно, толк от jQuery как от средства путишествий по ДОМ меньше, если всё динамично, но такие путишествия не особо то и нужны так как документ строит XSLT из блоков, а он сам имеет всю необходимую логику + он может даже скрипт построить и привести в соотвецтвие маркеры в JS селекторах и HTML. В документе будет только то, что необходимо в данный момент. CSS то же не очень гибок, но и его можно сделать таковым если строить через XSLT - хорошо для разрешения неоднозначностей и других конфликтов. Гугол продвигает JSON тут то же ест шаблоны "google-jstemplate" Видимо, экономичнее и читабельней.

why.not? 07.03.2010 19:54


Gozar 07.03.2010 21:24

JAre,
В моем лексиконе есть такое понятие "шаблонизаторные уроды", я называю таким понятием сайты или системы главным достоинством которых их создатели считают то, что они построены на XSLT.

ps: И да я если чё за JSON :)

и ещё у Вас jquery головного мозга, а на этом сайте есть раздел для обсуждения jquery, не хотите проследовать туда?

JAre 07.03.2010 22:40

Если вам не нравятся шаблоны, значит, вы не умеете их готовить ;)

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

PS. Ваша тема ваши правила.

Gibor21 07.03.2010 22:51

Ну вы маниаки:)
Классный форум! Здорово, что я его нашел! :dance:

Gozar 07.03.2010 22:59

Цитата:

Сообщение от JAre (Сообщение 47089)
Если вам не нравятся шаблоны, значит, вы не умеете их готовить ;)

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

Это у Вас время покажет, у меня оно уже показало.

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

Gibor21 10.03.2010 04:55

Благодаря товарищу Octane все получилось.
Вот здесь все видно http://vinylroom.ru/index.php?productID=21
Но теперь встал перед другой проблемой:
Как сделать фокусировку на элементы <options> в контейнере <select> при клике по цветным иконкам?

Octane 10.03.2010 11:58

А зачем дублировать навигацию? Там <select> вообще не нужен. Текст каждой ссылки содержит название цвета, которое можно выводить куда угодно, осталось дописать изменение value какого-нибудь <input type="hidden">, чтобы отправить ваш цветовой индекс на сервер. Ну а сами индексы цветов хранить, например, в выдуманном атрибуте color элемента <a>:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
	<style type="text/css">
		.item .color {
			display: block;
			width: 32px;
			height: 32px;
			margin: 10px;
			text-indent: -9999px;
			cursor: pointer;
			border: 1px solid #000;
		}
		.brown {
			background: #930;
		}
		.lilac {
			background: #606;
		}
		.item .photo {
			background: url(http://javascript.ru/forum/images/ca_serenity/misc/progress.gif) no-repeat center center;
		}
	</style>
	
	<form action="" class="item">
		Выбран цвет: <span class="color-name">Фиолетовый</span>
		<input class="color-index" type="text" name="option_select_2" value="0:1" /> <!-- заменить тип на hidden -->
		<img class="photo" src="http://s60.radikal.ru/i169/1003/ce/51d329b4ca7c.jpg" alt="" width="278px" height="400px" />
		<a href="http://s004.radikal.ru/i206/1003/17/9edf0ad0c180.jpg" class="color brown" color="0:0">Коричневый</a>
		<a href="http://s60.radikal.ru/i169/1003/ce/51d329b4ca7c.jpg" class="color lilac" color="0:1">Фиолетовый</a>
	</form>

	<script type="text/javascript">
		function hasClass(element, className) {
			return (" " + element.className + " ").indexOf(" " + className + " ") != -1;
		}
		function findClass(className, root) {
			root = root || document;
			if (root.getElementsByClassName) {
				return root.getElementsByClassName(className);
			}
			if (root.querySelectorAll) {
				return root.querySelectorAll("." + className);
			}
			var elements = [], allElements = root.getElementsByTagName("*"), length = allElements.length, i = -1, j = 0;
			while (++i < length) {
				if (hasClass(allElements[i], className)) {
					elements[j++] = allElements[i];
				}
			}
			return elements;
		}
		
		(function () {

			function switchImage(node, src) {
				node.src = "адрес однопиксельного прозрачного gif";
				node.src = src;
			}
			function switchColorName(node, colorName) {
				node.innerHTML = colorName;
			}
			function switchColorIndex(node, colorIndex) {
				node.value = colorIndex;
			}

			var items = findClass("item"), i = items.length;
			while (i--) {
				items[i].onclick = function (e) {
					e = e || window.event;
					var target = e.target || e.srcElement;
					if (hasClass(target, "color")) {
	
						switchImage(findClass("photo", this)[0], target.href);
						switchColorName(findClass("color-name", this)[0], target.innerText || target.textContent);
						switchColorIndex(findClass("color-index", this)[0], target.getAttribute("color"));

						return false;
					}
				};
			}
		}());
	</script>
</body>
</html>



Вы на сайте забыли добавить однопиксельный прозрачный gif:
node.src = "адрес однопиксельного прозрачного gif";

Без него progress.gif не всегда можно будет увидеть во время загрузки.


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