Ajax 执行返回的服务器端返回的js

时间:2022-12-02 10:13:33

服务器端: 
    $s='window.location.href="index.php?cmd=user.go_login"';
    echo '<div style="display: none"><iframe style="display:none" onload=javascript:'.$s.'></iframe></div>';

参考1:

http://www.impng.com/web-dev/execscript-loaded-by-ajax.html

事件背景

有一个公用页面需要在多个页面调用,其中涉及到部分js已经写在了公用页面中,通过ajax加载该页面后无法执行其中的js。

解决思路

1. 采用附加一个iframe的方法去执行js,为我等代码洁癖者所不齿。

2. 使用document.write输出代码,我等简洁主义者所不愿。

3. 最简单的方法是把js放到需要调用的父页面,那想这样的公用页面,每个地方调用都要写入一次,代码冗余。

4. eval是个解决方法,虽然低效。

5. 复杂的解决方法:正则匹配出加载页面中的所有js,为这些js创建同样多个<script>标签,把js内容插入即可执行。但使用中发现,firefox可行,但IE还是不从。(师太,您就从了吧~)

解决方案

综合以上多种方式,排除不利因素,总结出一个比较实用的方法,可以满足类似这样公用页面的执行ajax加载的js的需求,在ajax加载的公用函数里面加上代码即可。主要代码如下:


// 第一步:匹配加载的页面中是否含有js
var regDetectJs = /<script(.|\n)*?>(.|\n|\r\n)*?<\/script>/ig;
var jsContained = ajaxLoadedData.match(regDetectJs);

// 第二步:如果包含js,则一段一段的取出js再加载执行
if(jsContained) {
	// 分段取出js正则
	var regGetJS = /<script(.|\n)*?>((.|\n|\r\n)*)?<\/script>/im;

	// 按顺序分段执行js
	var jsNums = jsContained.length;
	for (var i=0; i<jsNums; i++) {
		var jsSection = jsContained[i].match(regGetJS);

		if(jsSection[2]) {
			if(window.execScript) {
				// 给IE的特殊待遇
				window.execScript(jsSection[2]);
			} else {
				// 给其他大部分浏览器用的
				window.eval(jsSection[2]);
			}
		}
	}
}

解说下:window.execScript就IE认,其他浏览器需要用eval啦。

参考2:

http://www.impng.com/web-dev/execscript-loaded-by-ajax.html

解决ajax加载的javascript不被执行的问题

关键字: ajax javascript 执行 加载
用ajax 加载的页面如果带javascript,在IE中不被执行
使用下面的方法解决

xml 代码
 
  1. <div style="display: none">  
  2.     <iframe style="display:none" onload="javascript: myJavascriptFunction()"></iframe>  
  3. </div>