Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сделать? (https://javascript.ru/forum/misc/78060-kak-sdelat.html)

laimas 26.07.2019 06:15

Цитата:

Сообщение от Блондинка
вот так показывает пятницу

Но вот с воскресеньем будут проблемы. Значит нет понятия как все работает. Что же вы в трех столбах то заблудились.

Вы блондинка и это значение вашего свойства "цвет волос", по аналогии со свойством value опций списка.

Вы стоите в очереди в магазине, а перед вами стоит дама у которой свойство "цвет волос" равно "брюнетка". Здесь вам не сложно понять, что дама в очереди имеет номер 1, а вы номер 2? Думаю, что не сложно. А также очевидно, что когда брюнетка отоварится и уйдет, то ваш номер в очереди станет равным 1, но при этом вы не станете брюнеткой и, думаю, тоже понятно.

Также и опции списка, как впрочем и любая коллекция элементов, имеют такую нумерацию, которая называется индексацией, но в отличии от очереди в магазине она начинает не с 1, а с 0.

Неделя у "буржуев", в отличии от нас пролетариев, начинается с воскресенья, то есть этот день в коллекции дней недели будет иметь номер/индекс равный 0. А последний день недели это суббота, с индексом 6.

В этом выражении .options[d.getDay()||7].selected = true; сказано:

взять опцию списка с индексом, который определяется индексом текущего дня недели и выбрать эту опцию. Свойство value выбранной опции будет определять значение списка (программный выбор). Выражение d.getDay()||7 будет работать по следующей логике: если день недели не воскресенье (getDay() возвращает не 0, а все что не 0, это true), то индекс выбираемой опции будет в пределах от 1 до 6, а если воскресенье (getDay() возвращает 0, false), то будет определен индекс равный 7.

И это бы работало, если бы ваш список имел еще одну опцию перед понедельником, то есть 8 опций с индексами соответственно от 0 до 7. А у вас всего 7 опций с индексами от 0 до 6. Уменьшив на 1 возвращаемое функций getDay() значение, вы решаете проблему для понедельника по субботу включительно, а вот опции воскресенья с индексом 7 в вашем писке нет. Что нужно сделать?

А вот выражение document.querySelector('#day_02').value = d.getDay() устанавливает значение списка, выбирает опцию его не по по его индексу, а по его свойству value. Если эти свойства будут иметь такие же значения как и значения возвращаемые функций getDay() (от 0 до 6), то такой проблемы как выше не возникает, более того, опции (дни недели) в списке могут иметь какой угодно порядок, так как индекс здесь не важен.

laimas 26.07.2019 09:14

Цитата:

Сообщение от Русский
стоит издеваться над убогими и давать им надежду

Чего не стоит делать, так это не опускать свое достоинство ниже плинтуса, считая себя избранным, а остальных ущербными.

laimas 26.07.2019 10:07

Цитата:

Сообщение от Русский
потакать таким в своей убеждённости

Вас кто-то заставляет? Проходите мимо, если вы такой крутой дока, а что касается остальных, так это как они хотят, и в ваших советах как поступать я думаю никто из них не нуждается.

laimas 26.07.2019 11:05

Цитата:

Сообщение от Русский
надо обязательно указать, какие вокруг все мудаки

Не видно, чтобы вас кто-то так называл, а вот с вашей стороны явное оскорбление наблюдается, где вы называете ошибку как "генетическую". Даже если вас кто-то и игнорирует, это не дает вам право унижать и оскорблять его. В частности автора данной темы.

Блондинка 26.07.2019 21:10

laimas,
одним словом если использовать строчку
document.querySelector('#day_01').options[d.getDay()||7].selected = true;

в hrml надо использовать список опций По порядку с воскресенья По субботу, а если использовать строчку с value то можно опции располагать в любом порядке, главное чтобы валуе соответствовало воскресенье = 0 понедельник =1 и т.д.

Блондинка 26.07.2019 21:13

P. S. мне кажется что лучше просто не реагировать на посты русских

Блондинка 26.07.2019 21:40

Русский,
да не волнуйся ты так, к окончанию школы может быть и выучишь english...

Блондинка 26.07.2019 21:57

...

Блондинка 26.07.2019 23:39

а такой вопрос

document.addEventListener('DOMContentLoaded', function() {
    var d = new Date(),
        days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" ");
    
    document.querySelector('#day').textContent = days[d.getDay()];
    document.querySelector('#day_01').options[d.getDay()||7].selected = true;
    document.querySelector('#day_02').value = d.getDay()
    document.querySelector('#date').options[d.getDate()-1].selected = true;
    document.querySelector('#date_01').value = d.getDate();
    document.querySelector('#month').options[d.getMonth()].selected = true;
    document.querySelector('#year').value = d.getFullYear();
});


