Javascript.RU

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

Отписать блок от событий мыши
Всем доброго времени суток.
Есть ли возможность полностью удалить блок из слушателей событий мыши? Пример: Есть небольшой div (назовем его div1), над ним - большой div с абсолютным позиционированием (div2), который полностью перекрывает div1. Есть ли какая-нибудь возможность получать события от перекрытого div1.
Во flash к примеру есть два свойства (mouseEnabled и mouseChildren) благодаря которым можно исключить объект из слушателей мыши, интересует - есть ли что-то подобное в js.
Ответить с цитированием
  #2 (permalink)  
Старый 27.04.2012, 12:54
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

А что Вам мешает увеличить z-index первому DIV_у?
<html>
<body>
<script>
var div1 = document.createElement('DIV');
div1.style.cssText = 'position:absolute; left:50px; top:50px; width:200px; height:100px; background-color:#FF0000; z-index:1';
div1.innerHTML = 'внутренний';     
div1.onclick = function(){alert('внутренний')};      
document.body.appendChild(div1);

var div2 = document.createElement('DIV');
div2.style.cssText = 'position:absolute; left:10px; top:10px; width:400px; height:200px; border:1px solid #0000FF;';
div2.innerHTML = 'внешний';     
div2.onclick = function(){alert('внешний')};          
document.body.appendChild(div2);  
</script>
</body>
</html>
Ответить с цитированием
  #3 (permalink)  
Старый 27.04.2012, 13:05
Новичок на форуме
Отправить личное сообщение для Urchin Посмотреть профиль Найти все сообщения от Urchin
 
Регистрация: 27.04.2012
Сообщений: 6

к сожалению нужно чтобы блок с абсолютным позиционированием находился именно над "внутренним" блоком div1, то есть у div2 z-index должен быть больше.
Ответить с цитированием
  #4 (permalink)  
Старый 27.04.2012, 13:18
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Это тоже возможно, но механизм резко усложняется. Вам потребуется взять "на себя" всю обработку мыши в общем случае от всего document.
На примере onclick необходимо проверять координату мыши и сравнивать с местоположением и размерами прямоугольников. Причем положение прямоугольников надо вычислять в абсолютной системе координат относительно левого верхнего угла экрана. Если координата мыши попала в область внутреннего прямоугольника, то выполнить полезные действия. При пересечении (наложении) нескольких прямоугольников друг на друга должно быть еще какое-то условие, по которому отдается предпочтение, т.к. при такой схеме обработки все прямоугольники как бы абсолютно равные по значимости и z-index не влияет.
В Вашем частном случае Вы можете повесить обработчик мыши не на document, а на внешний DIV2 и проверять координаты клика - попали, ли они в область DIV1.
Ответить с цитированием
  #5 (permalink)  
Старый 27.04.2012, 13:34
Новичок на форуме
Отправить личное сообщение для Urchin Посмотреть профиль Найти все сообщения от Urchin
 
Регистрация: 27.04.2012
Сообщений: 6

этот вариант у меня был, но очень хочется его избежать ). Блин неужели нельзя просто исключить объект из слушателей мыши. сколько бы проблем это решило...
Ответить с цитированием
  #6 (permalink)  
Старый 27.04.2012, 13:39
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Urchin Посмотреть сообщение
Блин неужели нельзя просто исключить объект из слушателей мыши. сколько бы проблем это решило...
"исключение объекта из слушателей мыши", т.е. запрет обработки событий от мыши на DIV2 делается легко. Только это ничего не даст, т.к. этот внешний DIV перекрывает внутренний. Скажите, какова необходимость такого перекрытия? Обычно это делают как раз для того, чтобы внутренний DIV НЕ ловил события от мыши. А у Вас для чего?
Ответить с цитированием
  #7 (permalink)  
Старый 27.04.2012, 14:06
Новичок на форуме
Отправить личное сообщение для Urchin Посмотреть профиль Найти все сообщения от Urchin
 
Регистрация: 27.04.2012
Сообщений: 6

Сразу скажу что я флешер, возможно тогда мои извращенные действия станут понятными).
я избрал такое решение для неоднородной подсветки строки таблицы, при наведении на нее. То есть при наведении на строку, на нее сверху должен накладываться блок с бэкграунд имеджем, а при mouseout-е он должен исчезать. Проблема в том что после его наложения сразу же срабатывает mouseout (это и понятно), блок исчезает, затем сразу срабатывает mouseover, и т.д.
Да я знаю, что это все можно сделать изменив стиль этой строки, но хотелось попробовать флешевский подход ). да и вообще интересно почему нет возможности сделать объект "прозрачным" для событий мыши.
P.S. сразу скажу что повесить mouseout на внешний блок нет возможности ).
Ответить с цитированием
  #8 (permalink)  
Старый 27.04.2012, 14:27
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Все-равно не понятно, зачем "блок с бэкграунд имеджем" накладывать сверху? Вы хотите полностью спрятать этим блоком содержимое строки таблицы? Если нет, то зачем накладывать, а не подкладывать (с помощью zIndex)?
Ответить с цитированием
  #9 (permalink)  
Старый 27.04.2012, 14:30
Новичок на форуме
Отправить личное сообщение для Urchin Посмотреть профиль Найти все сообщения от Urchin
 
Регистрация: 27.04.2012
Сообщений: 6

эта картинка - грубо говоря фигурная рамка. а у таблицы есть свой бэкграунд
Ответить с цитированием
  #10 (permalink)  
Старый 27.04.2012, 16:14
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от Urchin
интересно почему нет возможности сделать объект "прозрачным" для событий мыши
Потому, что это JavaScript, а не Flash.

Сообщение от Urchin
эта картинка - грубо говоря фигурная рамка. а у таблицы есть свой бэкграунд
Можно создать одну картинку, на которой объеденены бэкграунд строки таблицы и ваша рамка, а потом просто менять СТИЛИ строки таблицы.

Если нет желания создавать допонительные картинки, то вы можете извлечь из стилей УРЛ бэкграунда и подставить его в стили дива. Затем УРЛ рамки поставить в бэкграунд строки таблицы, и в конце уже, как сказал Маэстро, просто подложить див под строку zIndex'ом

P.S. Urchin, не стоит переносить флешевские приёмы в JS. Не смотря на то, что они эмеют общую спецификацию, это разные языки
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Показать/скрыть блок Lelja_05 jQuery 10 01.07.2013 20:05
Немного Юмора - Гуртовщики Мыши antonM Оффтопик 12 23.03.2012 19:04
Поясните логику событий мыши при дочернем элементе с position absolute... interwass Общие вопросы Javascript 11 22.06.2011 12:42
Эмуляция событий мыши и клавиатуры Leax Events/DOM/Window 5 02.04.2010 09:09
Имитация нажатия кнопки мыши Mantell Общие вопросы Javascript 3 19.02.2009 17:03