3

所以我自己为一些在 Dropbox 上工作的朋友制作了一个类似“wiki”的应用程序,这意味着所有文件都存储在本地并由每个人更新。

每个文件都是由闪存拉入的 .txt,然后使用简单的导航和搜索工具显示。

现在我正试图更进一步,并从他们的内容中链接文章。例子:

第 1 条被称为“苹果”。它的内容是:“苹果很好吃。” 第 2 条被称为“熊”。它的内容是:“熊经常吃苹果。”

现在,当用户打开第 2 条时,我希望他们能够单击“苹果”一词,然后打开第 1 条(“苹果”)。

我想知道如何创建在动态文本框中单击特定单词时触发的事件。不是整个动态文本框。

我曾想过创建可点击的单词形状的电影剪辑并将它们分层覆盖在单词上,但如果有更简单的选项可用,那就太麻烦了。

4

3 回答 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>');

上面建立一个|-separated 关键字列表并进行单个替换(而不是每个关键字的替换)的原因是因为分隔列表将按顺序进行替换,并且不允许找到的关键字破坏插入的 HTML以前的关键字(例如,您有一个关键字“event” - 如果将其替换为 make ,HTML 会中断<a href="<a href="event:event">event</a>:keyword1">keyword1</a>)。

文本的原始大小写将与事件一起发送。您可以搜索所有现有关键字并将它们与传递给事件的关键字进行比较(将两者都转换为小写以.toLowerCase()进行比较),或者您可以制定一个规则,即主关键字始终为小写且没有担心每次都在列表中搜索。

于 2012-08-20T16:41:11.897 回答
3

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

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

或者,如果您想留在闪存中并执行一个功能:

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

function linkClickHandler(e:TextEvent):void {
    trace(e.text); // myEvent
}
于 2012-08-20T16:40:26.400 回答
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
    }
}
于 2012-08-20T16:41:56.420 回答