почему в строке
document.querySelector('#day_02').value = d.getDay()
не надо точка с запятой, а в строке
document.querySelector('#date_01').value = d.getDate();
надо? и как правильно с месяцем
document.querySelector('#month_01').value = d.getMonth()
с точкой с запятой или без?

laimas 27.07.2019 00:30

Цитата:

Сообщение от Блондинка
если использовать строчку
document.querySelector('#day_01').options[d.getDay()||7].selected = true;
в hrml надо использовать список опций По порядку с воскресенья По субботу, а если использовать строчку с value то можно опции располагать в любом порядке...

Ну в общем то да, но для вашего списка по индексу таким образом не получится, есть ошибка и d.getDay()-1||7 тоже будет с ошибкой.

a = b || c

означает "присвоить a значение b ИЛИ c", при этом значение b будет присвоено только в случае если булево значение ее равно true (в данном случае не равно 0), иначе будет присвоено значение c. Вы хотите сделать так:

a = b-1 || c

Да, направление логики верное - сдвинуть индексы вверх на одну позицию. Но только такое решение логики также будет выдавать ошибки, и это легко проверить:

<script>
//это календарь буржуев
var d = 'Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота'.split(' '),
//а это наш календарь и ваш список
    s = 'Понедельник Вторник Среда Четверг Пятница Суббота Воскресенье'.split(' '), a = [];    
//здесь итератор i имитирует номер дня возвращаемого функцией getDay()
//и решение, в которое вы облекли свою логику и которое ошибочно 
for(var i=0; i<7; i++) a.push( 
    d[i]+' > '+i 
    +', номер дня после вычитания > '+(i-1)  
    +', индекс для опции > '+(i-1||7) 
    +', выбранный в списке день > '+s[i-1||7]);
    
document.write(a.join('<br>'));
</script>


Так как нужно записать вашу логику для b || c, так чтобы в итоге получить индексы на 1 меньше? И ответ на этот вопрос нужно искать не в JS, а в математике из школьного курса.

По поводу точек с запятой - именно в этом коде, так как он написан, каждое действие на новой строке, их вообще может и не быть, но если код "сжать", то он работать не будет.

Блондинка 27.07.2019 01:45

laimas,
получается что надо использовать строчку
document.querySelector('#day_01').options[d.getDay()].selected = true;
и список
<select>
<option>вс</option>
<option>пн</option>
...
<option>сб</option>

вроде бы сейчас правильно...

laimas 27.07.2019 02:01

Да, либо поставить опции списка в том же порядке, что возвращает функция getDay(), либо использовать наш порядок, но уменьшая индекс на 1:

document.querySelector('#day_01').options[(d.getDay()||7)-1].selected = true;

Malleys 27.07.2019 20:07

Цитата:

Сообщение от Блондинка
laimas, а тут что не так?

А вам не кажется странным, что приходится писать много однотипного кода? А если добавить ещё один календарь для изменения дат, то как вы решите ваши противоречия в коде?

Цитата:

Сообщение от Блондинка
можно спан оформить стилями, и для каждого браузера использовать своё фоновое изображение, но проще сделать селект

А зачем вам фоновое изображение, когда у элемента <select> его нет? Для этого у элемента <select> используется свойство -webkit-appearance (в старых Firefox также было свойство -moz-appearance)

Цитата:

Сообщение от Блондинка
но проще сделать селект

Который выглядит абсолютно по разному в разных браузерах и на разных платформах! Вам так и так придётся применить appearance: none и другие объявления, чтобы поля выглядели однородно!

Цитата:

Сообщение от Блондинка
оптион

Цитата:

Сообщение от laimas
опшен

Не, не попало... оно произносится как /ɑpʃn̩/ https://youglish.com/search/option/us



Цитата:

Сообщение от laimas
Неделя у «буржуев», в отличии от нас пролетариев, начинается с воскресенья

В Священном Писании сказано: «Помни субботний день и освящай его. Шесть дней работай и делай все свои дела, а седьмой день — суббота Господу, твоему Богу» (Исход [Шмот, Итро] 20:7–9, Тора, Перевод с иврита Давида Сафронова)

laimas, обратите внимание, что суббота является седьмым днём, а значит следующий день недели, который в современном русском языке называется воскресением, является первым днём. Еврейское слово שַׁבָּת означает день отдыха.

