Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как поймать и обработать onMouseUp?
 
 автор: DJ Paltus   (12.10.2009 в 16:23)   письмо автору
 
 

Занялся я эмуляцией линейки-разделителя, которая перемещается по горизонтали и изменяет размеры смежных элементов. В связи с чем, имею серьезный вопрос.
Как поймать и обработать событие отпускания кнопки? Или я вообще неверно обрабатываю событие нажатия?
И второе. Как запретить выделение постороннего текста при движении мыши с нажатой кнопкой при перемещении сплиттера?
Вот, собственно:


<html>

<head>
  <title></title>
  <script >
function defPosition(event) {
    var x = y = 0;
    if (document.attachEvent != null) { // Internet Explorer & Opera
        x = window.event.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
        y = window.event.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
    } else if (!document.attachEvent && document.addEventListener) { // Gecko
        x = event.clientX + window.scrollX;
        y = event.clientY + window.scrollY;
    } else {
        // Do nothing
    }
    return {x:x, y:y};
}

function Moveme()
{
    document.onmousemove = function(event) {  // ловим движение
        var event = event || window.event;
        document.getElementById('splitter').style.left = defPosition(event).x + 'px';
        document.getElementById('lefter').style.width = defPosition(event).x - 15 + 'px';
    }
}

  </script>
  <style>
    #splitter{
        width:4px;
        position:absolute;
        display:block;
        cursor:e-resize;
        left:255px;
        height:100%;
        }
    #righter, #lefter{
        width:240px;
        height:300px;
        float:left;
        display:block;
        border:1px solid green;
        }
    #righter{
        border:1px solid red;
        position:relative;
        left:15px;
        }
  </style>
</head>
<body>
Тут какой-то текст
    <div id=lefter>qwertyuiop1</div>
    <div id=splitter onMouseDown="Moveme()" style="height: 300px; width:4px; background-color: red"></div>
    <div id=righter>qwertyuiop2</div>
</body>
</html>

  Ответить  
 
 автор: АЯ   (12.10.2009 в 19:05)   письмо автору
 
   для: DJ Paltus   (12.10.2009 в 16:23)
 

Подход у вас принципиально неверен.

На див-сплиттер надо "навешивать" две функции на два события:
а) по mousedown функция, отлавливающая движение мыши и делающая то,
что вам надо делать, должна подключаться;
б) по mouseup эта же функция должна отключаться.

Поэтому подключение функции должно быть осуществлено ОБРАТИМЫМИ методами.
Т.е. не document.onmousemove = function (), как это сделано у вас, а методами
attachEventaddEventListener), чтобы можно было их отключить
методами detachEventremoveEventListener).

Самый надёжный способ "победить" выделение текста во всех браузерах - закрыть "сверху"
всю область, где будет перемещаться мышь, пустым дивом с непрозрачным фоном,
но с абсолютной прозрачностью (с использованием opacity).

  Ответить  
 
 автор: DJ Paltus   (12.10.2009 в 21:47)   письмо автору
 
   для: АЯ   (12.10.2009 в 19:05)
 

Как ими пользоваться? Я уже весь вечер убил, кушать не могу!

document.getElementById('splitter').addEventListener("onmousemove", Moveit(), false);

Так, вроде? а в defPosition тогда какой ивент отдавать, чтобы координаты снять?

  Ответить  
 
 автор: АЯ   (13.10.2009 в 00:41)   письмо автору
 
   для: DJ Paltus   (12.10.2009 в 21:47)
 

<script>
var t = 'mouse', m = t + 'move', M = 'on' + m, u = t + 'up', U = 'on' + u, b = false, d = document;

function fWrk (e)
{
var E = window.event || e, L = E.pageX || (E.clientX + d.body.scrollLeft);
d.getElementById ('splitter').style.left = L + 'px';
}

function fAdd ()
{
if (d.addEventListener) {d.addEventListener (m, fWrk, b); d.addEventListener (u, fDel, b)}
else if (d.attachEvent) {d.attachEvent      (M, fWrk, b); d.attachEvent      (U, fDel, b)}
}

function fDel ()
{
if (d.addEventListener) {d.removeEventListener (m, fWrk, b); d.removeEventListener (u, fDel, b)}
else if (d.attachEvent) {d.detachEvent         (M, fWrk, b); d.detachEvent         (U, fDel, b)}
}
</script>

<style>
#splitter {height: 300px; width: 4px; background-color: red; position: absolute; left: 255px; cursor: e-resize}
</style>

<div id="splitter" onmousedown="fAdd ()"></div>

  Ответить  
 
 автор: DJ Paltus   (13.10.2009 в 01:12)   письмо автору
 
   для: АЯ   (13.10.2009 в 00:41)
 

Это уже прогресс! Спасибо! )) В ишаке стало работать.
Однако, в ФФ при некоторых нажатиях этот div переходит в режим перетаскивания (такой полупрозрачненький становится), и на этом месте mouseup не регистрируется до следующего клика.
Я заставлял старый вариант работать в ФФ, через те же процедуры, что приводил выше, добавив лишь

function Horosh(){
    document.onmousemove = function(event) {
           var event = "";
    window.event = "";
    }
}

ну и обработку этой функцией события onMouseUp. Оно в ФФ точно так же получалось. Правда, ишак был в отказе, работал по-старому.
А. наверное, выделение виновато...

Все равно дичайше благодарю! Спать буду существенно спокойнее.

  Ответить  
 
 автор: АЯ   (13.10.2009 в 02:00)   письмо автору
 
   для: DJ Paltus   (13.10.2009 в 01:12)
 

>"наверное, выделение виновато..."

Поделитесь найденным средством.

  Ответить  
 
 автор: DJ Paltus   (13.10.2009 в 02:10)   письмо автору
 
   для: АЯ   (13.10.2009 в 02:00)
 

Вот, в одном блоге нашел и привинтил к функции fWrk.

  Ответить  
 
 автор: DJ Paltus   (13.10.2009 в 01:49)   письмо автору
 
   для: АЯ   (13.10.2009 в 00:41)
 

Еще раз мегаспасибо!
Победить выделение, из-за которого подвисало всё, удалось "простенькой функцией", найденной гуглем, теперь и в ФФ работает как надо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования