Flex(AS) JS抓取HTML页面元素数据

目前项目是Flex中嵌入HTML页面,在页面切换时需要保存上一个页面的输入未保存的数据,切回时把数据回填,在Flex中比较不好实现,所以想到使用JS脚本。

思路:

1、在Flex的HtmlLoade页面加载完成后,向页面中插入JS脚本

2、JS脚本加载成功后,回调Flex函数进行通知

3、在切换页面时

            首先,抓取被切走的页面中的数据并保存[键(pageurl): 值]

            然后,查找当前切换的页面在本地的数据,进行数据回填


AS代码段:

<mx:HTML id="htmlView" width="100%" complete="htmlView_completeHandler(event)" />

protected function htmlView_completeHandler(event:Event):void
{					
	insertCommentJSScipt(http://127.0.0.1/ntalker_autoform.js);
}

//插入JS脚本
private function insertCommentJSScipt(scriptURL:String):void
{
	if (htmlView && htmlView.domWindow) 
	{
		var bodyEle:Object = htmlView.domWindow.document.getElementsByTagName("body")[0];
		if (bodyEle) 
		{
			var scriptEle:Object = htmlView.domWindow.document.createElement("script");
			scriptEle.type = "text/javascript";
			scriptEle.async = "async";
			scriptEle.charset = "utf-8";
			scriptEle.src = scriptURL;
			bodyEle.insertBefore(scriptEle, bodyEle.lastChild);
		}
	}
}

//JS回调函数
public function webInfoChanged():void
{
	
}

private var _unSaveInfo:String = ""; //从本地取出的数据

//回填本地保存的数据
public function ntkf_setHTMLFormContent():void
{
	TRACE("ntkf_setHTMLFormContent ------------------------------");
	
	if(htmlView.htmlLoader 
		&& htmlView.htmlLoader.window 
		&& htmlView.htmlLoader.window.ntkf_setHTMLFormContent)
	{
		if(!_unSaveInfo || _unSaveInfo.length == 0 || _unSaveInfo == "{}")
			return;
		
		TRACE("ntkf_setHTMLFormContent _unSaveInfo = " + _unSaveInfo);

		//调用JS中ntkf_setHTMLFormContent函数进行数据自动回填
		htmlView.htmlLoader.window.ntkf_setHTMLFormContent(_unSaveInfo);
	}
}

//自动抓取页面数据
public function ntkf_getHTMLFormContent():void
{
	if(htmlView.htmlLoader 
		&& htmlView.htmlLoader.window 
		&& htmlView.htmlLoader.window.ntkf_getHTMLFormContent)
	{
		var unsaveInfo:String = htmlView.htmlLoader.window.ntkf_getHTMLFormContent();
	}
}


以上的Flex代码片段仅供参考,在使用时需要自己整理,并放到合适的位置,以适应自己的需要


JS代码片段:

//脚本中只是简单地抓取了 input、textarea、select、checkbox、radio元素的数据
//并且以元素的id优先、name其次为原则

function ntkf_getHTMLFormContent() {
	var result = {};
	var inputs = document.getElementsByTagName('input');
	var textareas = document.getElementsByTagName('textarea');
	var selects = document.getElementsByTagName("select");
	
	//获取页面中多有input元素的值
	for (var i = 0, l = inputs.length; i < l; i++) {
	   
	   var input = inputs[i];
	   
	   if (input.type === 'text' && input.value) {
	    	
	    	if(input.id){
	    		result[input.id] = input.value;
	    	}else if(input.name){
	    		result[input.name] = input.value;
	    	}
	    	
	    }else if (input.type === 'radio' && input.checked) {
	    	
	    	if(input.id){
	    		result[input.id] = input.value;
	    	}else if(input.name){
	    		result[input.name] = input.value;
	    	}
	    	
	    }else if (input.type === 'checkbox' && input.checked) {
	    	
	    	if(input.name){
	    		
	    		result[input.name + '_' + input.value] = input.value;
	    		
	    	}else if(input.id){
	    		result[input.id + '_' + input.value] = input.value;
	    	} 

	    }
	}
	
	//获取页面中所有select元素的值
	for (var i = 0, l = selects.length; i < l; i++) {

		var select = selects[i];

		if(select.id){

			result[select.id] = select.selectedIndex;

		}else if(select.name){

			result[select.name] = select.selectedIndex;
		}
	}

	//获取页面中所有textarea元素的值
	for (var i = 0, l = textareas.length; i < l; i++) {
		
		var textarea = textareas[i];
		
		if (textarea.value) {
	    	
			if(textarea.id){
				result[textarea.id] = textarea.value;
			}else if(textarea.name){
				result[textarea.name] = textarea.value;
			}
	    }
	}
  return JSON.stringify(result);
}

function ntkf_setHTMLFormContent(str) {
  	var result = JSON.parse(str);
  	var inputs = document.getElementsByTagName('input');
  	var textareas = document.getElementsByTagName('textarea');
	var selects = document.getElementsByTagName("select");

  	for (var key in result) {
   
		//输入框input赋值
		for (var i = 0, l = inputs.length; i < l; i++) {
			var input = inputs[i];
	
	 		if (input.type === 'text') {
	 			
	 			if(input.id && input.id === key){
	 				
	 				input.value = result[key];
	 				
	 			}else if(input.name && input.name === key){
	 				
	 				input.value = result[key];
	 				
	 			}
	 			
    		}else if(input.type === 'radio' && input.value === result[key]) {
    			
    			if(input.id && input.id === key){
    				
    				input.checked = 'checked';
    				
    			}else if(input.name && input.name === key){
    				
    				input.checked = 'checked';
    			}
	  			
			}else if(input.type === 'checkbox') {
	  			
	  			if(input.name && input.name + '_' + input.value === key){
    				
    				input.checked = 'checked';
    				
    			}else if(input.id && input.id + '_' + input.value === key){
    				
    				input.checked = 'checked';
    			}
			}
  		}
		
		//下拉框select赋值
		for (var i = 0, l = selects.length; i < l; i++) {

			var select = selects[i];

			if(select.id && select.id === key){
				
				select.selectedIndex = result[key];
				
			}else if(select.name && select.name === key){
				
				select.selectedIndex = result[key];
			}
		}

		//textarea赋值
		for (var i = 0, l = textareas.length; i < l; i++) {
			var textarea = textareas[i];
			
			if(textarea.id && textarea.id === key){
				
				textarea.value = result[key];
				
			}else if(textarea.name && textarea.name === key){
				
				textarea.value = result[key];
			}
		}
    
  	}
  	
  	if (window.webInfoChanged) {
  			window.webInfoChanged();
		} 
}

var t1;

if (!window.webInfoChanged) {
	//设置一个定时器来避免Flex页面加载和脚本加载之间的时间差,保证能通知到Flex
	t1 = setInterval(execWebInfoChanged, 500);
} else {
  window.webInfoChanged();
}

function execWebInfoChanged()
{
	if(window.webInfoChanged)
	{
		window.webInfoChanged();
		
		clearInterval(t1);
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值