Как видите, воскресенье — с давних пор первый день недели. Также вы можете прочитать в христианских писаниях: «По прошествии же субботы, на рассвете первого дня недели, пришла Мария Магдалина и другая Мария посмотреть гроб». (Матфея 28:1, Синодальный перевод)

В иудейских, христианских и мусульманских странах семидневная неделя начиналась с воскресенья. Россия не была исключением.




































И уже потом в СССР первым днём недели был объявлен понедельник...

Из-за этого безосновательного поступка у русскоязычных читателей Священного Писания возникает теперь вопрос: «Почему суббота названа седьмым днём?»












Блондинка, если вы создаёте дату new Date() и хотите изменять её при помощи графического интерфейса, то вы можете написать класс DateView, который позволяет изменять экземпляр даты. Таким образом у вас для каждой даты будет свой собственный редактор, который не мешает другим редакторам даты! Пример, как это может выглядеть...
var myDate = new Date();
var view = new DateView(myDate);
document.body.appendChild(view.element);
Просто и легко! Вот реализация класса DateView с примером...
<!DOCTYPE HTML>
<html lang="ru">

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width">
	<style>

.calendar-view button,
.calendar-view select,
.calendar-view input {
	box-sizing: border-box;
	height: 2em;
	margin: 0;
	-webkit-appearance: none;
	-moz-appearance: none;
	appearance: none;
	padding: 0 0.5em;
	border: 0;
	background: white;
	font: inherit;
}
		
.calendar-view button[value] {
	min-width: 2em;
	font-weight: bold;
	border: 0 solid #eee;
}
		
.calendar-view button[value="-1"] {
	border-right-width: 1px;
}
		
.calendar-view button[value="1"] {
	border-left-width: 1px;
	float: right;
}
		
.calendar-view input[type=number] {
	width: 5em;
}

.calendar-view .control {
	display: inline-block;
	border: 1px solid #aaa;
	margin: 0.1em;
	border-radius: 0.3em;
	overflow: hidden;
}
		
@media(max-width: 250px) {
	.calendar-view .control {
		display: block;
	}
}
	</style>
	<script>
		
function DateView(date) {
	this.date = date;
	this.element = document.createElement("div");
	this.element.className = "calendar-view";

	this.header = document.createElement("div");
	this.element.appendChild(this.header);

	this.dateElement = document.createElement("select");
	this.dateElement.addEventListener("change", function() {
		view.date.setDate(this.value);
		view.update();
	});
	this.element.appendChild(this.dateElement);
	this.addControls(this.dateElement, "Date");

	this.monthElement = document.createElement("select");
	this.monthElement.addEventListener("change", function() {
		view.date.setMonth(this.value);
		view.update();
	});
	this.element.appendChild(this.monthElement);
	this.addControls(this.monthElement, "Month");

	this.yearElement = document.createElement("input");
	this.yearElement.type = "number";
	this.yearElement.addEventListener("change", function() {
		view.date.setFullYear(this.value);
		view.update();
	});
	this.element.appendChild(this.yearElement);
	this.addControls(this.yearElement, "FullYear");

	var view = this;			
	view.update();
}

DateView.prototype = {
	constructor: DateView,
	update: function() {
		var days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" ");
		var monthes = "января февраля марта апреля мая июня июля августа сентября октября ноября декабря".split(" ");
		this.header.textContent = days[this.date.getDay()];

		var date = this.date.getDate();
		var html = '';
		var days = new Date(this.date.getFullYear(), this.date.getMonth() + 1, 0).getDate();
		for(var i = 1; i <= days; i++)
			html += '<option '+ (i === date ? ' selected' : '')+ '>'+ i+ '</option>';
		this.dateElement.innerHTML = html;

		var month = this.date.getMonth();
		var html = '';
		for(var i = 0; i < 12; i++)
			html+='<option value="'+ i+ '"'+ (i === month ? ' selected' : '')+ '>'+ monthes[i]+ '</option>';
		this.monthElement.innerHTML = html;

		this.yearElement.value = this.date.getFullYear();				
	},
	addControls: function(element, component) {
		var view = this;
		var controlField = document.createElement("div");
		controlField.className = "control";
		element.parentNode.insertBefore(controlField, element);

		var prevButton = document.createElement("button");
		prevButton.textContent = "−";
		prevButton.value = "-1";
		prevButton.addEventListener("click", handler);

		var nextButton = document.createElement("button");
		nextButton.textContent = "+";
		nextButton.value = "1";
		nextButton.addEventListener("click", handler);

		controlField.appendChild(prevButton);
		controlField.appendChild(element);
		controlField.appendChild(nextButton);
		element.controls = [prevButton, nextButton];

		function handler() {
			view.date["set" + component](view.date["get" + component]() + Number(this.value));
			view.update();
		}
	}
};

