Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   помогите доработать календарь (https://javascript.ru/forum/misc/78011-pomogite-dorabotat-kalendar.html)

Блондинка 13.07.2019 14:35

помогите доработать календарь
 
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
		<meta http-equiv="x-ua-compatible" content="ie=edge">
		<title>тест-календарь</title>
		<style>
			table {
				border-collapse: separate;
				width: 300px;
                               padding: 1px;
                               }
			table, th, td {
				border: 1px solid #c0c0c0;
			margin: 1px; 
                        }
			td {
				text-align: center;
			}
			.wrapper {
				margin-top: 20px;
			}
			.anotherMonthWeek {
				background-color: #ffffff;
				color: #00bfff;

			}
			.anotherMonthWeekEnd {
				background-color: #ffffff;
				color: #f08080;
			}
			.currentMonthWeek {
				background-color: #fff0f5;
color: #0000cd;
			}
			.currentMonthWeekEnd {
				background-color: #ffb6c1;
				color: #dc143c;
			}
			.currentMonthWeekToday {
				background-color: #0000cd;
				color: #fff0f5;
			}
			.currentMonthWeekEndToday {
				background-color: #dc143c;
				color: #ffb6c1;
			}
		</style>
	</head>
	<body>
		<form name="formDate">
			<label for="inpDate">Укажите дату:</label>
			<input type="date" id="inpDate" name="inpDate">
		</form>
		<div class="wrapper" id="wrapper"></div>
		<script>
			var wrapper = document.getElementById("wrapper");
			var form = document.forms.formDate;
			if(wrapper && form){
				form.addEventListener('change', function(event){
					var date = form.inpDate.valueAsDate;
					if(date){
						date.setDate(1);
						date.setHours(0);
						date.setSeconds(0);
						date.setMilliseconds(0);
						var date2 = new Date(date.getTime());
						var month = date.getMonth();
						while(date.getDay() != 1){ date.setDate(date.getDate()-1); }
						date2.setMonth(date2.getMonth()+1);
						date2.setDate(1);
						date2.setHours(0);
						date2.setSeconds(0);
						date2.setMilliseconds(0);
						var trs = Math.ceil((date2-date)/1000/3600/24/7)+1;
						var table = document.createElement('table');
						var i = 0;
						var daysPerWeek = 7;
						while(i<trs){
							var tr = document.createElement('tr');
							if(i == 0){
								for(var j=0; j<daysPerWeek; j++){
									var th = document.createElement('th');
									th.innerText = getShortNameOfDay(j);
									tr.appendChild(th);
								}
								table.appendChild(tr);
							}
							else{
								for(var j=0; j<daysPerWeek; j++){
									var td = document.createElement('td');
									if(date.getMonth() == month){ 
										if(date.getDay() == 0 ||  date.getDay() == 6){
											td.className = "currentMonthWeekEnd";
										}
										else{
											td.className = "currentMonthWeek";
										}
									}
									else {
										if(date.getDay() == 0 ||  date.getDay() == 6){
											td.className = "anotherMonthWeekEnd";
										}
										else{
											td.className = "anotherMonthWeek";
										}
									}
									td.innerText = date.getDate();
									date.setDate(date.getDate() + 1);
									tr.appendChild(td);
									table.appendChild(tr);
								}
							}
							i++;
						}
						wrapper.innerHTML = "";
						wrapper.appendChild(table);
					}
				});
				form.inpDate.valueAsDate = new Date();
				var event = new Event('change');
				form.dispatchEvent(event);
			}
			function getShortNameOfDay(x){
				var name = "xx";
				switch(x){
					case 0: name = "Пн"; break;
					case 1: name = "Вт"; break;
					case 2: name = "Ср"; break;
					case 3: name = "Чт"; break;
					case 4: name = "Пт"; break;
					case 5: name = "Сб"; break;
					case 6: name = "Вс"; 
				}
				return name;
			}
		</script>
	</body>
</html>

Блондинка 13.07.2019 14:41

надо подсветить дни недели, сегодн число и сегодн день недели

рони 13.07.2019 16:20

Блондинка,
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>тест-календарь</title>
        <style>
            table {
                border-collapse: separate;
                width: 300px;
                               padding: 1px;
                               }
            table, th, td {
                border: 1px solid #c0c0c0;
            margin: 1px;
                        }
            td {
                text-align: center;
            }
            .wrapper {
                margin-top: 20px;
            }
            .anotherMonthWeek {
                background-color: #ffffff;
                color: #00bfff;

            }
            .anotherMonthWeekEnd {
                background-color: #ffffff;
                color: #f08080;
            }
            .currentMonthWeek {
                background-color: #fff0f5;
color: #0000cd;
            }
            .currentMonthWeekEnd {
                background-color: #ffb6c1;
                color: #dc143c;
            }
            .currentMonthWeekToday {
                background-color: #0000cd;
                color: #fff0f5;
            }
            .currentMonthWeekEndToday {
                background-color: #dc143c;
                color: #ffb6c1;
            }
            .currentDay{

                background-color: #228B22;
                color: #FFFFFF;
            }
            #wrapper th{
                background-color: #EEE8AA;
            }
            #wrapper th.currentDay{
                 border-bottom: 3px solid #228B22;
                 color: #000000;
            }
        </style>
    </head>
    <body>
        <form name="formDate">
            <label for="inpDate">Укажите дату:</label>
            <input type="date" id="inpDate" name="inpDate">
        </form>
        <div class="wrapper" id="wrapper"></div>
        <script>
            var wrapper = document.getElementById("wrapper");
            var form = document.forms.formDate;
            if(wrapper && form){
                form.addEventListener('change', function(event){
                    var date = form.inpDate.valueAsDate;
                    if(date){
                        var current = new Date();
                            current.setHours(0,0,0,0);
                        date.setDate(1);
                        date.setHours(0);
                        date.setSeconds(0);
                        date.setMilliseconds(0);
                        var date2 = new Date(date.getTime());
                        var month = date.getMonth();
                        while(date.getDay() != 1){ date.setDate(date.getDate()-1); }
                        date2.setMonth(date2.getMonth()+1);
                        date2.setDate(1);
                        date2.setHours(0);
                        date2.setSeconds(0);
                        date2.setMilliseconds(0);
                        var trs = Math.ceil((date2-date)/1000/3600/24/7)+1;
                        var table = document.createElement('table');
                        var i = 0;
                        var daysPerWeek = 7;
                        while(i<trs){
                            var tr = document.createElement('tr');
                            if(i == 0){
                                for(var j=0; j<daysPerWeek; j++){
                                    var th = document.createElement('th');
                                    th.innerText = getShortNameOfDay(j);
                                    tr.appendChild(th);
                                }
                                table.appendChild(tr);
                            }
                            else{
                                for(var j=0; j<daysPerWeek; j++){
                                    var td = document.createElement('td');
                                    if(date.getMonth() == month){
                                        if(date.getDay() == 0 ||  date.getDay() == 6){
                                            td.className = "currentMonthWeekEnd";
                                        }
                                        else{
                                            td.className = "currentMonthWeek";
                                        }
                                    }
                                    else {
                                        if(date.getDay() == 0 ||  date.getDay() == 6){
                                            td.className = "anotherMonthWeekEnd";
                                        }
                                        else{
                                            td.className = "anotherMonthWeek";
                                        }
                                    }
                                    if(date.getTime() == current.getTime()) {
                                        td.className = "currentDay";
                                        table.querySelectorAll("th")[j].className = "currentDay"
                                    }



                                    td.innerText = date.getDate();
                                    date.setDate(date.getDate() + 1);
                                    tr.appendChild(td);
                                    table.appendChild(tr);
                                }
                            }
                            i++;
                        }
                        wrapper.innerHTML = "";
                        wrapper.appendChild(table);
                    }
                });
                form.inpDate.valueAsDate = new Date();
                var event = new Event('change');
                form.dispatchEvent(event);
            }
            function getShortNameOfDay(x){
                var name = "xx";
                switch(x){
                    case 0: name = "Пн"; break;
                    case 1: name = "Вт"; break;
                    case 2: name = "Ср"; break;
                    case 3: name = "Чт"; break;
                    case 4: name = "Пт"; break;
                    case 5: name = "Сб"; break;
                    case 6: name = "Вс";
                }
                return name;
            }
        </script>
    </body>
