Просмотр полной версии : Прокрутка контента при положении курсора мыши над TextArea
vasyapunk
26.07.2010, 00:42
Привет всем)
Почему когда курсор мыши находится над TextArea, то нельзя скролить контент колесиком?
Кто знает как это избегать - помогите пожалуйста)
Есть аналогичная проблема: внутри Scroller находятся NumericStepper и когда в них помещён курсор, то скроллер не прокручивается колесом мыши. Спрашивал решение здесь, но никто не ответил.
Судя по-всему проблема в одном и том же, подскажите пожалуйста что с этим делать?
Проблема в том, что текстовые поля перехватывают событие прокрутки для своих нужд. Выход либо передавать событие выше по иерархии, либо отрубать мышь для этих полей.
Сделал сейчас такой тест с NumericStepper и TextArea:
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
minWidth="955" minHeight="600">
<fx:Script>
<![CDATA[
protected function nStep_mouseWheelHandler(event:MouseEvent):void {
event.preventDefault();
}
protected function tArea_mouseWheelHandler(event:MouseEvent):void {
event.preventDefault();
}
]]>
</fx:Script>
<s:Scroller x="126" y="135" width="200" height="150">
<s:VGroup width="100%">
<s:Button label="Кнопка"/>
<s:Label text="Метка"/>
<s:NumericStepper id="nStep" mouseEnabled="false"
mouseWheel="nStep_mouseWheelHandler(event)"/>
<s:CheckBox label="Флажок"/>
<s:TextArea id="tArea" width="100%" height="100" mouseEnabled="false"
mouseWheel="tArea_mouseWheelHandler(event)"/>
</s:VGroup>
</s:Scroller>
</s:Application>
Это не помогает никак. Даже если мышь не находится над данным NumericStepper, но имеет фокус - всё равно значение меняется в нём и Scroller не прокручивается.
Что я делаю не так? Можно какой-то пример, чтобы разобраться?
vasyapunk
26.07.2010, 17:05
я сделал так..
Создал класс:
package freetools
{
import flash.events.MouseEvent;
import mx.controls.TextArea;
public class UnscrollableTextArea extends TextArea
{
override protected function mouseWheelHandler(event:MouseEvent):void
{
}
}
}
и вместо myTextArea:TextArea пишу myTextArea:UnscrollableTextArea .Работает ))
Аналогичная реализация для NumericStepper:
package comps
{
import spark.components.NumericStepper;
import flash.events.MouseEvent;
public class UnscrollNumStepper extends NumericStepper
{
public function UnscrollNumStepper() {
super();
}
override protected function system_mouseWheelHandler(event:MouseEvent):void {
}
}
}
Такой способ работает, спасибо за наводку.
Может можно как-нибудь обойтись без дополнительных классов?
Отмена стандартной обработки event.preventDefault() не срабатывает у меня т.к. обработчик мой вызывается только когда мышь над NumericStepper, а значения меняются даже без этого, лишь бы курсор внутри был. Это происходит из-за того, что system_mouseWheelHandler (класс Spinner), который я перекрываю подписан на корневой SystemManager, а не на сам компонент, видимо поэтому события идут мимо.
Можно попробовать подписаться на скрол у компонента, и в обработчике вписать event.stopPropagation
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.