// Пример использования
document.addEventListener("DOMContentLoaded", function() {
	var myDate = new Date();
	var view = new DateView(myDate);
	document.body.appendChild(view.element);
});

	</script>
</head>

<body></body>

</html>

Блондинка 27.07.2019 23:38

Malleys,
а чем не вариант установить на странице выпадающий список с одной опцией, в которой и отображается день недели, и нету возможности выбора, мне кажется этот вариант проще, чем наделать скриншотов с разных браузеров обрезать выпадающий список и эти изображения использовать для спана в качестве фонового изображения...

Malleys 28.07.2019 01:51

Цитата:

Сообщение от Блондинка
а чем не вариант установить на странице выпадающий список с одной опцией, в которой и отображается день недели, и нету возможности выбора, мне кажется этот вариант проще, чем наделать скриншотов с разных браузеров обрезать выпадающий список и эти изображения использовать для спана в качестве фонового изображения...

А где вы вообще увидели снимки экрана и фоновые картинки в примере?

Теперь у вас новая навязчивая идея — выпадающий список с одной опцией и нету возможности выбора. А зачем вам такое? Решение — используйте текстовый узел (text node)!

Несколько месяцев назад у вас была другая навязчивая идея — нажать на <div>. Решение — используйте <button>.

Следуйте этим простым советам, и у вас всё получится!

Кстати, пример, который я сделал, он работает на вашем телефоне? Если нет, то попытайтесь найти в примере то, чего не было в 2011 году! Если да, то всё равно разберите пример, попытайтесь понять, что делает каждый участок кода!

Цитата:

Сообщение от Русский
Как бы у них после этого не возник вопрос насчёт [понедельника,] вторника, [среды,] четверга и пятницы.

Так именно у вас и возник такой вопрос! (Добавил в вашу цитату в квадратных скобках дни недели, которые для вас, очевидно, ещё больше не понятны!)

Если вы читали выше, то у вас определённо должен был возникнуть вопрос, а как же всё-таки называлось воскресенье! Воскресенье называлось — недѣлей (ст.‑слав. недѣ́ля, то есть днём, когда «не делают», то есть не работают, во всех остальных славянских языках, этот день называется «недѣлей» (польск. niedziela, укр. неділя, хорват. nedjelja, болгар. неделя, чеш. neděle и т. д.))

Соответственно...
  • начало седмицы — недѣля
  • первый день после недѣли — понедѣльникъ
  • второй день после недѣли — вторникъ
  • середина седмицы — среда
  • четвёртый день после недѣли — четвергъ
  • пятый день после недѣли — пятница
  • седьмой день седмицы — суббота (др.‑евр. שַׁבָּת, такое понимание подкреплено Священным Писанием, где сказано: «Помни субботний день и освящай его. Шесть дней работай и делай все свои дела, а седьмой день — суббота Господу, твоему Богу»)

Именно такой порядок дней вы видите в календарях России (однако до тех пор, пока не начали бесноваться безбожники СССР), в странах обоих Америк, Японии, Израиля и пр. стран.

Три дня до среды, среда и три дня после среды составляют седмицу. Вот, смотрите как симметрично! 3 + 1 + 3 = 7

А у вас получается, что середина недели — четверг, среда куда-то набок съехала, якобы нашли ошибку в Писании, а логика, что вторник — это день №2, намекает на то, что и длины вы измеряете не от 0 см, а от 1 см! (Хотя такого может и не быть! Парадокс! Однако не удивительно, что вы говорили о взаимозаменяемости времени и расстояния!)

Цитата:

Сообщение от Блондинка
список с одной опцией,

Цитата:

Сообщение от Русский
вопрос насчёт вторника

Знаете ли, когда кухарка либо дворник либо ещё какой человек не посоветовавшись лезет в дела неподвластные его уму, то не достойно ли это лучшего комедийного представления?

Блондинка 28.07.2019 02:12

Malleys,
после революции был советский календарь с пятидневной неделей, в настоящее время страны СНГ пользуются календарём с первым днем недели понедельник, и от этого никуда не деться...

скрипт в предыдущем посте работает

Блондинка 28.07.2019 02:17

вот приемлимое для меня решение

document.addEventListener('DOMContentLoaded', function() {
    var d = new Date(),
        days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" ");
    
    document.querySelector('#day').textContent = days[d.getDay()];
    document.querySelector('#day_01').options[d.getDay()||7].selected = true;
    document.querySelector('#day_02').value = d.getDay()
    document.querySelector('#date').options[d.getDate()-1].selected = true;
    document.querySelector('#date_01').value = d.getDate();
    document.querySelector('#month').options[d.getMonth()].selected = true;
    document.querySelector('#year').value = d.getFullYear();
});