</html>

Блондинка 14.07.2019 00:46

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

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

т.е. подсветить пн-пт и сб вс разными цветами, а сег день недели, тоже двумя разнымм цветами, в зависимости от того будний или выходной...

Блондинка 14.07.2019 04:52

P. S. и возможно ли добавить кнопку, что-то типа

<input type="month" id="inpDate" name="inpDate">
                        <button type="button">сегодня</button>


которая будет скрыта (display none) по умолчанию (при просмотре такущего месяца), и показывается только при просмотре предыдущих/будущих месяцев, и при клике на которую дата возвращается к сегодняшней, тоесть чтобы не прокручивать дату назад на 30-50 лет, а в один клик вернуться к сегодн месяцу.

рони 14.07.2019 08:26

Блондинка,
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>тест-календарь</title>
        <style>
            table {
                border-collapse: separate;
                width: 300px;
                               padding: 1px;
                               }
            table, th, td {
                border: 1px solid #c0c0c0;
            margin: 1px;
                        }
            td {
                text-align: center;
            }
            .wrapper {
                margin-top: 20px;
            }
            .anotherMonthWeek {
                background-color: #ffffff;
                color: #00bfff;

            }
            .anotherMonthWeekEnd {
                background-color: #ffffff;
                color: #f08080;
            }
            .currentMonthWeek {
                background-color: #fff0f5;
                color: #0000cd;
            }
            .currentMonthWeekEnd {
                background-color: #ffb6c1;
                color: #dc143c;
            }
            .currentMonthWeekToday {
                background-color: #0000cd;
                color: #fff0f5;
            }
            .currentMonthWeekEndToday {
                background-color: #dc143c;
                color: #ffb6c1;
            }
            .currentDay{
                background-color: #228B22;
                color: #FFFFFF;
            }
            #wrapper th{
                background-color: #EEE8AA;
                color: #000000;
            }
            #wrapper th:nth-child(n+6){
                background-color: #EE82EE;
            }
            #wrapper th.currentDay{
                border-bottom: 3px solid #228B22;
                color: #000000;
            }
            #wrapper th:nth-child(n+6).currentDay{
                border-bottom: 3px solid #FF1493;
                color: #000000;
            }
            #wrapper td:nth-child(n+6).currentDay{
                background-color: #FF1493;
                color: #FFFFFF;
            }
            button.current.hide{
                display: none;
            }

        </style>
    </head>
    <body>
        <form name="formDate">
            <label for="inpDate">Укажите дату:</label>
            <input type="date" id="inpDate" name="inpDate">
            <button type="button" class="current hide">сегодня</button>
        </form>
        <div class="wrapper" id="wrapper"></div>
        <script>
            var wrapper = document.getElementById("wrapper");
            var form = document.forms.formDate;
            var button = document.querySelector("button.current");
            function createTable(event){
                    var date = form.inpDate.valueAsDate;
                    if(button) button.classList.remove("hide");
                    if(date){
                        var current = new Date();
                            current.setHours(0,0,0,0);
                        date.setDate(1);
                        date.setHours(0);
                        date.setSeconds(0);
                        date.setMilliseconds(0);
                        var date2 = new Date(date.getTime());
                        var month = date.getMonth();
                        while(date.getDay() != 1){ date.setDate(date.getDate()-1); }
                        date2.setMonth(date2.getMonth()+1);
                        date2.setDate(1);
                        date2.setHours(0);
                        date2.setSeconds(0);
                        date2.setMilliseconds(0);
                        var trs = Math.ceil((date2-date)/1000/3600/24/7)+1;
                        var table = document.createElement('table');
                        var i = 0;
                        var daysPerWeek = 7;
                        while(i<trs){
                            var tr = document.createElement('tr');
                            if(i == 0){
                                for(var j=0; j<daysPerWeek; j++){
                                    var th = document.createElement('th');
                                    th.innerText = getShortNameOfDay(j);
                                    tr.appendChild(th);
                                }
                                table.appendChild(tr);
                            }
                            else{
                                for(var j=0; j<daysPerWeek; j++){
                                    var td = document.createElement('td');
                                    if(date.getMonth() == month){
                                        if(date.getDay() == 0 ||  date.getDay() == 6){
                                            td.className = "currentMonthWeekEnd";
                                        }
                                        else{
                                            td.className = "currentMonthWeek";
                                        }
                                    }
                                    else {
                                        if(date.getDay() == 0 ||  date.getDay() == 6){
                                            td.className = "anotherMonthWeekEnd";
                                        }
                                        else{
                                            td.className = "anotherMonthWeek";
                                        }
                                    }
                                    if(date.getTime() == current.getTime()) {
                                        td.className = "currentDay";
                                        table.querySelectorAll("th")[j].className = "currentDay";
                                        if(button) button.classList.add("hide");
                                    }



                                    td.innerText = date.getDate();
                                    date.setDate(date.getDate() + 1);
                                    tr.appendChild(td);
                                    table.appendChild(tr);
                                }
                            }
                            i++;
                        }
                        wrapper.innerHTML = "";
                        wrapper.appendChild(table);
                    }
                };
            function setToday()
            {
                form.inpDate.valueAsDate = new Date();
                var event = new Event('change');
                form.dispatchEvent(event);
            }
           if(wrapper && form){
                form.addEventListener('change', createTable);
                button && button.addEventListener("click", setToday);
                setToday()
            }
            function getShortNameOfDay(x){
                var name = "xx";
                switch(x){
                    case 0: name = "Пн"; break;
                    case 1: name = "Вт"; break;
                    case 2: name = "Ср"; break;
                    case 3: name = "Чт"; break;
                    case 4: name = "Пт"; break;
                    case 5: name = "Сб"; break;
                    case 6: name = "Вс";
                }
                return name;
            }
        </script>
    </body>
