您可以使用文本框的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>');
上面建立一个|
-separated 关键字列表并进行单个替换(而不是每个关键字的替换)的原因是因为分隔列表将按顺序进行替换,并且不允许找到的关键字破坏插入的 HTML以前的关键字(例如,您有一个关键字“event” - 如果将其替换为 make ,HTML 会中断<a href="<a href="event:event">event</a>:keyword1">keyword1</a>
)。
文本的原始大小写将与事件一起发送。您可以搜索所有现有关键字并将它们与传递给事件的关键字进行比较(将两者都转换为小写以.toLowerCase()
进行比较),或者您可以制定一个规则,即主关键字始终为小写且没有担心每次都在列表中搜索。