Flash AS3中的文本链接

时间:2012-08-20 16:34:05

标签: actionscript-3 events text

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

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

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

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

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

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

我曾想过以单词的形状创建可点击的动画片段,并将它们叠加在单词上,但如果有更简单的选项可能会有太多麻烦。

3 个答案:

答案 0 :(得分: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”也是如此),你需要使用正则表达式,这样你也可以保持单词in-is in文字:

// 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” - 如果HTML被替换为make <a href="<a href="event:event">event</a>:keyword1">keyword1</a>,HTML就会中断。)

文本的原始案例将随事件一起发送。您可以搜索所有现有关键字,并将其与传递给事件的关键字进行比较(将两者转换为小写,并使用.toLowerCase()进行比较),或者您可以制定主关键字为总是小写,不必担心每次都在搜索列表。

答案 1 :(得分:3)

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

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

或者如果你想留在flash中并执行一个函数:

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

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

答案 2 :(得分: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
    }
}