Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Независимая прокрутка дива колесом (IE only)... Див должен крутиться, а страница - нет. 
:(
    Опции темы
Zeroglif
Дата 1.12.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



На странице есть див с вертикальным скроллом, допустим 200х200 пикселей. Нужно, чтобы в тот момент, когда он в фокусе (фокус передаю заранее), можно было прокручивать контент этого дива колесом мыши обычным образом, но не прокручивать саму страницу. Буду обязан за оптимальный и желательно наипростейший (надёжный) вариант решения задачи.

Спасибо.
PM MAIL WWW   Вверх
Гость_12345
Дата 1.12.2005, 15:32 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Затравку кода бы какую, а то писать лень.
К примеру, как Вы делали фокус на диве без щелчка мыши?
По TextRange?
Далее, если нет MouseOver, придётся ловить document.onscroll, возвращать назад и крутить див на ту же величину. Текста много, напишите же основу.
  Вверх
Aliance
Дата 1.12.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 55
Всего: 137



А он разве не крутится? Крутится тот объект, где стоит фокус. У меня, по крайней мере
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 1.12.2005, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Если IE only то можно отлавливать onmousewheel на div'е.
По моему мозилла этим не страдает, если мышь над слоем, то скролиться будет именно слой, так что вроде и кроссплатформенно может получиться.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Zeroglif
Дата 1.12.2005, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата
Затравку кода бы какую, а то писать лень.


Дружище, это я ковыряюсь с эмуляцией селектбокса. Код в рабочем варианте (он не про это), полуразобран, там всего намешано, ничего, кроме путаницы сюда этот код не внесёт. Коротко так: при клике на кнопке под ней создаётся новый див (визуально всё как у селектбокса) с нужным контентом, ему сразу передаётся фокус (div.focus()). Про фокус пишу просто как о факте, на самом деле колесу мыши это должно быть пофигу. При прокрутке дива крутится и вся страница, а не должна. Задача актуальна безотносительно к моему коду, для любого скроллируемого дива на странице.

Код

<html>
    <body>
        <div id='div1' style='height:60px;width:60px;overflow:hidden;overflow-y:scroll;'>
            text1<br>
            text2<br>
            text3<br>
            text4<br>
            text5<br>
            text6<br>
        </div>
    </body>
</html>


Судя по всему, нужно диву добавить обработчик onmousewheel и писать свою функцию для колеса с одновременным запретом действия по умолчанию.
Добавлено @ 16:13
Цитата(Sardar @ 1.12.2005, 15:53)
так что вроде и кроссплатформенно может получиться

Кросс не нужно, эт внутренняя задача, IE-only.

!!!Ребят, не хочу отнимать ваше драгоценное время, или киньте в меня уже готовым вариантом (если уже есть в закромах), или наведите на иное, чем своя функция на onmousewheel. Специально не пишите, разрулю myself.
PM MAIL WWW   Вверх
Гость_12345
Дата 1.12.2005, 19:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Aliance, а у меня всегда крутится лишь то, что под мышью, а не в фокусе. За исключением селекта, который крутится по фокусу. Разве где-то иначе?

Вот, видно решение. Надо ставить onmousewheel не только диву, но и документу, чтобы, когда мышь не над дивом, крутить его, но документ возвращать на место, если программа считает, что на нём фокус.

  Вверх
Sardar
Дата 1.12.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Проверил, ИЕ крутит див если по нему кликнуть (передать фокус), просто наведя мышь нет. Мозилла вообще никак див не крутит по мыши... странный прикол...


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Zeroglif
Дата 1.12.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



В общем, кроме своей функции ничего в голову пока не пришло. Тогда так (корявенько):

Код

<html>
    <head>
        <script language='javascript'>
        function F(a)
        {
            var s=(event.wheelDelta/120>0)?'scrollbarUp':'scrollbarDown';
            a.doScroll(s);
            return false;
        }
        </script>
    </head>
    <body>
    <br>
        <div id='div1' style='height:60px;width:60px;overflow:hidden;overflow-y:scroll;' onmousewheel='return F(this)'>
            text1<br>
            text2<br>
            text3<br>
            text4<br>
            text5<br>
            text6<br>
        </div>
    </body>
</html>

PM MAIL WWW   Вверх
Гость_12345
Дата 1.12.2005, 23:22 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Sardar, у меня же не требует фокуса, крутит как я описал. Вероятно, это ещё зависит от драйвера. В моей A4Tech GreatEye WheelMouse (2-скролльной) есть 2 режима - Enhanced Dual Wheell Mode и IntelliMouse compatible, но ни один из них не приводит к результату, как у тебя.


Zeroglif, не понятен смысл эффекта. Прокрутка стала в другую сторону при наведении мыши на div. При этом, повторюсь, у меня клик или не клик по какой-либо части документа эффекта не меняет. Так что не могу уловить задачи - то ли драйвер мыши мешает, ...?
  Вверх
Zeroglif
Дата 1.12.2005, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата
Zeroglif, не понятен смысл эффекта. Прокрутка стала в другую сторону при наведении мыши на div. При этом, повторюсь, у меня клик или не клик по какой-либо части документа эффекта не меняет. Так что не могу уловить задачи - то ли драйвер мыши мешает, ...?

Может и дрова виноваты. Моя мышь крутит див вне зависимости от фокуса, лишь бы курсор был над ним.

Что касается прокрутки в обратную сторону, то положительная wheelDelta - это прокрутка от себя (вверх), отрицательная - к себе (вниз)... у меня как бы работает (MS Wireless IntelliMouse Explorer 2.0).
PM MAIL WWW   Вверх
Гость_12345
Дата 2.12.2005, 17:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











> Моя мышь крутит див вне зависимости от фокуса, лишь бы курсор был над ним.
Правильно, только называй своими именами - у мыши не курсор, а указатель. А тебе нужно, чтобы крутилось только при фокусе (т.е. не при наведении, а после клика на div, до клика на другом месте страницы)?

Не понятно, в чём проблема, если ты говоришь, что сам можешь написать. Идеи проговорены. Фокус сообщается через select() объекта TextRange. Причём, нужен не натуральный фокус (который отмечается _Курсором_ в поле ввода, а искусственный).
  Вверх
Zeroglif
Дата 2.12.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата
называй своими именами - у мыши не курсор, а указатель.

Здорово. То бишь, cursor!=курсор, а div!=див или пиши только на правильном русском, иначе я твоя не понимай? Ладно, будет указатель, не вопрос. smile

Цитата
Не понятно, в чём проблема, если ты говоришь, что сам можешь написать.

Если я могу что-то сам написать, из этого никак не следует, что я автоматически лишаюсь возможности вопрошать совета и проч. smile

Цитата
Фокус сообщается через select() объекта TextRange. Причём, нужен не натуральный фокус (который отмечается _Курсором_ в поле ввода, а искусственный).

Да бог с ним, с фокусом. IE так устроен, что он начинает крутить скролл слоя тогда, когда указатель мыши стоит над этим скроллом, не важно кликал я в этот слой или нет, передавал я ему фокус какими-либо способами или нет. Указатель над слоем - крутится слой.

После того, как скролл слоя достигает своей верхней/нижней точки, а пользователь продолжает крутить колесо, начинает крутиться скролл уже страницы. Задача была в том, чтобы класиво придумать, как отменить скролл страницы только на тот период, пока крутится слой. Придумать-придумалось, но не ндравится.
PM MAIL WWW   Вверх
Гость_12345
Дата 3.12.2005, 00:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Конечно, непонятно, когда указатель мыши курсором называют и при этом идёт речь о фокусе, который характеризуется наличием курсора ввода символов на элементе.
...
Понятно, значит, надо, чтобы, доходя до верхней строки, скролл дива останавливался и была выделена верхняя строка как в селекте.

Нет ничего проще! (С апломбом.) Лёгким движением мыши пишем такой код:
Код
<html><head><title>Прокрутка строк DIV почти как в Select (IE only)</title>
<script>d=document;
onload=function setTR(){    //иниц. TextRange
        tR=d.body.createTextRange();
    tR.moveToElementText(d.all['div1s'+d.all.div1.selectedLine]);
    tR.select();
}
function F(a){movSel=event.wheelDelta/120;
    sL=parseInt(d.all.div1.selectedLine);
    if(sL>1-(movSel<0) && sL<8+(movSel>0))d.all.div1.selectedLine=sL-=movSel;
    tR.moveToElementText(d.all['div1s'+d.all.div1.selectedLine]);
    tR.select();
    return false;
}
</script>
</head><body>
<div selectedLine=3 id=div1 style='height:8em;width:260;overflow:auto;border-style:solid;border-width:1;padding-left:2'
    onmousewheel='return F(this)'
    onMouseOver=setTR()>
    <span id=div1s1>text1</span><br>
    <span id=div1s2>text2</span><br>
    <span id=div1s3>text3</span><br>
    <span id=div1s4>text4</span><br>
    <span id=div1s5>text5</span><br>
    <span id=div1s6>text6</span><br>
    <span id=div1s7>7</span><br>
    <span id=div1s8>8</span><br>
</div>
</body></html>
(и далее можно импровизировать). Как вам такое решение?

По другим браузерам - В Опере 7.54 это не работает (в 8-й должно), но обратил внимание, что она начинает крутить слой именно по фокусу на нём, т.е. после клика. (Она вообще кривовато кручение колеса мыши воспринимает.)
  Вверх
Ciber SLasH
Дата 3.12.2005, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1813
Регистрация: 9.11.2004
Где: С.-Петербург

Репутация: 24
Всего: 67



Как я понял, Zeroglif хотел следующего эффекта:
Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content='text/html; charset=windows-1251'>
<meta name="Generator" content='EditPlus 2.20.211'>
<meta name="Author" content='Ciber SLasH'>
<title>JavaScript :: Остановка просачивания события "onMouseWheel" (IE only)</title>
<script type='text/javascript'>
onload = function () {
var objDIV = document.getElementById("my");

    objDIV.onmousewheel = function () {
        if ((this.scrollTop >= this.clientHeight) && (event.wheelDelta <= -120)) {
            return false;
        }
        if ((this.scrollTop == 0) && (event.wheelDelta >= 120)) {
            return false;
        }
    }
}
</script>
<style type='text/css'>
body {height: 130%}
#my {height: 100px; margin-top: 25%; border: 2px solid black; overflow: auto}
</style>
</head>

<body>
<div id='my'><br><br><br><br><br><br><br><br><br><br><br></div>
</body>
</html>

PM   Вверх
Zeroglif
Дата 3.12.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 644
Регистрация: 22.9.2005

Репутация: 28
Всего: 66



Цитата
Как вам такое решение?

Спасибо, интересно.

Цитата(Ciber @ 3.12.2005, 08:31)
Как я понял, Zeroglif хотел следующего эффекта

Суть вы поняли совершенно правильно, идеальным вариантом было бы именно отловить нижнюю и верхнюю точку скролла и в этот момент запретить прокрутку страницы, не эмулируя скролл дива искусственно. Но, к сожалению, я не знаю, как определить эти точки. Ваш вариант, как принцип, понятен, но не подходит...
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.