Oli*_*and 3 events text actionscript-3
所以我自己为自己做了一个'wiki'式的应用程序给一些在Dropbox上工作的朋友,这意味着所有文件都存储在本地并由所有人更新.
每个文件都是由闪存拉入的.txt,然后使用简单的导航和搜索工具显示.
现在我试图更进一步,并从他们的内容链接文章.例:
第1条称为"苹果".它的内容:"苹果很好吃." 第2条被称为"熊".它的内容:'熊经常吃苹果'.
现在,当用户打开第2条时,我希望他们能够点击"apples"这个词,然后打开第1条("苹果").
我想知道如何创建在动态文本框中单击特定单词时触发的事件.不是整个动态文本框.
我曾想过以单词的形状创建可点击的动画片段,并将它们叠加在单词上,但如果有更简单的选项,那就太麻烦了.
您可以使用文本框的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);
}
Run Code Online (Sandbox Code Playgroud)
更新
如果你想忽略关键字的情况,那么"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>');
Run Code Online (Sandbox Code Playgroud)
上面构建一个|分离的关键字列表并进行单个替换(而不是替换每个关键字)的原因是因为分离列表将按顺序进行替换,并且不允许找到的关键字中断插入的HTML以前的关键字(例如,您有一个关键字"event" - 如果将HTML替换为make,HTML将会中断<a href="<a href="event:event">event</a>:keyword1">keyword1</a>).
文本的原始案例将随事件一起发送.您可以搜索所有现有关键字并将其与传递给事件的关键字进行比较(将两者都转换为小写并.toLowerCase()进行比较),或者您可以制定主关键字始终为小写且不具有的规则担心每次都在搜索列表.