</html>

Блондинка 15.07.2019 02:47

рони, всё супер, надеюсь что если изменить тип поля с input type data на input type month это не повлияет на работу скрипта...

Rise 15.07.2019 17:22

Блондинка, что-то я не понял в чем прикол, в поле date там встроенный календарь имеется, а внизу у вас еще один, это зачем так?

Блондинка 16.07.2019 08:47

Rise, не совсем поняла ваш вопрос, там только одно поле и одна кнопка, и я спросила, изменение типа поля, type data на type month не повлияет на работу скрипта?

Rise 16.07.2019 09:09

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

Блондинка 17.07.2019 10:06

Rise,
В смысле, зачем сетка календаря на месяц, я правильно сформулировала ваш вопрос?

рони 17.07.2019 11:57

Блондинка,
в теге input есть свой календарь, зачем ещё один, спрашивает Rise?

Rise 17.07.2019 12:22

Блондинка,
Может тебе не очевидно, если Chrome, там у input справа есть значок стрелки на клик по которому появляется сетка календаря для выбора даты, почти такая же, как у тебя, здесь можешь посмотреть. Только твой календарь не для выбора (ввода) даты, а для вывода, но вывод даты есть в input. Так зачем нужно еще одно место вывода в виде своей сетки календаря, если визуально никакой новой информации она не несет?

