Как я могу остановить Flash от изменения отступа, когда пользователь нажимает на гиперссылку в TextField?

У меня есть TextField, который я инициализирую, установив htmlText. Текст имеет якорные теги (гиперссылки). Когда пользователь нажимает на гиперссылку, меняется отступ второй и последующих строк в абзаце. Почему? Как мне это остановить?

В моем html есть изображение в начале строки, за которым следует тег, за которым следует текст. Чтобы гиперссылки всегда выглядели синими и подчеркивались, когда над ними находится указатель мыши, я делаю следующее:

var css:StyleSheet = new StyleSheet();
css.parseCSS("a {color: #0000FF;} a:hover {text-decoration: underline;}");
stepText.styleSheet = css;  
stepText.htmlText = textToUse;
stepText.visible = true;

Вот фрагмент html-текста (с добавленными символами новой строки и дополнительными пробелами для улучшения читабельности — изначально это была одна длинная строка):

<textformat indent="-37" blockindent="37" >
    <img src="media/interface/level-1-bullets/solid-circle.png" 
         align="left" 
         hspace="8" 
         vspace="1"/> 
    American Dental Association. (n.d.). <i>Cleaning your teeth and gums (oral hygiene)</i>. 
    Retrieved 11/24/08, from 
        <a href="http://www.ada.org/public/topics/cleaning_faq.asp" 
           target="_blank">http://www.ada.org/public/topics/cleaning_faq.asp
        </a>
</textformat>
<br/>

Как оказалось, текстовое поле имеет такую ширину, что оно переносится, а вторая строка начинается с «Проверено 24.11.08». Щелчок по гиперссылке приводит к отступу этой конкретной строки. Последующие абзацы не затрагиваются.

В ДОПОЛНЕНИЕ: Изображение представляет собой маркированный список шириной около 37 пикселей. (Я использовал изображения вместо тегов li, потому что Flash не поддерживает вложенные списки, поэтому я сымитировал его, используя серию изображений с разным количеством пробелов, чтобы имитировать три уровня отступов.)

ИДЕЯ: я думал изменить все гиперссылки, чтобы использовать «event:» в качестве протокола URL, который вызывает событие TextEvent.LINK вместо перехода по ссылке. Тогда мне пришлось бы открывать браузер во втором вызове. Я мог бы использовать этот обработчик событий, чтобы установить сам текст html, что может устранить проблему. (Когда я переключаю страницы в своем приложении, а затем возвращаюсь на страницу, все снова в порядке.)

ПРОБЛЕМА: Если я использую протокол "event:" и пользователь попытается щелкнуть правой кнопкой мыши, он получит сообщение об ошибке, по крайней мере, так мне сказали. (См. http://www.blog.lessrain.com/as3-texteventlink-and-contextmenu-incompatibilities/ ) Мне не нравится этот компромисс.


person Paul Chernoch    schedule 23.06.2009    source источник


Ответы (1)


Я нашел обходной путь в соответствии с моей ИДЕЕЙ выше.

1) Ставьте перед всеми гиперссылками префикс «event:». 2) Добавьте прослушиватель событий в элемент управления для обработки запроса. 3) Слушатель запускает браузер И устанавливает текст в пустую строку, а затем в исходное значение.

1) Префикс с событием:.

public static function hrefEvents(s:String):String {
    var hrefRegex:RegExp = /href="/gm;
    var output:String = s.replace(hrefRegex, "href=\"event:");
    var dupe:RegExp = /event:event:/gm;
    output = output.replace(dupe, "event:");
    return output;
}

2) Добавить прослушиватель событий

stepText.addEventListener(TextEvent.LINK, hyperlinkHandler);

3) Обработать событие LINK.

private function hyperlinkHandler(e:TextEvent) {
    var temp:String = stepText.htmlText;
    stepText.htmlText = "";
    stepText.htmlText = temp;
    var url:String = e.text;
    trace("Clicked on link to URL: " + url);
    navigateToURL(new URLRequest(url), "_blank");   
}

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

person Paul Chernoch    schedule 24.06.2009