Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.04.2020, 14:24
Новичок на форуме
Отправить личное сообщение для zxazx Посмотреть профиль Найти все сообщения от zxazx
 
Регистрация: 23.04.2020
Сообщений: 6

как переопределить обработчик для всех элементов, кроме одного?
нужно убрать возможность выделения для всей страницы, кроме одного элемента.
запретить выделение для всех элементов на странице не сложно:
document.onmousedown = document.onselectstart = function() {
  return false;
};


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

пс: убирать для каждого элемента по отдельности можно, конечно, но не интересно.
Ответить с цитированием
  #2 (permalink)  
Старый 23.04.2020, 15:07
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Мот так
let elem = ... // тот, для которого не отменяем
document.onmousedown =  function(ev) {
  return ev.target === elem;
};

Последний раз редактировалось voraa, 23.04.2020 в 15:20.
Ответить с цитированием
  #3 (permalink)  
Старый 23.04.2020, 15:30
Новичок на форуме
Отправить личное сообщение для zxazx Посмотреть профиль Найти все сообщения от zxazx
 
Регистрация: 23.04.2020
Сообщений: 6

let elem = document.getElementById('test');
document.onmousedown = function(ev) {

  return ev.target === elem;
};
document.onselectstart = function(ev) {

  return ev.target === elem;
};

document.onmousedown = document.onselectstart = function() {
  return false;
};


не работает.
при клике на элементе "test" браузер идет в переназначенную функцию.
Ответить с цитированием
  #4 (permalink)  
Старый 23.04.2020, 15:37
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Просто вот так. Без всего остального

let elem = document.getElementById('test');
document.onmousedown = function(ev) {
  return [].includes.call(ev.path, elem)
};


Я немного изменил, что бы можно было выделять и дочерние элементы 'test'
Ответить с цитированием
  #5 (permalink)  
Старый 23.04.2020, 15:44
Новичок на форуме
Отправить личное сообщение для zxazx Посмотреть профиль Найти все сообщения от zxazx
 
Регистрация: 23.04.2020
Сообщений: 6

Ух ты! работает
теперь бы еще понять как...
спасибо
Ответить с цитированием
  #6 (permalink)  
Старый 23.04.2020, 15:58
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от zxazx Посмотреть сообщение
Ух ты! работает
теперь бы еще понять как...
спасибо
Когда кликается мышка, событие mousedown начинает "всплывать" от того элемента, на котором кликнули, через все родительские, до document.
При этом будут вызываться обработчики события назначенные для него для этих элементов. Но у нас он назначен только для document.
В свойстве event.path - содержится вся последовательность элементов через которое всплывало событие.
event.path[0] - тот на котором нажали
event.path[event.path.length - 1] - document
Когда событие пришло в document мы ищем проходило ли оно, через элемент elem.
Функция массива includes(item) - возвращает true если элемент item содержится в массиве.
Но event.path не массив, а массивоподобный объект, поэтому includes приходится вызывать через Ж так [].includes.call(ev.path, elem)
Если событие не прошло через elem, то функция вернет false и тем самым отменится стандартная реакция на событие. В том числе и начало выделения.
Ответить с цитированием
  #7 (permalink)  
Старый 23.04.2020, 16:00
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112


document.onmousedown = function(ev) {
  return !!ev.target.closest('#test');
  };
Ответить с цитированием
  #8 (permalink)  
Старый 23.04.2020, 16:05
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Для данного случая можно и так.
Но если elem получен как то по другому, без id или селекторов то только через ev.path.

Хотя так тоже можно
document.onmousedown = function(ev) {
  return elem.contains(ev.target)
  };

Последний раз редактировалось voraa, 23.04.2020 в 16:18.
Ответить с цитированием
  #9 (permalink)  
Старый 23.04.2020, 17:08
Новичок на форуме
Отправить личное сообщение для zxazx Посмотреть профиль Найти все сообщения от zxazx
 
Регистрация: 23.04.2020
Сообщений: 6

разобрался. было интересно. всем спасибо
Ответить с цитированием
  #10 (permalink)  
Старый 29.04.2020, 17:15
Новичок на форуме
Отправить личное сообщение для zxazx Посмотреть профиль Найти все сообщения от zxazx
 
Регистрация: 23.04.2020
Сообщений: 6

появился еще один близкий вопрос. поэтому, в эту же тему.
есть два элемента canvas. как при правом клике мышкой на первом canvas, скопировать картинку из другого canvas?
попытки изменить значение event.path[0] не получаются (
пробую так:
document.oncontextmenu = function(e){
	if(e.path[0].id == "topCanv"){
		var x = document.getElementById("chart");
		e.path[0] = x;
	}
};
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Один обработчик для всех ninzzo Events/DOM/Window 4 02.02.2014 00:27
как записать id всех элементов в массив? SunYang Общие вопросы Javascript 21 06.02.2010 22:50
Событие change для всех элементов exvion jQuery 2 25.01.2010 18:18
Как снять фокус со всех элементов? Logo Общие вопросы Javascript 7 02.07.2009 23:53
Как присвоить текст строке состояния для всех браузеров? Tend Общие вопросы Javascript 4 14.05.2009 16:38