Как я могу остановить Flash от изменения отступа, когда пользователь нажимает на гиперссылку в TextField? - PullRequest
1 голос
/ 23 июня 2009

У меня есть 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/>

Как оказалось, текстовое поле имеет такую ​​ширину, что оно переносится, и вторая строка начинается с "Retrieved 11/24/08". Нажатие на гиперссылку приводит к отступу этой конкретной строки. Последующие пункты не затрагиваются.

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

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

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

1 Ответ

1 голос
/ 25 июня 2009

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

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");   
}

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

...