Блондинка 19.07.2019 13:26

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

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


Вот немного поправила стили и html...

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <title>тест-календарь</title>
        <style>
        body {
                width: 350px;

                }
        #calendar {
                width: 320px;
                padding: 5px;
                margin: 5px;
                                border: 1px solid #a9a9a9;
                border-radius: 6px/4px;
        }
        input[type=month] {
                width: 100%;
                                border: 1px solid #a9a9a9;
                border-radius: 6px/4px;
                text-align: center;
        }
            table {
                border-collapse: separate;
                width: 100%;
                               padding: 1px;
                               }
                table, th, td {
                border: 1px solid #a9a9a9;
                border-radius: 6px/4px;
            margin: 1px;
                        }
            th, td {
                text-align: center;
            }
            .wrapper {
                margin-top: 5px;
            }
            .anotherMonthWeek {
                background-color: #e6f5ff;
                color: #9ed9ff;
                border: 1px solid #dcdcdc;
            } /* дата будние дни другой месяц */
            .anotherMonthWeekEnd {
                background-color: #fff5fa;
                color: #ffb8db;
                border: 1px solid #dcdcdc;
            } /* дата выходные дни другой месяц */
            .currentMonthWeek {
                background-color: #def1ff;
                color: #0091ff;
            }
            .currentMonthWeekEnd {
                background-color: #ffc3d7;
                color: #dc143c;
            } /* дата выходные дни */
            .currentDay{
                background-color: #c2d6ff;
                border: 1px solid #0000ff;
                font-weight: bold;
                color: #ffffff;
                text-shadow: 1px 1px #0000ff, -1px 1px #0000ff, 1px -1px #0000ff, -1px -1px #0000ff, 1px 0px #0000ff, 0px 1px #0000ff, -1px 0px #0000ff, 0px -1px #0000ff;
            }
            #wrapper th {
                background-color: #c2d6ff;
                color: #0069ff;
            }
            #wrapper th:nth-child(n+6){
                background-color: #ffb4d2;
                color: #b92346;
            } /* дни недели выходные дни */
                #wrapper th.currentDay {
                        border: 1px solid #285fcd;
                background-color: #6b9cff;
                color: #E6f5ff;
                text-shadow: 1px 1px #285fcd, -1px 1px #285fcd, 1px -1px #285fcd, -1px -1px #285fcd, 1px 0px #285fcd, 0px 1px #285fcd, -1px 0px #285fcd, 0px -1px #285fcd;
            }
            #wrapper th:nth-child(n+6).currentDay{
                border: 1px solid #b92346;
                background-color: #ff73a0;
                color: #ffafc8;
                text-shadow: 1px 1px #b92346, -1px 1px #b92346, 1px -1px #b92346, -1px -1px #b92346, 1px 0px #b92346, 0px 1px #b92346, -1px 0px #b92346, 0px -1px #b92346;
            }
            #wrapper td:nth-child(n+6).currentDay{
                background-color: #ff85ad;
                border: 1px solid #ff0000;
                font-weight: bold;
                color: #ffffff;
                text-shadow: 1px 1px #ff0000, -1px 1px #ff0000, 1px -1px #ff0000, -1px -1px #ff0000, 1px 0px #ff0000, 0px 1px #ff0000, -1px 0px #ff0000, 0px -1px #ff0000;
            }
            button.current.hide {
                display: none;
            }
            button {
                width: 100%;
                                border: 1px solid #a9a9a9;
                border-radius: 6px/4px;
            }
        </style>
    </head>
    <body>
    <div id="calendar">
        <form name="formDate">
            <input type="month" id="inpDate" name="inpDate">
            <button type="button" class="current hide">сегодня</button>
        </form>
        <div class="wrapper" id="wrapper"></div>
        <script>
            var wrapper = document.getElementById("wrapper");
            var form = document.forms.formDate;
            var button = document.querySelector("button.current");
            function createTable(event){
                    var date = form.inpDate.valueAsDate;
                    if(button) button.classList.remove("hide");
                    if(date){
                        var current = new Date();
                            current.setHours(0,0,0,0);
                        date.setDate(1);
                        date.setHours(0);
                        date.setSeconds(0);
                        date.setMilliseconds(0);
                        var date2 = new Date(date.getTime());
                        var month = date.getMonth();
                        while(date.getDay() != 1){ date.setDate(date.getDate()-1); }
                        date2.setMonth(date2.getMonth()+1);
                        date2.setDate(1);
                        date2.setHours(0);
                        date2.setSeconds(0);
                        date2.setMilliseconds(0);
                        var trs = Math.ceil((date2-date)/1000/3600/24/7)+1;
                        var table = document.createElement('table');
                        var i = 0;
                        var daysPerWeek = 7;
                        while(i<trs){
                            var tr = document.createElement('tr');
                            if(i == 0){
                                for(var j=0; j<daysPerWeek; j++){
                                    var th = document.createElement('th');
                                    th.innerText = getShortNameOfDay(j);
                                    tr.appendChild(th);
                                }
                                table.appendChild(tr);
                            }
                            else{
                                for(var j=0; j<daysPerWeek; j++){
                                    var td = document.createElement('td');
                                    if(date.getMonth() == month){
                                        if(date.getDay() == 0 ||  date.getDay() == 6){
                                            td.className = "currentMonthWeekEnd";
                                        }
                                        else{
                                            td.className = "currentMonthWeek";
                                        }
                                    }
                                    else {
                                        if(date.getDay() == 0 ||  date.getDay() == 6){
                                            td.className = "anotherMonthWeekEnd";
                                        }
                                        else{
                                            td.className = "anotherMonthWeek";
                                        }
                                    }
                                    if(date.getTime() == current.getTime()) {
                                        td.className = "currentDay";
                                        table.querySelectorAll("th")[j].className = "currentDay";
                                        if(button) button.classList.add("hide");
                                    }
                                    td.innerText = date.getDate();
                                    date.setDate(date.getDate() + 1);
                                    tr.appendChild(td);
                                    table.appendChild(tr);
                                }
                            }
                            i++;
                        }
                        wrapper.innerHTML = "";
                        wrapper.appendChild(table);
                    }
                };
            function setToday()
            {
                form.inpDate.valueAsDate = new Date();
                var event = new Event('change');
                form.dispatchEvent(event);
            }
           if(wrapper && form){
                form.addEventListener('change', createTable);
                button && button.addEventListener("click", setToday);
                setToday()
            }
            function getShortNameOfDay(x){
                var name = "xx";
                switch(x){
                    case 0: name = "Пн"; break;
                    case 1: name = "Вт"; break;
                    case 2: name = "Ср"; break;
                    case 3: name = "Чт"; break;
                    case 4: name = "Пт"; break;
                    case 5: name = "Сб"; break;
                    case 6: name = "Вс";
                }
                return name;
            }
        </script>
        </div>
    </body>