для 3-5 строчки этого кода использовать следующий html

<select><option id="day"></option></select>

Malleys 28.07.2019 07:18

Цитата:

Сообщение от Блондинка
вот приемлемое для меня решение

Оно не может быть приемлемым для вас, поскольку вы используете элементы управления, и при изменении не происходит перерасчёта дня недели!

По сути вы просто один раз выводите дату и всё! Таким образом, если вы всё-таки примените, то что я вам написал (а именно то, что вместо <select><option id="day"></option></select> вам следует использовать текстовый узел), то вывод даты станет приемлемым!

Цитата:

Сообщение от Блондинка
для 3-5 строчки этого кода использовать следующий html

<select><option id="day"></option></select>

Читайте внимательно, что вам написал ранее, там уже было написано, как решить вашу проблему! Решение — используйте текстовый узел (text node)!

<body>
<script>
var days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" ");
var monthes = "января февраля марта апреля мая июня июля августа сентября октября ноября декабря".split(" ");
var date = new Date();
var textNode = document.createTextNode(days[date.getDay()] + ", " + date.getDate() + " " + monthes[date.getMonth()] + " " + date.getFullYear() + " года.");
document.body.appendChild(textNode);
</script>

Блондинка 28.07.2019 12:35

Malleys,
ну незнаю как ещё объяснить, есть форма с двумя списками для даты и месяца и полем ввода, в эту форму надо добавить текстовый узел выводящий день недели, но с помощью стилей изменить внешний вид этого текстового узла, чтобы он визуально не отличался от списка...

Malleys 28.07.2019 13:03

Цитата:

Сообщение от Блондинка
ну не знаю как ещё объяснить, есть форма с двумя списками для даты и месяца и полем ввода, в эту форму надо добавить текстовый узел выводящий день недели, но с помощью стилей изменить внешний вид этого текстового узла, чтобы он визуально не отличался от списка...

Вам уже такое сделали — сообщение №39. Хотя с точки зрения конечного пользователя здесь странно именно то, что день недели написан на кнопке, запускающей раскрывающийся список! Вам ведь на самом деле такой плохой UX не нужен!

Вот мой вариант — последняя часть сообщения №67 Вы можете поменять стили, как хотите! (Например, что вам стоит добавить такую же закруглённую рамку для дня недели, как в том примере это сделано у <input> и <select>?)

Блондинка 28.07.2019 14:47

Malleys,
пост 74, можно использовать
<span id="day">
и внутрь поместить див с нулевой высотой/шириной задать диву рамку 3-5 пикселей и левую правую нижнюю рамку сделать прозрачной, тем самым нарисовав треугольник, типа как в списке, но надо чтобы этот треугольник не отличался визуально от аналогичного в селекте, а он сильно различается в разных браузерах...

Malleys 28.07.2019 15:12

Цитата:

Сообщение от Блондинка
Malleys, пост 74, можно использовать

Вы пишете так, как будто это у меня что-то не получается! Если вы знаете как делать, то делайте!

Цитата:

Сообщение от Блондинка
но надо чтобы этот треугольник не отличался визуально от аналогичного в селекте, а он сильно различается в разных браузерах...

Можно, чтобы не отличался!
<span id="day">Воскресенье</span>
<style>
  #day {
    -webkit-appearance: menulist;
    padding-right: 1em;
  }
</style>


Только зачем вам эта стрелка? Это же не всплывающий список!

Блондинка 28.07.2019 16:46

Malleys,
не во всех браузерах это сработает, в том числе и в Habbit browser, который ты когда то скачал...
Цитата:

Сообщение от Malleys
Только зачем вам эта стрелка? Это же не всплывающий список!

захотелось чтобы элементы спан и селект в которых отображается составляющие дату визуально не отличалось, поэтому я и подумала почему бы не использовать html из 74 поста...

Malleys 28.07.2019 17:17

Цитата:

Сообщение от Блондинка
не во всех браузерах это сработает, в том числе и в Habbit browser, который ты когда то скачал...

Ну вообще-то в нём тоже работает, и в Firefox и в Chrome и в Safari (и хотя в Edge в консоли показывает как правильное свойство, оно визуально никак не отличается от простого текста!)...

Цитата:

Сообщение от Блондинка
чтобы элементы спан и селект в которых отображается составляющие дату визуально не отличалось, поэтому я и подумала почему бы не использовать html из 74 поста

