Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 06.03.2019, 21:09
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Да, нужно уточнение! Вы сказали: «без backend'а будет туго». Да, это так и есть! Если потребуется изменить или добавить, например, какой-либо пункт меню или ещё что, то придётся редактировать каждый файл.

Из высказывания «без backend'а будет туго» следует, что лучшим решением будет завести сервер, который будет при каждом запросе генерировать необходимое содержимое, основываясь на запросе, данных подходящих под этот запрос и шаблоне. И это хорошо! Но на самом ли деле нужен такой сервер?

Не достаточно ли этого? (файл index.html)
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
</head>
<body>
	<script src="app.js"></script>
</body>
</html>


Конечно же оно может и не так радикально (так мало HTML) выглядеть, там могут быть естественно <template> или сразу подготовлены элементы, в которые будут вставляться данные, или сами элементы меняться. Суть в том, что это и есть шаблон, который меняется в одном месте! А в скрипте или в коде программы, описано, что и как показывать (например, это может зависеть от URL(в котором меняется только #hash, т. е. изменения внедряются тогда, когда происходит событие hashchange))

Данные тогда не нужно запихивать в HTML на сервере, поскольку данные в чистом виде могут быть загружены с сервера. Их легко обрабатывать и выводить (а не так, что сервер возвращает отрисованную страницу, и затем скрипт в клиентской части что-то ещё пытается делать с той страницей, и потом уже совсем не понятно, а это на клиенте поменялось или на сервере так отрисовалось.)

Чистые данные? Какие бы данные не были (справочные материалы или документация или товары в магазине или покемоны с их местоположением и временем появления или расписание транспорта или ещё что), то они должны быть представлены без разметки. Т. е. данные представлены так, что их легко анализировать (не из извлекать из DOM, который может сильно завязан на том, как данные визуально выглядят) Таким форматом может быть markdown, json-p, json, csv, или какой либо свой собственный бинарный формат (вам придётся написать свой парсер)

В большинстве случаев подходит JSON, но если вы захотели клиенту отдать сразу всю базу данных, то JSON может быть слишком многословен, и вы захотите отдавать данные в csv или бинарном формате!

Вот пример: (характерный код, обрабатывающий уже отрисованную страницу, код взят с сайта govnokod.ru c незначительным изменением, вся проблема в том, что данные извлекаются из DOM)
var text_message = "";
for(var i = 0, i <= 5; i++) {
	text_message += "\n Вопрос №" + (i + 1) + ": " + $('input[name=question_' + i +']:checked').parent().parent().parent().find(".title").text() + " Ответ: " + $('input[name=question_' + i +']:checked').val();
}


Вот тот же пример, но с чистыми данными!
var data = [];
var text_message = data.map(({ question, answer }, i) => `Вопрос №${i + 1}: ${question} Ответ: ${answer}`).join("\n");


Вы правда можете спросить, а какая разница, извлечь данные из DOM или скачать с сервера? Для того, чтобы их туда поместить, требуется лишняя операция по размещению их там! (Не говоря о том, что такой код получается запутанней) Более практичней было бы размещение в DOM <script> c необходимым объектом. Например, объект со статичными текстами приложения могут быть сразу вставлены на страницу, а затем по мере необходимости, когда пользователь выберет другой язык, будет подгружен скрипт со данными нового языка по принципу json-p, все такие скрипты могут быть заранее сгенерированы!

Польза? Вместо того, чтобы всё время дёргать сервер, мы сразу получаем данные, которые во время сессии не поменяются. И даже интерактивные данные тоже, они должны быть чистыми! Пример сайта с таким подходом https://transport.tallinn.ee/

Кто-то может сказать, что с таким #hash Google сайт не видит, это обман, всё работает нормально. На этом форуме обсуждалось про #hash! https://javascript.ru/forum/misc/639...7parse%27.html

Последний раз редактировалось Malleys, 06.03.2019 в 21:13.
Ответить с цитированием
  #12 (permalink)  
Старый 07.03.2019, 06:26
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Ясна, тут никто не может помочь, как и ва всем интернете, нужен такой скрипт каторый сначала найдет ссылку на эту страницу заменит на текст и тексту присвоит класс, потом найдет ссылку на папку обрезав адрес от точки до первого слеша включителна, присвоит класс или заменит на нужный, потом найдет ссылку обрезав от точки до второва слеша и присвоит класс, и так да тех пор пока не астанется ссылка на главную папку типа http://сайт.ru/папка и скрипт должен работать независимо от того как прописаны ссылки с слешем или без слеша и даже если указан абсолютно путь начиная от http://
Ответить с цитированием
  #13 (permalink)  
Старый 07.03.2019, 08:22
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Сообщение от Malleys
Из высказывания «без backend'а будет туго» следует, что лучшим решением будет завести сервер, который будет при каждом запросе генерировать необходимое содержимое, основываясь на запросе, данных подходящих под этот запрос и шаблоне.
Я не имел ввиду конкретно этот вариант рендеринга, однако он, пожалуй, самый простой.
Ответить с цитированием
  #14 (permalink)  
Старый 07.03.2019, 09:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Блондинка, попробуйте так:
(()=>{
	const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
	const extension=uriWithoutParams.split('.').pop();
	const uriParts=uriWithoutParams.replace('.'+extension,'').split('/').filter(part=>part.length);
	const getClassName=index=>'xyz'+index;
	
	uriParts.forEach((uri,index)=>{
		uri='/'+uriParts.slice(0,++index).join('/')+'.'+extension;
		const className=getClassName(index);
		
		document.querySelectorAll(`a[href="${uri}"]`).forEach(node=>{
			node.classList.add(className);
		});
	});
})();
Ответить с цитированием
  #15 (permalink)  
Старый 07.03.2019, 11:06
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Nexus,
так?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="https://www.w3.org/1999/xhtml">
<head>
<title>transform</title>
<style type="text/css">
body { font: 14px normal Times, serif; }
div { border: 1px solid #ccc; padding: 5px; margin: 5px; }
a { text-decoration: none; color: #3c3vff; }
.xyz1 { color: #009900; }
.xyz2 { color: #11b311; }
.xyz3 { color: #28cc28; }
</style>
<script>
(()=>{
	const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
	const extension=uriWithoutParams.split('.').pop();
	const uriParts=uriWithoutParams.replace('.'+extension,'').split('/').filter(part=>part.length);
	const getClassName=index=>'xyz'+index;
	
	uriParts.forEach((uri,index)=>{
		uri='/'+uriParts.slice(0,++index).join('/')+'.'+extension;
		const className=getClassName(index);
		
		document.querySelectorAll(`a[href="${uri}"]`).forEach(node=>{
			node.classList.add(className);
		});
	});
})();
</script>
</head>
<body>
<div class="menu" id="menu1">
<a href="/html.html">HTML</a> 
<a href="/css.html">CSS</a> 
<a href="/js.html">JS</a> 
</div>
<div class="menu" id="menu2">
<a href="/css/css3.html">CSS3</a><br/>
<div>
<a href="/css/css3/transform.html">transform</a><br/>
<a href="/css/css3/transform-origin.html">transform-origin</a><br/>
<a href="/css/css3/transform-style.html">transform-style</a><br/>
</div>
</div>
</body>
</html>
Ответить с цитированием
  #16 (permalink)  
Старый 07.03.2019, 11:14
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Блондинка, вам уже писали про DOMContentLoaded, примените полученные знания и заработает.
Код работоспособен: https://jsfiddle.net/x89bscga/
Ответить с цитированием
  #17 (permalink)  
Старый 07.03.2019, 12:51
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

так?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="https://www.w3.org/1999/xhtml">
<head>
<title>transform</title>
<style type="text/css">
body { font: 14px normal Times, serif; }
div { border: 1px solid #ccc; padding: 5px; margin: 5px; }
a { text-decoration: none; color: #3c3vff; }
.xyz1 { color: #009900; }
.xyz2 { color: #11b311; }
.xyz3 { color: #28cc28; }
</style>
<script>
document.addEventListener('DOMContentLoaded', (()=>{
	const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
	const extension=uriWithoutParams.split('.').pop();
	const uriParts=uriWithoutParams.replace('.'+extension,'').split('/').filter(part=>part.length);
	const getClassName=index=>'xyz'+index;
	
	uriParts.forEach((uri,index)=>{
		uri='/'+uriParts.slice(0,++index).join('/')+'.'+extension;
		const className=getClassName(index);
		
		document.querySelectorAll(`a[href="${uri}"]`).forEach(node=>{
			node.classList.add(className);
		});
	});
})();
</script>
</head>
<body>
<div class="menu" id="menu1">
<a href="/html.html">HTML</a> 
<a href="/css.html">CSS</a> 
<a href="/js.html">JS</a> 
</div>
<div class="menu" id="menu2">
<a href="/css/css3.html">CSS3</a><br/>
<div>
<a href="/css/css3/transform.html">transform</a><br/>
<a href="/css/css3/transform-origin.html">transform-origin</a><br/>
<a href="/css/css3/transform-style.html">transform-style</a><br/>
</div>
</div>
</body>
</html>
Ответить с цитированием
  #18 (permalink)  
Старый 07.03.2019, 12:58
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Блондинка, почти
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="https://www.w3.org/1999/xhtml">
<head>
<title>transform</title>
<style type="text/css">
body { font: 14px normal Times, serif; }
div { border: 1px solid #ccc; padding: 5px; margin: 5px; }
a { text-decoration: none; color: #3c3vff; }
.xyz1 { color: #009900; }
.xyz2 { color: #11b311; }
.xyz3 { color: #28cc28; }
</style>
<script>
	document.addEventListener('DOMContentLoaded', ()=>{
		const uriWithoutParams=location.pathname.split(/[#|?]+/i).shift();
		const extension=uriWithoutParams.split('.').pop();
		const uriParts=uriWithoutParams.replace('.'+extension,'').split('/').filter(part=>part.length);
		const getClassName=index=>'xyz'+index;
		
		uriParts.forEach((uri,index)=>{
			uri='/'+uriParts.slice(0,++index).join('/')+'.'+extension;
			const className=getClassName(index);
			
			document.querySelectorAll(`a[href="${uri}"]`).forEach(node=>{
				node.classList.add(className);
			});
		});
	});
</script>
</head>
<body>
<div class="menu" id="menu1">
<a href="/html.html">HTML</a> 
<a href="/css.html">CSS</a> 
<a href="/js.html">JS</a> 
</div>
<div class="menu" id="menu2">
<a href="/css/css3.html">CSS3</a><br/>
<div>
<a href="/css/css3/transform.html">transform</a><br/>
<a href="/css/css3/transform-origin.html">transform-origin</a><br/>
<a href="/css/css3/transform-style.html">transform-style</a><br/>
</div>
</div>
</body>
</html>
Ответить с цитированием
  #19 (permalink)  
Старый 07.03.2019, 13:22
Аватар для Блондинка
Профессор
Отправить личное сообщение для Блондинка Посмотреть профиль Найти все сообщения от Блондинка
 
Регистрация: 24.02.2019
Сообщений: 806

Отлично обновляется страница переходя на саму себя и ссылки как были все одного цвета так и остались синие
Ответить с цитированием
  #20 (permalink)  
Старый 07.03.2019, 13:32
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,726

Сообщение от Блондинка
Отлично обновляется страница переходя на саму себя и ссылки как были все одного цвета так и остались синие
Выше была ссылка на jsfiddle, все работает.
Ищите и устраняйте ошибку.

Создайте тему в разделе «Работа» указав сумму вознаграждения.
После выполнения исполнителем работы при возникновении ошибок сможете предъявить исполнителю претензии.

Здесь же, без строчки собственного кода, это неуместно.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция для перевода размера из байтов в понятный для человека формат Антон Крамолов Ваши сайты и скрипты 4 05.04.2013 16:42
Изменить цвет при клике AndreyS jQuery 3 07.10.2012 16:27
Вопрос по относительному позиционированию DIV XPOMOB (X)HTML/CSS 11 15.07.2009 17:02
Можно ли одновременно изменить фон и текст в поле? Bad Request Events/DOM/Window 12 25.09.2008 23:10