`
diding
  • 浏览: 80377 次
  • 性别: Icon_minigender_1
  • 来自: 四川
社区版块
存档分类
最新评论

LinkElement的鼠标事件

阅读更多
虽然TextFlow的LinkElement支持MouseEvent,但官方手法,很遗憾要打浏览器窗口,还要用户加上CTRL键,如果是前台浏览到无所谓,但如果作为编辑器使用,真得有一种说不出的感觉.
linkElement.addEventListener(MouseEvent.CLICK,LinkElementCtrlClickHandler,false, 0, false);

private function LinkElementCtrlClickHandler(event:FlowElementMouseEvent):void{
	var linkElement:LinkElement=event.flowElement as LinkElement;
        //编辑和删除等
	doOpenURLWinHandler(linkElement);
}


经过昨天的研究,终于找到一种更为好的方法来实行作为编辑器的手法实现:
要实现此功能必须解决2个问题:

1.用户在编辑时加入超链接后,像插入图片一样,要获得当前的链接接对象LinkElement,前加上事件(官方没有直接给出,只有自已来摸索实现)
2.如果用户不断的加入超链接,如何得到其实体对象(本想用EventDispatcher,如是用,又走上了老路,于是,又得遍历当前TextLine,得textLine只有两个子对象,shape,不能象ILG那样来根据name对比获取,最后,想到的办法就是根据
var absIndex:int=LE.getAbsoluteStart();
var between:int=absIndex+LE.textLength;

来对比实现)
核心代码:
/***********************************************************
		 ************************ 设置链接模块********************
		 * *********************************************************/
		 //打开链接窗口
		public function doOpenURLWinHandler(linkElement:LinkElement=null):void
		{
			if (linkElement){
				var window:URLWindow=URLWindow(PopUpManager.createPopUp(toolBar, URLWindow, true));
				window.getWinFindArg(this,linkElement,linkElement.href, linkElement.target, true)
			}else if (selStart != selFinish){
				var window2:URLWindow=URLWindow(PopUpManager.createPopUp(toolBar, URLWindow, true));
				window2.getWinFindArg(this)
			}else{
				Alert.show("请选择文字", "提示信息")
			}
		}
		//设置或编辑链接
		private var watchIndex:int;
		public function setOrEditURL(currentLinkElement:LinkElement=null,urlStr:String=null, click_target:String=null):void
		{
			var em:EditManager=EditManager(_textFlow.interactionManager);
			if(currentLinkElement!=null){
				//编辑
				var beginIndex:int=currentLinkElement.getAbsoluteStart();
				watchIndex=beginIndex
				var lastIndex:int=beginIndex+currentLinkElement.textLength;
				em.setSelection(beginIndex,lastIndex)
			}else{
				//添加
				em.setSelection(selStart,selFinish);
				watchIndex=selStart;	
			}
			em.applyLink(urlStr, click_target, false, null);
			_textFlow.interactionManager.setFocus();
			_textFlow.flowComposer.updateAllContainers();
			_textFlow.addEventListener(UpdateCompletionEvent.UPDATE_COMPLETE,createLEHandler)
		}
		
		private function createLEHandler(event:UpdateCompletionEvent):void{
			var spanElement:SpanElement=_textFlow.findLeaf(watchIndex) as SpanElement;
			//trace(spanElement.parent);
			var linkElement:LinkElement=spanElement.parent as LinkElement;
			if(linkElement){
			   var LEdispatcher:EventDispatcher=linkElement.getEventMirror();
			   LEdispatcher.addEventListener(MouseEvent.CLICK, LinkElementHandler,false, 0, false);
			    //官方手法,很遗憾要打浏览器窗口,还要用户加上CTRL键
			    //linkElement.addEventListener(MouseEvent.CLICK,LinkElementCtrlClickHandler,false, 0, false);
			}
		}
		
		private function LinkElementCtrlClickHandler(event:FlowElementMouseEvent):void{
			var linkElement:LinkElement=event.flowElement as LinkElement;
			doOpenURLWinHandler(linkElement);
		}
		
		private function LinkElementHandler(event:MouseEvent):void
		{
			var textLine:TextLine=event.currentTarget as TextLine;
			var textFlowLine:TextFlowLine=textLine.userData as TextFlowLine;
			var paraElement:ParagraphElement=textFlowLine.paragraph as ParagraphElement;
			

			trace("numChildren=="+paraElement.numChildren)
			
			for(var k:int=0;k<paraElement.numChildren;k++){
				var childElement:*=paraElement.getChildAtIndex(k);
				if(childElement is LinkElement){
					var currentLE:LinkElement=childElement as LinkElement;
					//判断参考
					//由于鼠标点击时,selStart==selFinish,所以只需要判断selStart相当于caret
					//是否位于linkElement文字块中,
					//调度此事件
					var absIndex:int=currentLE.getAbsoluteStart();
					var between:int=absIndex+currentLE.textLength;
					if(selStart<between){
						trace(currentLE.href)
					    trace(currentLE.target)
						break;
					}
					
				}
			}
			
		}
		//删除链接
		public function delURL(currentLinkElement:LinkElement):void
		{
			//获取linkElement开始和结束位置
			var beginIndex:int=currentLinkElement.getAbsoluteStart();
			watchIndex=beginIndex;
			var lastIndex:int=beginIndex+currentLinkElement.textLength;
			var em:IEditManager=IEditManager(_textFlow.interactionManager);
			em.setSelection(beginIndex,lastIndex)
			em.applyLink("", null, false, null);
			_textFlow.interactionManager.setFocus();
			
		}


附上运行测试的图片:

  • 大小: 15.2 KB
分享到:
评论

相关推荐

    javascript完全学习手册2 源码

    10.5.1 鼠标事件 10.5.2 键盘事件 10.5.3 表单事件 10.5.4 编辑事件 10.5.5 页面事件 第11章 使用Cookie和文件 11.1 Cookie 11.1.1 Cookie概述 11.1.2 Cookie属性 11.1.3 创建Cookie 11.1.4 ...

    javascript完全学习手册1 源码

    10.5.1 鼠标事件 282 10.5.2 键盘事件 286 10.5.3 表单事件 291 10.5.4 编辑事件 295 10.5.5 页面事件 297 第11章 使用Cookie和文件 303 11.1 Cookie 303 11.1.1 Cookie概述 303 11.1.2 Cookie属性 305 11.1.3 创建...

    处理Selenium3+python3定位鼠标悬停才显示的元素

    先给大家介绍下Selenium3+python3–如何定位鼠标悬停才显示的元素 定位鼠标悬停才显示的元素,要引入新模块 # coding:utf-8 from selenium import webdriver ...mouse = driver.find_element_by_link_text(设置

    编译的 HTML 帮助文件 (.chm) DHTML手册

    下面的例子演示了在浏览器的状态栏上显示鼠标当前位置的事件句柄函数,所得位置相对于文档的左上角。 SHOWExample &lt;HEAD&gt;&lt;TITLE&gt;报告鼠标移动 function reportMove() { window.status = "X=" + window.event.x +...

    Python爬虫信息输入及页面的切换方法

    实现网页的键盘输入操作 from selenium.webdriver.common...#find_element_by_class_name可以是find_element_by_link_text、find_element_by_id等其他方式 #send_keys一些特殊字符串,可以通过help(Keys)显示出来,如实

    《javaScrip开发技术大全》源代码

    • sample18.htm 通过事件调用JavaScript代码 • sample19.htm 一段错误的JavaScript代码(调试用) 第3章(\代码\第03章) • sample01.htm 转换成数字型 第4章(\代码\第04章) • ...

    js使用小技巧

    根据鼠标获得元素: document.elementFromPoint(event.x,event.y).tagName=="TD document.elementFromPoint(event.x,event.y).appendChild(ms) 窗体图片 document.images[索引] 窗体事件绑定 document....

    ArcGIS开发教程

    1.3.10. 如何建立文件连接(Join / Link) 50 1.3.11. 如何浏览纪录(属性查询) 52 1.3.12. 如何编辑记录 53 1.3.13. 如何增加记录 54 1.3.14. 如何删除记录 56 1.3.15. 如何纪录排序(ITableSort) 58 1.3.16. 如何添加...

    jQuery开发技巧

    当鼠标获得焦点 失去焦点的时候 input输入框文字处理: $ document ready function { $ &quot;input text1&quot; val &quot;Enter your search text here&quot; ; textFill $ &quot;input text1&quot; ; } ; ...

    出现问题a is defined高手帮忙

    //鼠标按下事件 DragZoomControl.prototype.coverMousedown_ = function(e){ var G = this.globals; var pos = this.getRelPos_(e); G.startX = pos.left; G.startY = pos.top; if (e.which) { var ...

    AngularJS优雅的自定义指令

    接下来,我们来做一个小案例,当鼠标单击加价后,列表项自动递增,当然列表也是通过指令自动添加的,它本就是一个空的div &lt;!DOCTYPE&gt; &lt;!-- use module --&gt; &lt;html ng-app="exampleApp"&gt; &lt;head&gt;...

    非常精美的h5 进度条

    --&lt;link rel="stylesheet" type="text/css" href="css/normalize.css" /&gt;--&gt; &lt;link rel="stylesheet" href="http://fonts.useso.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic,700,700...

Global site tag (gtag.js) - Google Analytics