</html>

Блондинка 19.07.2019 13:36

Rise,
К сожалению для меня не очевидно, поскольку хромом я пользуюсь очень редко, а в моём браузере данных кнопочек нету, если предложишь свой вариант календаря заменив поле для ввода месяца на выпадающий список с кнопками < и > для выбора месяца и поле ввода с кнопками < и > для ввода года, буду благодарна...

Rise 19.07.2019 13:38

Блондинка, мне кажется стало понятно, что input не нужен вообще. А два момента что ты описала это одно и тоже, надо наверное крутить интервал и обновлять данные.

laimas 19.07.2019 14:05

Цитата:

Сообщение от Блондинка
в моём браузере данных кнопочек нету,

В каком? Последним из основных браузеров, который обзавелся календарем для поля типа date был FF. В нем нет стрелочки, но он отображает дату и кнопку очистки поля, а календарь появляется по фокусу.

Блондинка 19.07.2019 15:54

laimas,
В Habbit browser для android...

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

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

Блондинка 19.07.2019 18:18

Русский,
по идее этот вариант должен сработать даже если просто отложить тел и экран погас, а потом через несколько дней зайти на эту страницу?

Блондинка 19.07.2019 20:48

недокалькуляторы, это что за зверь такой?

рони 19.07.2019 23:11

Русский,
параметр run сделает пример запускаемым.
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

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

Народ, кто может исправить скрипт из 16 поста?
надо заменить
<input type="month">
на
<button>«</button> 
<select name="month">
<option>январь</option>
<option>февраль</option>
<option>март</option>
<option>апрель</option>
<option>май</option>
<option>июнь</option>
<option>июль</option>
<option>август</option>
<option>сентябрь</option>
<option>октябрь</option>
<option>ноябрь</option>
<option>декабрь</option>
</select>
<button>»
</button>
<button>«
</button>
<input name="year">
<button>»
</button>
и доработать обновление дива по таймеру при наступлении новых суток.

Блондинка 20.07.2019 00:22

Русский,
твой календарь, но почему-то страница пустая...

Блондинка 20.07.2019 12:16

рони,
возможно ли исправить и доработать твой вариант календаря?
Цитата:

Сообщение от Блондинка (Сообщение 510430)
скрипт из 16 поста?
надо заменить
<input type="month">
на
<button>«</button> 
<select name="month">
<option>январь</option>
<option>февраль</option>
<option>март</option>
<option>апрель</option>
<option>май</option>
<option>июнь</option>
<option>июль</option>
<option>август</option>
<option>сентябрь</option>
<option>октябрь</option>
<option>ноябрь</option>
<option>декабрь</option>
</select>
<button>»
</button>
<button>«
</button>
<input name="year">
<button>»
</button>
и доработать обновление дива по таймеру при наступлении новых суток.


рони 20.07.2019 12:46

Блондинка,
может взять https://jqueryui.com/datepicker/#inline
или
https://xdan.ru/samij-udobnij-datetimepicker.html

Блондинка 20.07.2019 13:37

рони,
главное чтобы было:

выпадающий список для выбора месяца с кнопками вперёд/назад

поле ввода для ввода года с кнопками вперёд/назад

скрытая кнопка сегодня

подсвечено как в 16 посте

