1

我有一个通过设置 htmlText 来初始化的 TextField。文本具有锚标记(超链接)。当用户单击超链接时,段落中第二行和后续行的缩进会发生变化。为什么?我该如何阻止它?

我的 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 文本的片段(添加了换行符和 exrta 空格以提高可读性 - 最初它是一个长行):

<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 文本设置为自身,这可能会解决问题。(当我在我的应用程序中切换页面然后返回该页面时,一切都会再次正常。)

问题:如果我使用“事件:”协议并且用户尝试单击鼠标右键,他们会得到一个错误,或者我被告知。(参见http://www.blog.lessrain.com/as3-texteventlink-and-contextmenu-incompatibilities/)我不喜欢这种权衡。

4

1 回答 1

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

如果我没有先将字段设置为空字符串,它不会认为有任何改变,所以它什么也不做。

于 2009-06-24T21:01:28.287 回答