>Переместите мышь для увеличения ширины:
>
>
> var lastX; // Последняя позиция мыши
> var rect = document.querySelector("div");
> rect.addEventListener("mousedown", function(event) {
> if (event.which == 1) {
> lastX = event.pageX;
> addEventListener("mousemove", moved);
> event.preventDefault(); // Запретим выделение
> }
> });
> function moved(event) {
> if (event.which != 1) {
> removeEventListener("mousemove", moved);
> } else {
> var dist = event.pageX - lastX;
> var newWidth = Math.max(10, rect.offsetWidth + dist);
> rect.style.width = newWidth + "px";
> lastX = event.pageX;
> }
> }
>
Обратите внимание – обработчик >"mousemove"
зарегистрирован у всего окна. Даже если мышь уходит за пределы полоски, нам надо обновлять её размер и прекращать это, когда кнопку отпускают.
Когда курсор попадает на узел и уходит с него, происходят события >"mouseover"
или >"mouseout"
. Их можно использовать, кроме прочего, для создания эффектов проведения мыши, показывая или меняя стиль чего-либо, когда курсор находится над этим элементом.
К сожалению, создание такого эффекта не ограничивается запуском его при событии >"mouseover"
и завершением при событии >"mouseout"
. При движении мыши от узла к его дочерним узлам на родительском узле происходит событие >"mouseout"
, хотя мышь, вообще говоря, его и не покидала. Что ещё хуже, эти события распространяются как и все другие, поэтому вы всё равно получаете >"mouseout"
при уходе курсора с одного их дочерних узлов того узла, где вы зарегистрировали обработчик.
Для обхода проблемы можно использовать свойство >relatedTarget
объекта событий. Он сообщает, на каком узле была до этого мышь при возникновении события >"mouseover"
, и на какой элемент она переходит при событии >"mouseout"
. Нам надо менять эффект, только когда >relatedTarget
находится вне нашего целевого узла. Только в этом случае событие на самом деле представляет собой переход на наш узел (или уход с узла).
>Наведите мышь на этот параграф .
>
> var para = document.querySelector("p");
> function isInside(node, target) {
> for (; node != null; node = node.parentNode)
> if (node == target) return true;
> }
> para.addEventListener("mouseover", function(event) {
> if (!isInside(event.relatedTarget, para))
> para.style.color = "red";
> });
> para.addEventListener("mouseout", function(event) {
> if (!isInside(event.relatedTarget, para))
> para.style.color = "";