А зачем тогда разные названия?

Вы ещё можете использовать треугольник ▼.

<span id="day">Воскресенье ▼</span>


Цитата:

Сообщение от Русский
Остаётся только ответить вопрос, почему же дни именуются не с начала седмицы, середина которой - среда, а с понедельника

Дни как раз таки именуются от недѣли, начала седмицы. Недѣля — точка отсчёта. По прошествий одного дня с недѣли получается понедѣльникъ, по прошествий двух дней с недѣли получается вторникъ, по прошествий четырёх дней с недѣли получается четвергъ и т.д. ((Например, тогда получается, что во вторникъ днём с начала седмицы прошло 2 дня и ещё столько-то часов вторника))

Если говорить о неделе, начало которой в понедельник, то получается, что точка отсчёта — понедельник. И тогда получается, что по прошествии одного дня с понедельника получается вторник, по прошествий трёх дней с понедельника получается четверг, и т.д. Что как раз таки не логично, поэтому стали использовать порядковые числительные для объяснения такой недели. Т. е. второй день — вторник, четвёртый день — четверг, и т.д. (Например, тогда получается, что во вторник днём с начала недели прошёл 1 день и ещё столько-то часов вторника)

Цитата:

Сообщение от Русский
А ей использовать код на ES6 религия не позволяет.

Вы перепутали религию с браузером Habit!

Блондинка 04.08.2019 03:23

Цитата:

Сообщение от laimas
Да, либо поставить опции списка в том же порядке, что возвращает функция getDay(), либо использовать наш порядок, но уменьшая индекс на 1:

document.querySelector('#day_01').options[(d.getDay()||7)-1].selected = true;

laimas, а тут где нужно изменить порядок дней, полночи пробую методом тыка, пока безрезультатно
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Calendar</title>
</head>
<body>
<style>
.month, .month.vert .week, .day { display:inline-block; }
.month.vert .day { display:block; }
.day { border: 1px solid #ccc; width: 30px; line-height: 30px; text-align: center; margin: 1px; }
</style>
<div class="month"></div>
<script>
var calendar = {
update: function (year, month) {
this.days.length = 7;
var stepDay = new Date(year, month, 1);
stepDay.setDate(1 - stepDay.getDay());
var lastDay = new Date(year, month + 1, 0);
lastDay.setDate(lastDay.getDate() + 6 - lastDay.getDay());
while (stepDay <= lastDay) {
this.days.push(stepDay.getDate());
stepDay.setHours(24);
}
},
render: function () {
var html = '';
for (var i = 0, j = 0; i < this.days.length; j = ++i % 7) {
if (j == 0) html += '<div class="week">';
html += '<div class="day">' + this.days[i] + '</div>';
if (j == 6) html += '</div>';
}
this.element.innerHTML = html;
},
toggle: function () {
this.element.classList.toggle('vert');
}
};
var today = new Date, thisYear = today.getFullYear(), thisMonth = today.getMonth();
calendar.days = ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'];
 
calendar.element = document.querySelector('.month');
calendar.element.addEventListener('click', function () { calendar.toggle() });
calendar.update(thisYear, thisMonth);
calendar.render();
</script>
</body>
</html>

рони 04.08.2019 09:09

Блондинка,
вам дали алгоритм тут
Цитата:

Сообщение от Rise
step.setHours(24 * (0 - (step.getDay() + 6) % 7)); last.setHours(24 * (6 - (last.getDay() + 6) % 7));

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Calendar</title>
  </head>
  <body>
    <style>
      .month,
      .month.vert .week,
      .day {
        display: inline-block;
      }
      .month.vert .day {
        display: block;
      }
      .day {
        border: 1px solid #ccc;
        width: 30px;
        line-height: 30px;
        text-align: center;
        margin: 1px;
      }
    </style>
    <div class="month"></div>
    <script>
      var calendar = {
        update: function(year, month) {
          this.days.length = 7;
          var stepDay = new Date(year, month, 1);
          stepDay.setDate(stepDay.getDate() + 0 - ((stepDay.getDay() + 6) % 7));
          var lastDay = new Date(year, month + 1, 0);
          lastDay.setDate(lastDay.getDate() + 6 - ((lastDay.getDay() + 6) % 7));
          while (stepDay <= lastDay) {
            this.days.push(stepDay.getDate());
            stepDay.setHours(24);
          }
        },
        render: function() {
          var html = '';
          for (var i = 0, j = 0; i < this.days.length; j = ++i % 7) {
            if (j == 0) html += '<div class="week">';
            html += '<div class="day">' + this.days[i] + '</div>';
            if (j == 6) html += '</div>';
          }
          this.element.innerHTML = html;
        },
        toggle: function() {
          this.element.classList.toggle('vert');
        },
      };
      var today = new Date(),
        thisYear = today.getFullYear(),
        thisMonth = today.getMonth();
      calendar.days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];

      calendar.element = document.querySelector('.month');
      calendar.element.addEventListener('click', function() {
        calendar.toggle();
      });
      calendar.update(thisYear, thisMonth);
      calendar.render();
    </script>
  </body>
