在不做处理的情况,innerHTML->responseText 返回的 javascript 脚本是无效的;
现在我们做如下的处理:
var Id;
//myRequsest对象的声明,要放到两个方法之外,以保证两个方法获得的同一个对象
var myRequest;
function t1(id,url) {
Id = id;
///Ajax begin------------------->
if(window.XMLHttpRequest) { // 非IE浏览器
myRequest = new XMLHttpRequest();
if(myRequest.overrideMimeType) {
myRequest.overrideMimeType("text/xml");
}
} else if (window.ActiveXObject) { // IE浏览器
try{
myRequest = new window.ActiveXObject("Msxml2.XMLHTTP");
}
catch(e){
try{
myRequest = new window.ActiveXObject("Microsoft.XMLHTTP");
}
catch(e) {
}
}
}
//注册一个无参的回调方法
myRequest.onreadystatechange = t2;
//提交到哪儿去
myRequest.open("Post",url,true); // 有外部的项目名如: /项目名/命名空间/方法
myRequest.send(null);
}
function t2() {
if (myRequest.readyState == 4) {
var ret = myRequest.responseText;
//后续处理
document.all(Id).innerHTML = ret;
executeScript(ret);
}
}
t1是Ajax原方法,t2是Ajax的回调方法,executeScript是自定义方法如下:
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(code) //执行脚本
} catch (e) { }
}
}
}
这样一般情况就能满足Ajax返回数据含js脚本的问题。