`
thewaychung
  • 浏览: 22867 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Flash TextField selectable bug block TextEvent.Link solution

阅读更多

There is an old version Felx SDK bug(in my case it's Flex SDK v3.3.0.4852) that when TextField.selectable is set to false, link event on the textfield will be blocked. So if you have added html text including a link into the textfield, e.g.:

            var textField:TextField = new TextField();
            textField.htmlText = "This is a testing message. <a href='event:clickHandler'>Click</a> to see more.";
            textField.selectable = false;
Then when you click "Click", it will not trigger "clickHandler" function. This will also happen when the anchor's href value is a URL, e.g.:
            var textField:TextField = new TextField();
            textField.htmlText = "This is a testing message. <a href='http://www.google.com' target='_blank'>Click</a> to see more.";
            textField.selectable = false;
When click "Click", browser will not open the Google page in a new tab. But you can actually right click on the link and select "Open" to open it.
 
The previous two situations are both caused by selectable property set to false using Flex SDK 3.3.0.4852. I have three solutions to fix this:
 
1. Set selectable to true;
2. Change Flex SDK to newly version;
3. Register event listener to handle click event;
 
The first two solutions are simple, I'll give some more details on the third solution which will not change selectable attribute nor SDK. The main idea is register MouseClick event on the textfield, when user click the text, check whether the position is on the link. If the mouse click is on the link text, use "navigateToURL" function to open the link.
 
1. New a TextField object and set accordingly:
            var textField:TextField = new TextField();
            textField.htmlText = "Testing message. <a href='http://www.google.com' target='_blank'>Click</a> to see more.";
            textField.selectable = false;
            var textFmtLink:TextFormat = new TextFormat();
            formatter.color = "0x3366BB";
            formatter.underline = true;
2. Use "formatFieldLinkText" function to formate the link text and register event listener to handle click event:
            formatFieldLinkText(textField, textFmtLink);

           protected function formatFieldLinkText(textField:TextField, linkFormat:TextFormat):void
        {
            var fieldText:String = textField.text;
            var textFormat:TextFormat = textField.getTextFormat();
            var formatedText:String = "";
            var linkObjArray:Array = [];
           
            var textArray:Array = fieldText.split(/(<a\s[^>]+>.+?<\/a>)/gi );
            var linkTextPattern:RegExp = new RegExp("(?i)[^>]*(?=</a>)" );
            var linkUrlPattern:RegExp = /href\s*=\s*['"]([^'"]+)['"]/i;
            var linkTargetPattern:RegExp = /target\s*=\s*['"]([^'"]+)['"]/i ;
            for (var i:int = 0; i < textArray.length; i++)
            {
                //plain text
                if (textArray[i].toString().search(/(<a\s[^>]+>.+?<\/a>)/gi )==-1)
                {
                    formatedText+=textArray[i].toString();
                    continue;
                }
               
                var linkText:String = linkTextPattern.exec(textArray[i]);
                // check if linkText is blank
                if (isBlank(linkText))
                {
                    return;
                }
                var linkUrl:Array = linkUrlPattern.exec(textArray[i]);
                var linkTarget:Array = linkTargetPattern.exec(textArray[i]);
                if (linkUrl==null)
                {
                    return;
                }
                var linkObj:Object = new Object();
                linkObj.href = linkUrl== null?"" :linkUrl[1];
                linkObj.target = linkTarget== null?"" :linkTarget[1];
                linkObj.linkBegin = formatedText.length;
                linkObj.linkEnd = formatedText.length + linkText.length;
                linkObjArray.push(linkObj);
               
                formatedText+=linkText;
               
                textField.addEventListener(MouseEvent.CLICK, hyperLinkClicked);
            }
            textField.text = formatedText;
            textField.setTextFormat(textFormat);
            for (var j:int = 0; j < linkObjArray.length; j++)
            {
                textField.setTextFormat(linkFormat, linkObjArray[j].linkBegin, linkObjArray[j].linkEnd);
            }
           
            var href:String = "";
            var target:String = "";
            function hyperLinkClicked (e:MouseEvent):void
            {
                var idx:int = e.currentTarget.getCharIndexAtPoint(e.localX, e.localY);
                if (posOnLink(idx))
                {
                    var request:URLRequest = new URLRequest(href);
                    navigateToURL(request, target);
                }
            }
           
            // can optimize the search method
            function posOnLink(idx:int):Boolean
            {
                for (var k:int = 0; k < linkObjArray.length; k++)
                {
                    if (idx >= linkObjArray[k].linkBegin && idx < linkObjArray[k].linkEnd)
                    {
                        href = linkObjArray[k].href;
                        target = linkObjArray[k].target;
                        return true ;
                    }
                }
                return false ;
            }
        }
 

 

1
2
分享到:
评论

相关推荐

    flash textfield 旋转文本

    textField.text = "Hello, World!"; textField.rotation = 45; // 设置旋转角度为45度 ``` 在ActionScript 3.0中,你应使用`transform.matrix`的`rotate()`方法: ```actionscript var textField:TextField = ...

    Ext.form.TextField最简单的用法.docx

    `Ext.form.TextField`是Ext JS库中的一个组件,用于创建基本的文本输入字段。它在Web应用程序中广泛用于收集用户输入的数据,如用户名、搜索关键词等。以下是对`Ext.form.TextField`的一些主要特性和配置选项的详细...

    ios-Textfield单个字符跳格子.zip

    每个格子限制一个字符,当前选中的textfield输入完字符后,光标提前跳到后面的textfield进入编辑状态;可以隔着格子寻找空的格子进行跳转,后面的空的格子输入完字符可以进行前面的空格子输入;方便身份证号和车牌号...

    ios-textfield控件的实时监听.zip

    let currentText = (textField.text ?? "") as NSString let newLength = currentText.length + string.count - range.length return newLength } ``` 这段代码会确保用户最多只能输入10个字符,一旦超过这个...

    ios-一行代码解决textField输入中文长度限制.zip

    textField输入中文字符时,直接在代理方法里限制会有问题,因为系统会将高亮部分一起算入字符数,从而造成明明没有到达限制上限,输不进去的情况。 该方法利用分类与runtime结合,用block作为回调,只需一行代码即可...

    J2ME入门视频教程.05(TextField使用和事件).rar

    很适合开始学习J2me的编程的朋友, 从配置环境,到第一个程序,很详细一步步演示。压缩包只包含 .avi 视频文件,没有多余的其他文件,绝对放心吧。这是适合刚接触j2me ,或者想开发手机编程但是 无从下手的朋友,很...

    flash action script 经典字典教程大全,学flash必备

    flash action script 经典字典教程大全,学flash必备 -- --(递减) ++ ++(递增) ! !(逻辑 NOT) != !=(不等于) !== !==(不全等) % %(模) %= %=(模赋值) & &(按位 AND 运算符) && ...

    ActionScript 3动态文本滚动条模型

    另外,使用TextField.getLineInfo()和TextField.getCharIndexAtPoint()可以获取文本布局信息,帮助优化滚动和选择操作。 六、自定义滚动条 尽管ActionScript 3提供内置的滚动条,但它们的样式和功能可能无法满足...

    iOS——可限制最大字符的textfield

    标题提到的“iOS——可限制最大字符的textfield”就是一个这样的解决方案。 这个解决方案可能包含以下几个关键功能: 1. **最大字符限制**:通过监听`UITextField`或`UITextView`的`textDidChange`事件,我们可以...

    ios-TextField自动换行.zip

    textField.inputView = UIView(frame: CGRect(x: 0, y: 0, width: textField.frame.width, height: textField.frame.height)) let textView = UITextView(frame: .zero, textContainer: textContainer) textView....

    TextField-InputView, UITextField InputView模式:终结注册类、信息采集类.zip

    `TextField-InputView`项目就是基于这个特性进行深入实践的开源库,它的目标是终结传统注册类以及复杂的信息采集类,让开发者能更便捷地定制输入视图。 `UITextField`的`inputView`属性通常用来替代系统默认的键盘...

    flash动画 雪花栗子

    在本文中,我们将深入探讨如何使用Adobe Flash(现称为Adobe Animate)创建一款炫酷的“雪花栗子”动画效果。这个效果允许用户自定义文本,为数字营销、网站装饰或个人项目增添视觉吸引力。首先,让我们理解Flash的...

    用JAVA写的简单GUI

    JTextField textField1; JTextField textField2; JTextField textField3; JLabel label1,label2,label3,label4; myFrame(){ super("GUI exercise"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ...

    iOS-RxSwift-KVO、UI控件、手势、通知、定时器、网络请求的使用-Demo

    textField.rx.text.orEmpty .skip(1) // 跳过初始空值 .subscribe(onNext: { text in // 处理文本输入 }).disposed(by: disposeBag) ``` ### ScrollView与RxSwift 对于UIScrollView,可以监听其滚动事件或内容...

    ios-设置textfield占位符的颜色大小,开始编辑的时候可以让占位符跟着移动.zip

    textField.text = textField.attributedPlaceholder?.string UIView.animate(withDuration: 0.3) { textField.contentOffset = CGPoint(x: 0, y: -16) // 调整偏移量使占位符向上移动 } } else { textField....

    ext-3-TextField-sample.rar_ext_ext TextField_ext textfield inp

    在提供的压缩包中,"ext-3-TextField-sample.rar" 涉及到的是ExtJS 3.x版本中的TextField组件,这是一个基本的用户输入控件,常用于收集用户在网页上的文本信息。这个示例着重介绍了如何创建和使用TextField。 ...

    Java中TextField类.pdf

    textField.setText("Enter your text here..."); // 添加到容器 frame.getContentPane().add(textField); frame.pack(); frame.setVisible(true); } } ``` 在这个例子中,我们创建了一个30列的`TextField`...

    Flash实现文本框文字滚动.rar

    textField.text = "这是要滚动的文字"; addChild(textField); ``` 为了实现滚动功能,我们需要设置TextField的一些属性,如autoScroll、scrollV(垂直滚动条)和scrollH(水平滚动条)。例如: ```actionscript ...

    EXT dojochina文本框示例Ext.form.TextField.rar

    在本示例中,"EXT dojochina文本框示例Ext.form.TextField.rar"是一个压缩包,包含了EXT框架中关于`Ext.form.TextField`组件的示例代码。 `Ext.form.TextField`是EXT框架中的一个核心组件,用于创建基本的输入字段...

Global site tag (gtag.js) - Google Analytics