博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
执行ajax加载页面中的js总结
阅读量:4656 次
发布时间:2019-06-09

本文共 2492 字,大约阅读时间需要 8 分钟。

 

看了《》一文,最近刚好被这个问题纠结过,献给痛不欲生的童鞋们…

事件背景

有一个公用页面需要在多个页面调用,其中涉及到部分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 = /
(.|\n|\r\n)*?<\/script>/ig; var jsContained = ajaxLoadedData.match(regDetectJs);
// 第二步:如果包含js,则一段一段的取出js再加载执行 if(jsContained) {
// 分段取出js正则 var regGetJS = /
((.|\n|\r\n)*)?<\/script>/im;
// 按顺序分段执行js var jsNums = jsContained.length; for (var i=0; i
if(jsSection[2]) {
if(window.execScript) {
// 给IE的特殊待遇 window.execScript(jsSection[2]); } else {
// 给其他大部分浏览器用的 window.eval_r(jsSection[2]); } } } }

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

至此,算比较完美的解决。

function executeScript(html) {

var reg =
/<script[^>]*>([^\x00]+)$/i;
//对整段HTML片段按<\/script>拆分
var
htmlBlock = html.split("<\/script>");
for ( var i in
htmlBlock) {
var
blocks;//匹配正则表达式的内容数组,blocks[1]就是真正的一段脚本内容,因为前面reg定义我们用了括号进行了捕获分组
if
(blocks = htmlBlock[i].match(reg))
{
//清除可能存在的注释标记,对于注释结尾-->可以忽略处理,eval一样能正常工作
var
code = blocks[1].replace(/<!--/, '');
try
{
//eval_r(code)
//执行脚本
if (!!(window.attachEvent &&
!window.opera))
{
//ie
execScript(code);
}
else {
//not
ie
window.eval_r(code);
}

} catch (e)

{
}
}
}
}

另外:

//运行ajax返回js脚本

function evalGlobal(strScript){
var a = document .createElement_x ("script" );
a.type=
"text/javascript" ;
a.text= strScript
;
document .getElementsByTagName_r("head" )[0 ].a (a)
;
}

function executeScript(html) {

var reg =
/<script[^>]*>([^\x00]+)$/i;
//对整段HTML片段按<\/script>拆分
var
htmlBlock = html.split("<\/script>");
for ( var i in htmlBlock)
{
var
blocks;//匹配正则表达式的内容数组,blocks[1]就是真正的一段脚本内容,因为前面reg定义我们用了括号进行了捕获分组
if
(blocks = htmlBlock[i].match(reg))
{
//清除可能存在的注释标记,对于注释结尾-->可以忽略处理,eval一样能正常工作
var
code = blocks[1].replace('/\<\!\-\-/', '');
code =
code.replace('/\-\-\>/', '');
try
{
evalGlobal(code);
//eval_r(code)
//执行脚本

} catch (e)

{
}
}
}
}

在ajax回调函数中这样处理:

function loadCallBack() {

if (xmlHttp.readyState == 4 &&
xmlHttp.status == 200) {
hideLoading();
var
response =
xmlHttp.responseText;
document.getElementByIdx_x("Container").innerHTML
= response;
executeScript(response);
} else
{
showLoading();
}

}

转载于:https://www.cnblogs.com/cjunj/archive/2011/08/29/2157421.html

你可能感兴趣的文章