и было обновление дива при наступлении 00:00 ч.

остальное на своё усмотрение... (не имеет значения какой именно плагин)

рони 20.07.2019 14:19

Блондинка,
Календарь UI
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/sunny/jquery-ui.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
  <script>
$(function() {

    $.datepicker.regional['ru'] = {
		closeText: 'Закрыть',
		prevText: '&#x3c;Пред',
		nextText: 'След&#x3e;',
		currentText: 'Сегодня',
		monthNames: ['Январь','Февраль','Март','Апрель','Май','Июнь', 'Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'],
		monthNamesShort: ['Янв','Фев','Мар','Апр','Май','Июн', 'Июл','Авг','Сен','Окт','Ноя','Дек'],
		dayNames: ['воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'],
		dayNamesShort: ['вск','пнд','втр','срд','чтв','птн','сбт'],
		dayNamesMin: ['Вс','Пн','Вт','Ср','Чт','Пт','Сб'],
		dateFormat: 'dd.mm.yy',
		firstDay: 1,
		isRTL: false,
		showOtherMonths:true,
		selectOtherMonths:true,
		changeMonth:true,
        changeYear: true,
        gotoCurrent : false,
        showButtonPanel:true,
        showAnim:'scale'
};
$.datepicker.setDefaults($.datepicker.regional['ru']);
var datepicker = $( '#datepicker' ).datepicker({
onSelect  : function(text, obj) {
console.log(text, obj)
}
})
var timer;
function refresh()
{
window.clearTimeout(timer);
var time = new Date();
var finish = (new Date()).setHours(24, 0, 0, 0);
finish -= time;
timer = window.setTimeout(function() {
    datepicker.datepicker("refresh");
    refresh()
}, finish)
}
refresh();
 });
  </script>
</head>

<body>
<div id="datepicker"></div>

</body>
</html>

Rise 20.07.2019 15:03

Русский, наверное лучше setTimeout использовать и пересчитывать каждый раз сколько осталось до конца суток, а то вдруг setInterval раньше сработает.

рони, а чего это setTimeout только раз выполняется, вдруг страничка не закроется пользователем несколько дней.

рони 20.07.2019 15:23

Цитата:

Сообщение от Rise
setTimeout только раз

угу но я не уверен, что этим не закончится.
добавил

Блондинка 20.07.2019 15:58

рони,
сорри, видимо на яваскрипт нереально создать календарь, в котором месяц можно выбрать в выпадающем списке а также с помощью кнопок вперед/назад, и год можно вводить с клавы а также с помощью кнопок типа как при использовании input type number но только видимые во всех браузерах(стилизовать поле убрал кнопки из оперы и добавив свои, видимые в всех браузерах)...

Блондинка 20.07.2019 16:11

Цитата:

Сообщение от Русский
А твой браузер JavaScript-то поддерживает вообще, хотя бы ES2015? Если нет, то пора обновляться, скоро он уже половину сайтов в Интернете не будет отображать.

лучше посоветуй как заставить 100% пользователей моего сайта обновить браузеры вместо того чтобы забыть про мой сайт...

рони 20.07.2019 16:13

Цитата:

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

реально, но практически, кроме вас его создавать некому.

Блондинка 20.07.2019 16:20

рони, в сети десятки если не сотни календарей на яваскрипт, но у каждого свои недостатки...

Блондинка 20.07.2019 18:06

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

Блондинка 20.07.2019 19:11

рони,
вот типа как тут, выпадающий список и поле ввода
<style>
#calendar3 {
  width: 100%;
  font: monospace;
  line-height: 1.2em;
  font-size: 15px;
  text-align: center;
}
#calendar3 thead tr:last-child {
  font-size: small;
  color: rgb(85, 85, 85);
}
#calendar3 tbody td {
  color: rgb(44, 86, 122);
}
#calendar3 tbody td:nth-child(n+6), #calendar3 .holiday {
  color: rgb(231, 140, 92);
}
#calendar3 tbody td.today {
  outline: 3px solid red;
}
</style>

<table id="calendar3">
  <thead>
    <tr><td colspan="4"><select>
<option value="0">Январь</option>
<option value="1">Февраль</option>
<option value="2">Март</option>
<option value="3">Апрель</option>
<option value="4">Май</option>
<option value="5">Июнь</option>
<option value="6">Июль</option>
<option value="7">Август</option>
<option value="8">Сентябрь</option>
<option value="9">Октябрь</option>
<option value="10">Ноябрь</option>
<option value="11">Декабрь</option>
</select><td colspan="3"><input type="number" value="" min="0" max="9999" size="4">
    <tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
  <tbody>
</table>

