Куда пропадает оперативная память?Никуда не пропадает, ее использует компьютер.
2. Что делать со страницами пагинации и сортировки товаров?
Если в какой-либо категории на вашем сайте находится большое количество товаров, могут появиться страницы пагинации (порядковой нумерации страниц), на которых собраны все товары данной категории. Если на такие страницы нет трафика из поисковых систем и их контент во многом идентичен, то советую настраивать атрибут rel="canonical" тега на подобных страницах и делать страницы второй, третьей и дальнейшей нумерации неканоническими, а в качестве канонического (главного) адреса указывать первую страницу каталога, только она будет участвовать в результатах поиска.
Например, страница сайт.рф/ромашки/1 - каноническая, с неё начинается каталог, а страницы вида сайт.рф/ромашки/2 и сайт.рф/ромашки/3 - неканонические, в поиск их можно не включать. Это не только предотвратит возможное дублирование контента, но и позволит указать роботу, какая именно страница должна находиться в выдаче по запросам. При этом ссылки на товары, которые находятся на неканонических страницах, также будут известны индексирующему роботу.
Часто вместо пагинации сайты используют динамическую прокрутку, когда для посетителя, пролиставшего каталог до определённого момента, с помощью JavaScripts загружаются другие товары в данной категории. В такой ситуации необходимо проследить, чтобы весь контент таких страниц отдавался индексирующему роботу (например, с помощью инструмента в Яндекс.Вебмастере), либо чтобы роботу становилась доступна статическая пагинация товаров.
Если ваш контент, который должен отображаться в результатах поиска, разбит на страницы, рекомендуем использовать один из способов, описанных ниже.
1- Оставьте все как есть. Поскольку разбиение на страницы используется очень часто, алгоритмы Google возвращают контент, наиболее соответствующий запросам пользователей, независимо от того, на скольких страницах он расположен.
2- Добавьте страницу "Показать все". Пользователи часто предпочитают просматривать всю статью или категорию на одной странице. Если Google считает, что пользователь ищет именно такой вариант, то предпринимает попытку показать в результатах поиска страницу "Показать все". Вы можете добавить атрибут rel="canonical" для отдельных страниц, чтобы сообщить, что в результатах поиска должна показываться именно страница "Показать все".
3- Используйте атрибуты rel="next" и rel="prev" в ссылках или заголовках, чтобы указать связь между несколькими URL. Благодаря этой разметке Google может определить, что содержание данных страниц связано в логической последовательности, и направить пользователя на начальную страницу.
Исправил синтаксические ошибки.
if
или условие лишнее:} else (date.getDay() == 0) {
} else (a < 1) {
:
после ?
:this.updateTime.getMonth() > 9 ? : '0'
renderItems
стоит лишняя фигурная скобка, а после метода createPeriod
такой скобки не хватает.input.onchange
:this.input.onChange = this.onChange;
date
или data
? Вы бы определились:class dateInput {
class dateRange extends dataInput {
dateRange
отсутствует вызов конструктора базового класса - не хватает super();
перед this.container = ...
:constructor() { this.container = document.querySelector('.containerForLastUpdateRecordAndPeriodItems');
period = `${date.toLocaleDateString()} - {date.setHours(168).toLocaleDateString()}`;
period
должно быть periods[i]
.setHours
возвращает число, а не объект даты, так вызвать toLocaleDateString
не получится.$
перед фигурной скобкой при подстановке второй даты.b = false;
element = document.createElement('div')
renderItems
- не хватает this.
:onChange() { renderItems(this.createItems(this.createPeriod(this.inputValue)));
this
тут будет вовсе не экземпляром класса - надо привязывать контекст при установке этого метода в качестве обработчика события (this.onChange.bind(this)
- это в конструкторе dateInput
). А ещё, поскольку метод переопределён, надо не забыть вызвать метод базового класса, иначе не будет установлено значение свойства inputValue
:onChange(e) {
super.onChange(e);
this.renderItems(...
TypeError
при попытке выполнить хотя бы одну итерацию подобного цикла получите обязательно:for (const i = 0; i < n-a; i++) {
document.createElement
в качестве параметров? Откройте документацию и разберитесь, чтобы такую чушь больше не сочинять:const element = document.createElement('div', {textContent: item});
this
:this.container.appendChild(element);
forEach
, который представлен обычной функцией, то экземпляр класса оказывается недоступен. Или замените обычную функцию на стрелочную, или передайте this
в forEach
третьим параметром.createPeriod(date) { var newDate = date; newDate.year = newDate.year + 1;
createPeriod(dateStr) {
const start = new Date(dateStr);
const end = new Date(dateStr);
end.setFullYear(end.getFullYear() + 1);
return { start, end };
}
const range = Object.create(dateRange.prototype); range.constructor = range.constructor.bind(range); range.constructor();
new
конструктор вызывать нельзя.new dateRange;
.Подскажите, как еще можно оптимизировать(зарефакторить) данный js код?
const MS_IN_HOUR = 3600000;
const HOURS = 168;
for (let i = +period.start; i < +period.end; i += MS_IN_HOUR * HOURS) {
const date = new Date(i);
const hours = [ -120, 0, -24, -48, -48, -72, -96 ][date.getDay()];
periods.push([ hours, hours + HOURS ]
.map(n => (date.setHours(n), date.toLocaleDateString()))
.join(' - ')
);
[ periods[i + a], periods[i] ] = [ periods[i], periods[i + a] ];
updateTime
- как-то многовато, достаточно одного, чтобы запомнить значение под коротким именем:const ut = this.updateTime;
this.container.insertAdjacentHTML('beforeend',
`<div>Последнее изменение: ${ut.getDate()}.${`${ut.getMonth()}`.padStart(2, 0)}</div>` +
items.map(n => `<div>${n}</div>`).join('')
);
HTTP_
. Для примера, если вы отправляете заголовок REMOTE_ADDR
, то во всех скриптах на вашем сайте этот заголовок будет доступен как $_SERVER['HTTP_REMOTE_ADDR']
$_SERVER
. Как видно, переданный мной IP был записан в $_SERVER['HTTP_REMOTE_ADDR']
, а настоящий IP записан, как полагается, в $_SERVER['REMOTE_ADDR']