Flash AS3中的文本链接

3
所以我决定为一些朋友制作一个类似“维基”的应用程序,可以通过Dropbox使用,这意味着所有文件都存储在本地并由每个人更新。
每个文件都是一个.txt文件,由flash引入,然后使用简单的导航和搜索工具显示。
现在,我正在尝试更进一步,从它们的内容中链接文章。例如:
文章1名为“苹果”。其内容:“苹果很美味。” 文章2名为“熊”。其内容:“熊经常吃苹果。”
现在当用户打开文章2时,我希望他们能够点击单词“苹果”,然后打开文章1(“苹果”)。
我想知道如何创建在动态文本框中单击特定单词时触发的事件,而不是整个动态文本框。
我考虑过创建形状为单词的电影剪辑,将它们叠加在单词上,但如果有更简单的选择,则会麻烦得多。
3个回答

6
您可以使用文本框的 htmlText 属性动态地将单词转换为链接。然后使用 TextEvent.LINK 事件来捕获所点击的单词。
在填充文本框内容之前,只需遍历您的“关键字”列表并执行 .replace("keyword", '<a href="event:keyword">keyword</a>'); 即可。
因此,您的代码将类似于:
// get the file contents using whatever method you use
var contents:String = getFileContents("page2.txt");

// assuming you have your keywords in an array
var keywords:Array = ["Apples", "Pears"];
for each (var keyword:String in keywords) {
    // replace the current keyword with a version of itself wrapped in a link
    contents = contents.replace(keyword, '<a href="event:' + keyword + '">' + keyword + '</a>');
}

yourTextField.htmlText = contents;

// add an eventlistener for the click
yourTextField.addEventListener(TextEvent.LINK, linkClicked);
function linkClicked(e:TextEvent):void {
    // load the article for the clicked word =]
    loadPage(e.text);
}

更新
如果您希望忽略关键字的大小写,使得“apples”可以匹配“Apples”(甚至是“aPpLeS”),则需要使用正则表达式,以便您还可以在文本中保留单词本身:

// build a |-separated list of keywords
var keywordList:String = "";
for each (var keyword:String in keywords) {
    keywordList += ((keywordList != "") ? "|" : "") + keyword;
}
// build the regex and replace each keyword in-place
var pattern:RegExp = new RegExp("(" + keywordList + ")", "gi"); // "i" for ignore-case =]
contents = contents.replace(pattern, '<a href="event:$1">$1</a>');

上面代码将关键字列表用符号“|”分隔并进行单次替换(而不是每个关键字都替换一次),原因是分隔列表将按顺序进行替换,不允许先前关键字插入的HTML被后面找到的关键字破坏(例如,如果有一个关键字"event",则替换为 <a href="<a href="event:event">event</a>:keyword1">keyword1</a> 将会破坏HTML结构)。
文本的原始大小写将随事件一起发送。 您可以通过搜索所有现有关键字并将它们与传递给事件的关键字进行比较(使用.toLowerCase()将两者转换为小写进行比较),或者您可以制定主要关键字始终为小写,不必每次搜索列表。

谢谢,这个回复和其他的回复结合起来非常有帮助! - Olin Kirkland
@OlinKirkland 很高兴它对你有用!我还更新了我的答案,展示了如何在替换关键词时使用正则表达式来忽略文本的大小写。 - newfurniturey
@OlinKirkland,您使用的字体必须有“粗体”可用,并且通常嵌入在文本字段(或Flash文件本身)中。您可以尝试使用CSS而不是<b><span style="font-weight: bold;">关键词</span>,但我不能保证它会起作用。 - newfurniturey
谢谢。我发现粗体字不在那里。:\ - Olin Kirkland
我将粗体样式嵌入并导出为ActionScript,现在它可以正常工作了。 - Olin Kirkland

3

Flash的TextField有一个称为htmlText的属性,如果您使用它而不是常规的text属性,则可以在文本字段中放置html,使您能够像HTML页面上一样使用href标记在特定“链接”上。

myTextField.htmlText = "<a href='http://blahblahblah.com/apples'>Apples</a>";

如果您想在Flash中执行一个函数,可以使用OR语句:

myTextField.htmlText = "<a href='event:myEvent'>Click Me.</a>"
myTextField.addEventListener(TextEvent.LINK, linkClickHandler);

function linkClickHandler(e:TextEvent):void {
    trace(e.text); // myEvent
}

感谢您的回答!真是太棒了! - Olin Kirkland

3
您可以使用htmlText和链接事件来检测并重定向到不同的文章:
var link:String = "apples";

text.htmlText = '<a href="event:' + link+ '">' + link + '</a>'; 
text.addEventListener(TextEvent.LINK,linkEvent);

function linkEvent(event:TextEvent):void 
{   
    trace(event.text);
    if(event.text == "apples")
    {
       //do stuff
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接