<script>
function Calendar3(id, year, month) {
var Dlast = new Date(year,month+1,0).getDate(),
    D = new Date(year,month,Dlast),
    DNlast = D.getDay(),
    DNfirst = new Date(D.getFullYear(),D.getMonth(),1).getDay(),
    calendar = '<tr>',
    m = document.querySelector('#'+id+' option[value="' + D.getMonth() + '"]'),
    g = document.querySelector('#'+id+' input');
if (DNfirst != 0) {
  for(var  i = 1; i < DNfirst; i++) calendar += '<td>';
}else{
  for(var  i = 0; i < 6; i++) calendar += '<td>';
}
for(var  i = 1; i <= Dlast; i++) {
  if (i == new Date().getDate() && D.getFullYear() == new Date().getFullYear() && D.getMonth() == new Date().getMonth()) {
    calendar += '<td class="today">' + i;
  }else{
    if (  // список официальных праздников
        (i == 1 && D.getMonth() == 0 && ((D.getFullYear() > 1897 && D.getFullYear() < 1930) || D.getFullYear() > 1947)) || // Новый год
        (i == 2 && D.getMonth() == 0 && D.getFullYear() > 1992) || // Новый год
        ((i == 3 || i == 4 || i == 5 || i == 6 || i == 8) && D.getMonth() == 0 && D.getFullYear() > 2004) || // Новый год
        (i == 7 && D.getMonth() == 0 && D.getFullYear() > 1990) || // Рождество Христово
        (i == 23 && D.getMonth() == 1 && D.getFullYear() > 2001) || // День защитника Отечества
        (i == 8 && D.getMonth() == 2 && D.getFullYear() > 1965) || // Международный женский день
        (i == 1 && D.getMonth() == 4 && D.getFullYear() > 1917) || // Праздник Весны и Труда
        (i == 9 && D.getMonth() == 4 && D.getFullYear() > 1964) || // День Победы
        (i == 12 && D.getMonth() == 5 && D.getFullYear() > 1990) || // День России (декларации о государственном суверенитете Российской Федерации ознаменовала окончательный Распад СССР)
        (i == 7 && D.getMonth() == 10 && (D.getFullYear() > 1926 && D.getFullYear() < 2005)) || // Октябрьская революция 1917 года
        (i == 8 && D.getMonth() == 10 && (D.getFullYear() > 1926 && D.getFullYear() < 1992)) || // Октябрьская революция 1917 года
        (i == 4 && D.getMonth() == 10 && D.getFullYear() > 2004) // День народного единства, который заменил Октябрьскую революцию 1917 года
       ) {
      calendar += '<td class="holiday">' + i;
    }else{
      calendar += '<td>' + i;
    }
  }
  if (new Date(D.getFullYear(),D.getMonth(),i).getDay() == 0) {
    calendar += '<tr>';
  }
}
for(var  i = DNlast; i < 7; i++) calendar += '<td>&nbsp;';
document.querySelector('#'+id+' tbody').innerHTML = calendar;
g.value = D.getFullYear();
m.selected = true;
if (document.querySelectorAll('#'+id+' tbody tr').length < 6) {
    document.querySelector('#'+id+' tbody').innerHTML += '<tr><td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;<td>&nbsp;';
}
document.querySelector('#'+id+' option[value="' + new Date().getMonth() + '"]').style.color = 'rgb(220, 0, 0)'; // в выпадающем списке выделен текущий месяц
}
Calendar3("calendar3",new Date().getFullYear(),new Date().getMonth());
document.querySelector('#calendar3').onchange = function Kalendar3() {
  Calendar3("calendar3",document.querySelector('#calendar3 input').value,parseFloat(document.querySelector('#calendar3 select').options[document.querySelector('#calendar3 select').selectedIndex].value));
}
</script>

рони 20.07.2019 23:02

календарь с выбором месяца селектом и кнопками
 
Блондинка,

<!DOCTYPE html>