</html>

рони 04.08.2019 10:09

Блондинка,
можно так ...
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Calendar</title>
  </head>
  <body>
    <style>

      .day {
        border: 1px solid #ccc;
        width: 30px;
        line-height: 30px;
        text-align: center;
        margin: 1px;
        background-color: #B0C4DE;
      }
      .month {
          display: flex;
          flex-wrap:wrap;
          width: 238px;
          height: 238px;
          justify-content: space-around;
          margin: 30px auto;
      }
      .month.vert{
          flex-direction: column;
      }
      .day:nth-child(7n + 6), .day:nth-child(7n + 7){
         background-color:  #FF85C6;
      }
      .day:nth-child(-n + 7) {
          color: #FFFFFF;
      }

    </style>
    <div class="month"></div>
    <script>
      var calendar = {
        update: function(year, month) {
          var stepDay = new Date(year, month, 1);
          stepDay.setDate(stepDay.getDate() - ((stepDay.getDay()||7) - 1));
          var lastDay = new Date(stepDay);
          lastDay.setDate(lastDay.getDate() + 41);
          while (stepDay <= lastDay) {
            this.days.push(stepDay.getDate());
            stepDay.setHours(24);
          }
        },
        render: function() {
          var html = '';
          for (var i = 0; i < this.days.length; i++) {
            html += '<div class="day">' + this.days[i] + '</div>';
          }
          this.element.innerHTML = html;
        },
        toggle: function() {
          this.element.classList.toggle('vert');
        },
      };
      var today = new Date(),
        thisYear = today.getFullYear(),
        thisMonth = today.getMonth();
      calendar.days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];

      calendar.element = document.querySelector('.month');
      calendar.element.addEventListener('click', function() {
        calendar.toggle();
      });
      calendar.update(thisYear, thisMonth);
      calendar.render();
    </script>
  </body>
</html>

Блондинка 04.08.2019 15:03

рони,
как то не очень с этими строчками
var lastDay = new Date(stepDay);
          lastDay.setDate(lastDay.getDate() + 41);

слишком много дней следующего месяца показано

рони 04.08.2019 17:02

Цитата:

Сообщение от Блондинка
слишком много дней следующего месяца показано

зато всегда одинаково квадрат 7 * 7 = 49 как в W10 :)

Блондинка 04.08.2019 17:50

рони,
вариант в 83 посте как то лучше, ведь можно стилями задать фиксированную высоту и ширину, а ячейки будут менять размеры взависимости от количества строк и колонок...

рони,
а такой вопрос, в 83 посте как сделать чтобы при загрузке страницы сначала отображался вертикальный вариант

рони 04.08.2019 17:59

Цитата:

Сообщение от Блондинка
а такой вопрос, в 83 посте как сделать чтобы при загрузке страницы сначала отображался вертикальный вариант

строка 25 добавить класс vert
<div class="month vert"></div>

Блондинка 05.08.2019 14:50

Цитата:

Сообщение от Malleys
чтобы выбрать дату, вы можете...
использовать <input type="date">

мне кажется что в календаре целесообразнее использовать поле с другим типом, например <input type="month">

Блондинка 05.08.2019 15:08

