Jquery метод .toggleclass()
Содержание:
Свои DOM-свойства
Ранее мы видели некоторые встроенные свойства DOM-узлов. Но, технически, никто нас ими не ограничивает.
Узел DOM – это объект, поэтому, как и любой объект в JavaScript, он может содержать пользовательские свойства и методы.
Например, создадим в новое свойство и запишем в него объект:
Можно добавить и новую функцию:
Нестандартные свойства и методы видны только в JavaScript и никак не влияют на отображение соответствующего тега.
Обратим внимание, пользовательские DOM-свойства:
- Могут иметь любое значение.
- Названия свойств чувствительны к регистру.
- Работают за счёт того, что DOM-узлы являются объектами JavaScript.
Примеры
Пример: добавляем или удаляем класс ‘highlight’ при клике.
<!DOCTYPE html> <html> <head> <style> p { margin: 4px; font-size:16px; font-weight:bolder; cursor:pointer; } .blue { color:blue; } .highlight { background:yellow; } </style> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> </head> <body> <p class="blue">Click to toggle</p> <p class="blue highlight">highlight</p> <p class="blue">on these</p> <p class="blue">paragraphs</p> <script> $("p").click(function () { $(this).toggleClass("highlight"); }); </script> </body> </html>
Демо
Пример: добавляем класс «highlight» при каждом третьем клике; удалить при каждом втором.
<!DOCTYPE html> <html> <head> <style> p { margin: 4px; font-size:16px; font-weight:bolder; cursor:pointer; } .blue { color:blue; } .highlight { background:red; } </style> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> </head> <body> <p class="blue">Click to toggle (<span>clicks: 0</span>)</p> <p class="blue highlight">highlight (<span>clicks: 0</span>)</p> <p class="blue">on these (<span>clicks: 0</span>)</p> <p class="blue">paragraphs (<span>clicks: 0</span>)</p> <script> var count = 0; $("p").each(function() { var $thisParagraph = $(this); var count = 0; $thisParagraph.click(function() { count++; $thisParagraph.find("span").text('clicks: ' + count); $thisParagraph.toggleClass("highlight", count % 3 == 0); }); }); </script> </body> </html>
Демо
Пример: добавляем/удаляем классы к элементам div в зависимости от нажатых кнопок.
<!DOCTYPE html> <html> <head> <style> .wrap > div { float: left; width: 100px; margin: 1em 1em 0 0; padding=left: 3px; border: 1px solid #abc; } div.a { background-color: aqua; } div.b { background-color: burlywood; } div.c { background-color: cornsilk; } </style> <script src="http://code.jquery.com/jquery-1.9.1.js"></script> </head> <body> <div class="buttons"> <button>toggle</button> <button class="a">toggle a</button> <button class="a b">toggle a b</button> <button class="a b c">toggle a b c</button> <a href="#">reset</a> </div> <div class="wrap"> <div></div> <div class="b"></div> <div class="a b"></div> <div class="a c"></div> </div> <script> var cls = ; var divs = $('div.wrap').children(); var appendClass = function() { divs.append(function() { return '<div>' + (this.className || 'none') + '</div>'; }); }; appendClass(); $('button').on('click', function() { var tc = this.className || undefined; divs.toggleClass(tc); appendClass(); }); $('a').on('click', function(event) { event.preventDefault(); divs.empty().each(function(i) { this.className = cls; }); appendClass(); }); </script> </body> </html>
Демо
JavaScript
JS Array
concat()
constructor
copyWithin()
entries()
every()
fill()
filter()
find()
findIndex()
forEach()
from()
includes()
indexOf()
isArray()
join()
keys()
length
lastIndexOf()
map()
pop()
prototype
push()
reduce()
reduceRight()
reverse()
shift()
slice()
some()
sort()
splice()
toString()
unshift()
valueOf()
JS Boolean
constructor
prototype
toString()
valueOf()
JS Classes
constructor()
extends
static
super
JS Date
constructor
getDate()
getDay()
getFullYear()
getHours()
getMilliseconds()
getMinutes()
getMonth()
getSeconds()
getTime()
getTimezoneOffset()
getUTCDate()
getUTCDay()
getUTCFullYear()
getUTCHours()
getUTCMilliseconds()
getUTCMinutes()
getUTCMonth()
getUTCSeconds()
now()
parse()
prototype
setDate()
setFullYear()
setHours()
setMilliseconds()
setMinutes()
setMonth()
setSeconds()
setTime()
setUTCDate()
setUTCFullYear()
setUTCHours()
setUTCMilliseconds()
setUTCMinutes()
setUTCMonth()
setUTCSeconds()
toDateString()
toISOString()
toJSON()
toLocaleDateString()
toLocaleTimeString()
toLocaleString()
toString()
toTimeString()
toUTCString()
UTC()
valueOf()
JS Error
name
message
JS Global
decodeURI()
decodeURIComponent()
encodeURI()
encodeURIComponent()
escape()
eval()
Infinity
isFinite()
isNaN()
NaN
Number()
parseFloat()
parseInt()
String()
undefined
unescape()
JS JSON
parse()
stringify()
JS Math
abs()
acos()
acosh()
asin()
asinh()
atan()
atan2()
atanh()
cbrt()
ceil()
clz32()
cos()
cosh()
E
exp()
expm1()
floor()
fround()
LN2
LN10
log()
log10()
log1p()
log2()
LOG2E
LOG10E
max()
min()
PI
pow()
random()
round()
sign()
sin()
sqrt()
SQRT1_2
SQRT2
tan()
tanh()
trunc()
JS Number
constructor
isFinite()
isInteger()
isNaN()
isSafeInteger()
MAX_VALUE
MIN_VALUE
NEGATIVE_INFINITY
NaN
POSITIVE_INFINITY
prototype
toExponential()
toFixed()
toLocaleString()
toPrecision()
toString()
valueOf()
JS OperatorsJS RegExp
constructor
compile()
exec()
g
global
i
ignoreCase
lastIndex
m
multiline
n+
n*
n?
n{X}
n{X,Y}
n{X,}
n$
^n
?=n
?!n
source
test()
toString()
(x|y)
.
\w
\W
\d
\D
\s
\S
\b
\B
\0
\n
\f
\r
\t
\v
\xxx
\xdd
\uxxxx
JS Statements
break
class
continue
debugger
do…while
for
for…in
for…of
function
if…else
return
switch
throw
try…catch
var
while
JS String
charAt()
charCodeAt()
concat()
constructor
endsWith()
fromCharCode()
includes()
indexOf()
lastIndexOf()
length
localeCompare()
match()
prototype
repeat()
replace()
search()
slice()
split()
startsWith()
substr()
substring()
toLocaleLowerCase()
toLocaleUpperCase()
toLowerCase()
toString()
toUpperCase()
trim()
valueOf()
Images
SlideshowSlideshow GalleryModal ImagesLightboxResponsive Image GridImage GridTab GalleryImage Overlay FadeImage Overlay SlideImage Overlay ZoomImage Overlay TitleImage Overlay IconImage EffectsBlack and White ImageImage TextImage Text BlocksTransparent Image TextFull Page ImageForm on ImageHero ImageBlur Background ImageChange Bg on ScrollSide-by-Side ImagesRounded ImagesAvatar ImagesResponsive ImagesCenter ImagesThumbnailsBorder Around ImageMeet the TeamSticky ImageFlip an ImageShake an ImagePortfolio GalleryPortfolio with FilteringImage ZoomImage Magnifier GlassImage Comparison Slider
ЕЩЁ
Полноэкранное видеоМодальное окноШкала времениИндикатор прокрутки Индикатор выполненияПанель навыковПолзунок диапазонаПодсказки при наведенииВсплывающие окнаСкладная секцияКалендарьВключить HTMLСписок делЗагрузчикиЗвездный рейтингПользовательский рейтингНаложениеКонтактные чипыКарточкиФлип-картаКарточка профиляКарточка товараОкно тревогиВыноска сообщенияПримечаниеМеткиКругиHR Горизонтальная линияКупонГруппа списковОтзывчивый текстВырезанный текстСветящийся текстФиксированный подвалЛипкий элементРавная высота столбцовОчистка поплавкаОтзывчивые поплавкиСнэк-бар/тостПолноэкранное режимЧертеж при прокруткеПлавная прокруткаГрадиент фонаЛипкий заголовокИзменить заголовок при прокруткеОтзывчивые столбцы ценПараллаксСоотношение сторонПереключатель нравится/не нравитсяПереключатель скрыть/показатьПереключаель текстаПереключатель классаДобавить классУдалить классАктивный классДревовидное представлениеУдалить свойствоАвтономный режим обнаруженияСделать скрытый элементПеренаправление веб страницыУвеличить при наведенииФлип-боксЭлемент вертикально по центруПереход при наведении курсораСтрелкиФигурыСсылка для скачиванияПолная высота элементаОкно браузераПользовательская полоса прокруткиРазличные устройстваЦвет заполнителяЦвет выделения текстаЦвет макераВертикальная линияАнимированные иконкиТаймер обратного отсчетаПишущая машинкаСтраница заставкиСообщение чатаВсплывающее окно чатаРазделенный экранРекомендацииСчетчик разделаСлайд-шоу цитатЗакрываемые злементы спискаТипичные точки прерыванияПеретаскиваемый HTML элементМедиа запросы JSПодсветка синтаксисаJS анимацииПолучить элементы Iframe
Methods
The method accepts an object that defines the TailwindCSS classes that you wish to use. It converts this object into a string of classnames.
For basic cases, you simply provide an object where the keys are the part of a Tailwind class before the first . For example, would be represented by and would be represented by .
import { classList } from 'tailwind-classlist'; const classes = classList({ m: 2, cursor: 'pointer', bg: 'grey-400', }); // Outputs "m-2 cursor-pointer bg-grey-400"
To use multiple classes with the same Tailwind prefix, group them together into an array.
const classes = classList({ text: 'lg', 'grey-600' }); // Outputs "text-lg text-grey-600"
To use state variants and responsive prefixes, group them together into an object.
const classes = classList({ bg: 'white', text: 'red-400', hover: { bg: 'red-400', text: 'white', }, focus: { outline: 'none', }, md: { text: 'lg', } }); // Outputs "bg-white text-red-400 hover:bg-red-400 hover:text-white focus:outline-none"
To use both state variants and responsive prefixes, use a nested object that begins with the responsive prefix first.
const classes = classlist({ md: { hover: { bg: 'red-800', text: 'blue-400', } } }); // Outputs "md:hover:bg-red-800 md:hover:text-blue-400"
Some classes in Tailwind don’t have any dashes in their name. These can be included by setting their value to .
const classes = classList({ fixed: true, italic: true, }); // Outputs "fixed italic"
The method accepts 2 or more classList strings and merges them together, overwriting any conflicting classes as it goes.
import { mergeClassLists } from 'tailwind-classlist'; const classListA = 'bg-blue-500 m-4'; const classListB = 'bg-red-500 p-4'; const combinedClasses = mergeClassLists(classListA, classListB); // Outputs 'bg-red-500 m-4 p-4'
It recognizes when multiple classes have the same prefix but shouldn’t overwrite eachother. In the example below, overwrites , but it has no effect on .
const classListA = 'bg-blue-500 bg-bottom m-4'; const classListB = 'bg-red-500 p-4'; const combinedClasses = mergeClassLists(classListA, classListB); // Outputs 'bg-red-500 bg-bottom m-4 p-4';
Similarly, it recognizes classes with conflicting styles that don’t have the same prefix. In the example below, and both affect the CSS property, so will overwrite .
const classListA = 'bg-blue-500 bg-bottom text-xs m-4 static'; const classListB = 'bg-red-500 p-4 text-lg fixed'; const result = mergeClassLists(classListA, classListB); // Outputs 'bg-red-500 bg-bottom text-lg m-4 p-4 fixed'
Any classes that aren’t part of the default Tailwind library will pass through without any filtering.
const classListA = 'bg-blue-500 text-xs sc-0dWm9Vdw2'; const classListB = 'bg-red-500 fixed test-class'; const result = mergeClassLists(classListA, classListB); // Outputs 'sc-0dWm9Vdw2 test-class bg-red-500 text-xs fixed'
The method performs the opposite operation as classList. It takes a string of classnames and returns a parsed classList object. Any classes that aren’t a part of the default Tailwind library will be grouped into an array under the key .
import { parseClassList } from 'tailwind-classlist'; const classes = 'm-2 cursor-pointer bg-grey-400'; const classObj = parseClassList(classes); // Outputs { m: 2, cursor: 'pointer', bg: 'grey-400' };
const classes = 'm-2 cursor-pointer sc-8d3jd6Ko customclass'; const classObj = parseClassList(classes); // Outputs { m: 2, cursor: 'pointer', extraClasses: };
Menus
Icon BarMenu IconAccordionTabsVertical TabsTab HeadersFull Page TabsHover TabsTop NavigationResponsive TopnavNavbar with IconsSearch MenuSearch BarFixed SidebarSide NavigationResponsive SidebarFullscreen NavigationOff-Canvas MenuHover Sidenav ButtonsSidebar with IconsHorizontal Scroll MenuVertical MenuBottom NavigationResponsive Bottom NavBottom Border Nav LinksRight Aligned Menu LinksCentered Menu LinkEqual Width Menu LinksFixed MenuSlide Down Bar on ScrollHide Navbar on ScrollShrink Navbar on ScrollSticky NavbarNavbar on ImageHover DropdownsClick DropdownsCascading DropdownDropdown in TopnavDropdown in SidenavResp Navbar DropdownSubnavigation MenuDropupMega MenuMobile MenuCurtain MenuCollapsed SidebarCollapsed SidepanelPaginationBreadcrumbsButton GroupVertical Button GroupSticky Social BarPill NavigationResponsive Header
Images
SlideshowSlideshow GalleryModal ImagesLightboxResponsive Image GridImage GridTab GalleryImage Overlay FadeImage Overlay SlideImage Overlay ZoomImage Overlay TitleImage Overlay IconImage EffectsBlack and White ImageImage TextImage Text BlocksTransparent Image TextFull Page ImageForm on ImageHero ImageBlur Background ImageChange Bg on ScrollSide-by-Side ImagesRounded ImagesAvatar ImagesResponsive ImagesCenter ImagesThumbnailsBorder Around ImageMeet the TeamSticky ImageFlip an ImageShake an ImagePortfolio GalleryPortfolio with FilteringImage ZoomImage Magnifier GlassImage Comparison Slider
МЕНЮ
Панель иконокЗначок менюАккордеонВкладкиВертикальные вкладкиЗаголовки вкладокВкладки полностраничныеВкладки при наведенииВерхняя навигацияОтзывчивый верхний навигаторНавигация с иконкамиМеню поискаСтрока поискаФиксированная боковая панельАнимированные боковые панелиОтзывчивая боковая панельПолноэкранная навигация наложенияМеню Off-CanvasБоковые кнопки навигацииБоковая панель с иконкамиМеню с горизонтальной прокруткойВертикальное менюНижняя навигацияОтзывчивая нижняя навигацияГраницы навигацииМеню по правому краюСсылка меню по центруМеню равной шириныФиксированное менюСкольжение вниз по полосе прокруткиСкрыть меню при прокруткеУменьшить меню при прокруткеЛипкая навигацияНавигация на изображенияВыпадающее менюВыпадающий при кликеВыпадающее меню в навигацииВыпадающий список в боковой навигацииОтзывчивая навигация с выпадающимПодменю навигацияВсплывающее менюМега менюМобильное менюМеню занавесСвернуть боковой барСвернуть боковую панельПагинацияХлебные крошкиГруппа кнопокГруппа вертикальных кнопокЛипкий социальный барНавигация таблеткиОтзывчивый заголовок
Наследование
Синтаксис:
Посмотрим как это выглядит на практике. В примере ниже объявлено два класса: и наследующий от него :
Как видим, в доступны как свои методы, так и (через ) методы родителя.
Это потому, что при наследовании через формируется стандартная цепочка прототипов: методы находятся в , методы – в , и они связаны через :
Как видно из примера выше, методы родителя () можно переопределить в наследнике. При этом для обращения к родительскому методу используют .
С конструктором – немного особая история.
Конструктор родителя наследуется автоматически. То есть, если в потомке не указан свой , то используется родительский. В примере выше , таким образом, использует от .
Если же у потомка свой , то, чтобы в нём вызвать конструктор родителя – используется синтаксис с аргументами для родителя.
Например, вызовем конструктор в :
Для такого вызова есть небольшие ограничения:
- Вызвать конструктор родителя можно только изнутри конструктора потомка. В частности, нельзя вызвать из произвольного метода.
- В конструкторе потомка мы обязаны вызвать до обращения к . До вызова не существует , так как по спецификации в этом случае именно инициализирует .
Второе ограничение выглядит несколько странно, поэтому проиллюстрируем его примером:
Не просто синтаксический сахар
Иногда говорят, что – это просто «синтаксический сахар» в JavaScript (синтаксис для улучшения читаемости кода, но не делающий ничего принципиально нового), потому что мы можем сделать всё то же самое без конструкции :
Результат этого кода очень похож. Поэтому, действительно, есть причины, по которым можно считать синтаксическим сахаром для определения конструктора вместе с методами прототипа.
Однако есть важные отличия:
-
Во-первых, функция, созданная с помощью , помечена специальным внутренним свойством . Поэтому это не совсем то же самое, что создавать её вручную.
В отличие от обычных функций, конструктор класса не может быть вызван без :
Кроме того, строковое представление конструктора класса в большинстве движков JavaScript начинается с «class …»
-
Методы класса являются неперечислимыми.
Определение класса устанавливает флаг в для всех методов в .И это хорошо, так как если мы проходимся циклом по объекту, то обычно мы не хотим при этом получать методы класса.
-
Классы всегда используют .
Весь код внутри класса автоматически находится в строгом режиме.
Также в дополнение к основной, описанной выше, функциональности, синтаксис даёт ряд других интересных возможностей, с которыми мы познакомимся чуть позже.
Синтаксис класса в JavaScript
Во-первых, как для любой переменной или функции, для класса нужно задать имя после ключевого слова . Оно записывается с большой буквы и после него идут фигурные скобки (тело класса), в которых будут находится все функции (методы) этого класса.
Синтаксис класса в JS
JavaScript
class NameOfClass {
// методы класса
constructor() { … }
method1() { … }
method2() { … }
method3() { … }
…
}
1 2 3 4 5 6 7 8 |
classNameOfClass{ // методы класса constructor(){…} method1(){…} method2(){…} method3(){…} … } |
Основной функцией в классе является конструктор (). Именно он вызывается при создании экземпляра класса строкой вида:
Создание экземпляра класса
JavaScript
let firstExample = new NameOfClass();
1 | let firstExample=newNameOfClass(); |
В классе может быть только один конструктор, т.е. метод с именем constructor вы можете объявить однократно.
Достаточно часто внутрь функции-конструктора передаются некоторые переменные, которые в становятся свойствами этого класса и затем используются в различных его методах. Например, нам необходимо создать класс, который будет выводить часы, минуты и секунды. Мы не будем использовать в нем методы объекта Date, но он позволит нам манипулировать временем. Назовем этот класс Clock и используем в качестве свойств то, что нам надо вывести.
Класс для вывода часов, минут и секунд
JavaScript
class Clock {
constructor(hour, min, sec) {
this.hour = hour;
this.min = min;
this.sec = sec;
}
showClock(){
document.write(`<h4> ${this.hour} : ${this.min} : ${this.sec}<h4>`);
}
}
let clock1 = new Clock(12, 17, 36);
clock1.showClock();
1 12 |
classClock{ constructor(hour,min,sec){ this.hour=hour; this.min=min; this.sec=sec; } showClock(){ document.write(`<h4>${this.hour}${this.min}${this.sec}<h4>`); } } clock1.showClock(); |
В конструктор класса мы передаем начальные значения часов, минут и секунд. А функция выведет нам все переданные значения в виде строки с разделением с помощью двоеточия.
Обратите внимание на то, что внутри класса все свойства записываются с помощью ключевого слова , которое указывает на текущий объект класса Clock. Запись функции-конструктора в классе можно заменить такой функцией:. Использование this внутри функции-конструктора
JavaScript
function Clock(hour, min, sec) {
// this = {}; (неявным образом создается пустой объект)
Использование this внутри функции-конструктора
JavaScript
function Clock(hour, min, sec) {
// this = {}; (неявным образом создается пустой объект)
// добавляет свойства к this
this.hour = hour;
this.min = min;
this.sec = sec;
// return this; (объект из функции неявно возвращается с уже назначенными свойствами)
}
1 2 3 4 5 6 7 8 9 10 |
functionClock(hour,min,sec){ // this = {}; (неявным образом создается пустой объект) // добавляет свойства к this this.hour=hour; this.min=min; this.sec=sec; // return this; (объект из функции неявно возвращается с уже назначенными свойствами) } |
Обычно конструкторы ничего не возвращают явно. Их задача – записать все необходимые свойства в , а иногда и вызвать методы, чтобы мы могли пользоваться экземпляром класса.
Обратите внимание на то, что классы всегда нужно объявлять ДО их использования, в отличие от функций.Объявление функции (function declaration) совершает подъём (hoisted), т.е. интерпретатор знает о ее существовании до момента вызова, где бы она не была объявлена, в то время как объявление класса (class declaration) — нет
Поэтому сначала нужно объявить класс и только потом создавать его экземпляры во избежание ошибок типа :
Поэтому мы объявляем внизу (строка 11) переменную , которая является экземпляром созданного нами . Результат:
Мы можем вывести с помощью нашего класса текущее время, воспользовавшись встроенным в JavaScript классом Date и его методами.
Использование класса Data для экземпляра класса Clock
JavaScript
let now = new Date();
let clock2 = new Clock(now.getHours(), now.getMinutes(), now.getSeconds());
clock2.showClock();
1 2 3 |
let now=newDate(); let clock2=newClock(now.getHours(),now.getMinutes(),now.getSeconds()); clock2.showClock(); |
Результат:
Что же будет, если мы создадим еще один экземпляр класса Clock с цифрами, большими, чем в привычном нам формате часов.
Создание экземпляра класса Clock с параметрами, которые не применимы для часов
JavaScript
let clock3 = new Clock(27, 122, 368);
clock3.showClock();
1 2 |
let clock3=newClock(27,122,368); clock3.showClock(); |
В результате выведутся все цифры, которые мы передали в функцию-конструктор, т.к. она сейчас не предполагает каких-либо изменений, связанных с форматом привычных нам часов.
Вычисленные стили: getComputedStyle
Итак, изменить стиль очень просто. Но как его прочитать?
Например, мы хотим знать размер, отступы, цвет элемента. Как это сделать?
Свойство оперирует только значением атрибута , без учёта CSS-каскада.
Поэтому, используя , мы не можем прочитать ничего, что приходит из классов CSS.
Например, здесь не может видеть отступы:
…Но что, если нам нужно, скажем, увеличить отступ на ? Для начала нужно его текущее значение получить.
Для этого есть метод: .
Синтаксис:
- element
- Элемент, значения для которого нужно получить
- pseudo
- Указывается, если нужен стиль псевдоэлемента, например . Пустая строка или отсутствие аргумента означают сам элемент.
Результат вызова – объект со стилями, похожий на , но с учётом всех CSS-классов.
Например:
Вычисленное (computed) и окончательное (resolved) значения
Есть две концепции в :
- Вычисленное (computed) значение – это то, которое получено после применения всех CSS-правил и CSS-наследования. Например, или .
- Окончательное () значение – непосредственно применяемое к элементу. Значения или являются относительными. Браузер берёт вычисленное значение и делает все единицы измерения фиксированными и абсолютными, например, или . Для геометрических свойств разрешённые значения могут иметь плавающую точку, например, .
Давным-давно был создан для получения вычисленных значений, но оказалось, что окончательные значения гораздо удобнее, и стандарт изменился.
Так что, в настоящее время фактически возвращает окончательное значение свойства, для геометрии оно обычно в пикселях.
требует полное свойство!
Для правильного получения значения нужно указать точное свойство. Например: , , . При обращении к сокращённому: , , – правильный результат не гарантируется.
Например, если есть свойства , то что мы получим вызывая ? Ничего, или, может быть, «сгенерированное» значение из известных внутренних отступов? Стандарта для этого нет.
Есть и другие несоответствия. Например, некоторые браузеры (Chrome) отображают в документе ниже, а некоторые (Firefox) – нет:
Стили, применяемые к посещённым ссылкам, скрываются!
Посещённые ссылки могут быть окрашены с помощью псевдокласса .
Но не даёт доступ к этой информации, чтобы произвольная страница не могла определить, посещал ли пользователь ту или иную ссылку, проверив стили.
JavaScript не видит стили, применяемые с помощью . Кроме того, в CSS есть ограничение, которое запрещает в целях безопасности применять к CSS-стили, изменяющие геометрию элемента. Это гарантирует, что нет обходного пути для «злой» страницы проверить, была ли ссылка посещена и, следовательно, нарушить конфиденциальность.
June 2019
New announcement tools
By popular demand, now when you create an announcement you’ll be able to use our new editing tools to style and add images to it.
More intuitive notifications
Now the app will group notifications of likes and comments together when they relate to the same post. It will also automatically mark the notification of a new post as read if you click on the post. A better experience for everyone using the app!
Parents are now automatically reminded about events
To help you remember to buy tickets, RSVP and come along to events, we’ve introduced automatic event reminders. You’ll get your first reminder seven days before an event and a second one the day before. PTAs, why not add all your events to Classlist now so parents will get auto reminders for them?