<html>
  <head>
    <title>Untitled</title>
    <meta charset="utf-8" />
    <style type="text/css">


      #wrapper button:after {
        content: 'prev';
      }
      #wrapper button:nth-of-type(2):after {
        content: 'next';

      }

      #wrapper button:nth-of-type(3){
          order: 1;
      }
      #wrapper button:nth-of-type(2){
          order: 2;
      }

      #wrapper button:nth-of-type(3):after {
        content: 'сегодня';
      }
      #wrapper input {
        width: 50px;
        height: 18px;
        margin-top: -3px;
        text-align: center;
      }

      #wrapper {
        width: 320px;
        padding: 5px;
        margin: 5px;
        border: 1px solid #a9a9a9;
        border-radius: 6px/4px;
        display: flex;
        flex-wrap: wrap;
        justify-content: space-between;
      }

      #wrapper table {
        flex: 1 0 100%;
        border-collapse: separate;
         width: 100%;
        padding: 1px;
      }
      table,
      th,
      td {
        border: 1px solid #a9a9a9;
        border-radius: 6px/4px;
        margin: 1px;
      }
      th,
      td {
        text-align: center;
      }

      .currentMonthWeek {
        background-color: #def1ff;
        color: #0091ff;
      }
      .currentMonthWeek:nth-child(n + 6) {
        background-color: #ffc3d7;
        color: #dc143c;
      }
      td.currentDay {
        background-color: #c2d6ff;
        border: 1px solid #00f;
        font-weight: bold;
        color: #fff;
        text-shadow: 1px 1px #00f, -1px 1px #00f, 1px -1px #00f, -1px -1px #00f,
          1px 0 #00f, 0 1px #00f, -1px 0 #00f, 0 -1px #00f;
      }
      td.currentDay:nth-child(n + 6) {
        background-color: #ffc3d7;
        border: 1px solid #ff69b4;
        text-shadow: 1px 1px #ff0000, -1px 1px #ff0000, 1px -1px #ff0000, -1px -1px #ff0000, 1px 0px #ff0000, 0px 1px #ff0000, -1px 0px #ff0000, 0px -1px #ff0000;

      }

      #wrapper th {
        background-color: #c2d6ff;
        color: #0069ff;
      }
      #wrapper th:nth-child(n + 6) {
        background-color: #ffb4d2;
        color: #b92346;
      }
      #wrapper th.currentDay {
        border: 1px solid #285fcd;
        background-color: #6b9cff;
        color: #e6f5ff;
      }
      #wrapper th:nth-child(n + 6).currentDay {
        background-color: #ff389c;
        color: #ffed85;
      }

     #wrapper button {
        flex 0;
        border: 1px solid #a9a9a9;
        border-radius: 6px/4px;
      }
    </style>
  </head>

  <body>
    <div id="wrapper"></div>
    <script>
      let timer;
      function createCalendar(id, year, month) {
        const table = document.createElement('table');
        const header = document.createElement('tr');
        const daysOfWeek = ['пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт', 'вск'];
        const monthNames = [
          'Январь',
          'Февраль',
          'Март',
          'Апрель',
          'Май',
          'Июнь',
          'Июль',
          'Август',
          'Сентябрь',
          'Октябрь',
          'Ноябрь',
          'Декабрь',
        ];
        const data = new Date(year, month, 0);
        const daysInMonth = data.getDate();
        const indexMonth = data.getMonth();
        const currentData = new Date();
        const currentDay = currentData.getDate();
        const currentMonth = currentData.getMonth();
        const currentFullYear = currentData.getFullYear();
        let selectHtml = monthNames.reduce(
          (html, nameMonth, i) =>
            (html += `<option value=${i} ${
              indexMonth == i ? 'selected' : ''
            }>${nameMonth}`),
          `<select>`
        );
        const yearFull = data.getFullYear();
        selectHtml += `<input value=${yearFull}>`;
        table.insertAdjacentHTML(
          'beforeend',
          `<tr><th colspan='7'>${selectHtml}</th></tr>`
        );
        for (const day of daysOfWeek)
          header.insertAdjacentHTML('beforeend', `<th>${day}</th>`);
        table.append(header);
        let firstDay = (new Date(year, month - 1).getDay() + 6) % 7;
        let nextDayToAdd = 1 - firstDay;
        while (nextDayToAdd <= daysInMonth) {
          const week = document.createElement('tr');
          for (let i = 0; i < 7; i++) {
            const day = document.createElement('td');
            let cls = 'currentMonthWeek';

            if (nextDayToAdd > 0 && nextDayToAdd <= daysInMonth) {
              if (
                currentMonth == indexMonth &&
                currentFullYear == yearFull &&
                nextDayToAdd == currentDay
              ) {
                cls = 'currentDay';
                table.querySelectorAll('th')[i + 1].className = 'currentDay';
              }
              day.innerHTML = nextDayToAdd;
            }

            cls && day.classList.add(cls);
            nextDayToAdd++;
            week.append(day);
          }
          table.append(week);
        }
        let div = document.getElementById(id);
        div.innerHTML = '';
        div.append(table);
        [0, 2].forEach(n => {
          let button = document.createElement('button');
          button.addEventListener('click', () =>
            createCalendar(id, yearFull, indexMonth + n)
          );
          div.append(button);
        });
        table.querySelector('select').addEventListener('input', function() {
          createCalendar(id, yearFull, ++this.value);
        });
        table.querySelector('input').addEventListener('input', function() {
          if (/^\d{4}$/.test(this.value))
            createCalendar(id, +this.value, indexMonth + 1);
        });

        if (currentMonth != indexMonth || currentFullYear != yearFull) {
          let button = document.createElement('button');

          button.addEventListener('click', () =>
            createCalendar(id, currentFullYear, currentMonth + 1)
          );
          div.append(button);
        }
        function refresh() {
          window.clearTimeout(timer);
          let finish = new Date().setHours(24, 0, 0, 0);
          finish -= currentData;
          timer = window.setTimeout(function() {
            createCalendar(id, yearFull, indexMonth + 1);
            refresh();
          }, finish);
        }
        refresh();

        return table;
      }
      let table = createCalendar('wrapper', 2019, 6);
    </script>
  </body>
</html>

Блондинка 21.07.2019 02:14

рони,
если честно, то даже не знаю как реагировать, дело в том что при просмотре запускаемого примера а также в блокноте виден только див
#wrapper {
036
        width: 320px;
037
        padding: 5px;
038
        margin: 5px;
039
        border: 1px solid #a9a9a9;
040
        border-radius: 6px/4px;

видимо и телефон и браузер безнадежно устарели настолько, что мне не суждено увидеть даже календарь...

Блондинка 21.07.2019 02:19

Русский,
под словом "кросбраузерно" подразумевается основные браузеры версии хотя бы 2-3 летней давности, но никак не браузеры 90х годов прошлого столетия...


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