как правильно использовать input type month и как установить переключение с дива на кнопку?
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Calendar</title>
  </head>
  <body>
    <style>
      #calendar { width: 238px; height: 270px; padding: 3px; border: 1px solid #a9a9a9; }
      #navigation_panel { width: 228px; padding: 3px; margin-bottom: 3px; border: 1px solid #a9a9a9; display: inline-block; }
      .month,
      .month.vert .week,
      .day {
        display: inline-block;
      }
      .month.vert .day {
        display: block;
      }
      .day {
        border: 1px solid #a9a9a9;
        width: 30px;
        line-height: 30px;
        text-align: center;
        margin: 1px;
      }
        input[type=month] { backgroud-color: #ffffff; border: 1px solid #a9a9a9; }
        #switching { background-color: #fff; border: 1px solid #a9a9a9; }
    </style>
    <div id="calendar">
    <div id="navigation_panel">
    <input type="month">
    <button id="switching">⇘</button>
    </div>
    <div class="month vert"></div>
    <script>
      var calendar = {
        update: function(year, month) {
          this.days.length = 7;
          var stepDay = new Date(year, month, 1);
          stepDay.setDate(stepDay.getDate() + 0 - ((stepDay.getDay() + 6) % 7));
          var lastDay = new Date(year, month + 1, 0);
          lastDay.setDate(lastDay.getDate() + 6 - ((lastDay.getDay() + 6) % 7));
          while (stepDay <= lastDay) {
            this.days.push(stepDay.getDate());
            stepDay.setHours(24);
          }
        },
        render: function() {
          var html = '';
          for (var i = 0, j = 0; i < this.days.length; j = ++i % 7) {
            if (j == 0) html += '<div class="week">';
            html += '<div class="day">' + this.days[i] + '</div>';
            if (j == 6) html += '</div>';
          }
          this.element.innerHTML = html;
        },
        toggle: function() {
          this.element.classList.toggle('vert');
        },
      };
      var today = new Date(),
        thisYear = today.getFullYear(),
        thisMonth = today.getMonth();
      calendar.days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс'];

      calendar.element = document.querySelector('.month');
      calendar.element.addEventListener('click', function() {
        calendar.toggle();
      });
      calendar.update(thisYear, thisMonth);
      calendar.render();
    </script>
  </div>
  </body>
</html>

Блондинка 05.08.2019 23:31

рони,
может подскажешь, есть ли на форуме реализация не вертикально-горизонтального, а только вертикального календаря?

для сайта мне достаточно одного гоизонтального календаря, а вертикальный меня заинтересовал, чтобы на одной странице можно было разместить календарь на месяц и на год, а потом просто просто сохранить скриншот и распечатать на бумаге формата а4

рони 05.08.2019 23:52

Блондинка,
не могу подсказать

Блондинка 06.08.2019 00:39

кто подскажет, сложно ли сгенерировать сетку вертикального календаря на текущий месяц с помощью таблицы?

Блондинка 10.08.2019 00:58

1.) кто может сделать вертикальный календарь ?

2.) есть ли css свойство у технологии flexbox анолигичное border-spacing для таблиц ?

Блондинка 10.08.2019 01:18

бюджет то найдется,
на дивах или таблица? на карточку можно оплатить?

Блондинка 11.08.2019 07:21

Цитата:

Сообщение от laimas
Должно быть так:

01
document.addEventListener('DOMContentLoaded', function() {
02
    var d = new Date(),
03
        days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" ");
04
     
05
    document.querySelector('#day').textContent = days[d.getDay()];
06
    document.querySelector('#day_01').options[d.getDay()||7].selected = true;
07
    document.querySelector('#day_02').value = d.getDay()
08
    document.querySelector('#date').options[d.getDate()-1].selected = true;
09
    document.querySelector('#date_01').value = d.getDate();
10
    document.querySelector('#month').options[d.getMonth()].selected = true;
11
    document.querySelector('#year').value = d.getFullYear();
12
});


Здесь объявлены две переменные d и days, через запятую, хотя можно написать и так:

var d = new Date();
var days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split(" ");

что я делаю не так? попыталась в соответствующие блоки вставить компоненты даты, но ничего не получается

;
   });
  </script>
 </head>
 <body>
  <div id="hours"></div>
  <div id="minutes"></div>
  <div id="seconds"></div>
  <div id="day"></div>
  <div id="date"></div>
  <div id="month"></div>
  <div id="month_name"></div>
  <div id="year"></div>
 </body>
</html>]

Блондинка 11.08.2019 18:03

на этом форуме кто нибудь может объяснить как в элементы с определенными id вставить соответствующие компоненты даты? при наличии такого hrml-кода...
<!DOCTYPE html>
<html lang="ru">
 <head>
  <meta charset="utf-8">
  <title></title>
  <style>
   div {
    font: 14px serif;
    border: 1px solid #ccc;
    padding: 5px;
    margin-bottom: 5px;
    text-align: center;
   }
  </<style>
  <script>
   document.addEventListener('DOMContentLoader', function() {
   var d = new Date();
   var days = "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота".split("  ");
   document.querySelector('day').textContent = daus[
   d.getDay()];
   });
  </script>
 </head>
 <body>
  <div id="hours"></div>
  <div id="minutes"></div>
  <div id="seconds"></div>
  <div id="day"></div>
  <div id="date"></div>
  <div id="month"></div>
  <div id="month_name"></div>
  <div id="year"></div>
 </body>
</html>


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