我要动态执行AJAX返回来的javascript. 根据网上的资料写了个测试页面. 但是正则表达式有问题:请帮忙改下. 谢谢!<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script language="javascript">
function execJs(htmlStr) {
if(htmlStr == undefined || htmlStr == null) {
return htmlStr;
}

// 用正则表达式匹配ajax返回的text中是否有<script>,如果存在则取出标签内部的内
var reg = /<script[^>]*>([sS]*)</script>/;
var matchJs = htmlStr.match(reg);
if( matchJs != null ) {
for( var i = 1; i <= matchJs.length; i++ ) {
var script = document.createElement("script"); //在模版页创建新的<script>标签
script.type = "text/javascript";
script.appendChild(document.createTextNode(matchJs[i]));//txt is the code
document.getElementsByTagName("head")[0].appendChild(script); //把该标签加入<head>
}
}

var noJsHtml = htmlStr.replace(reg, ""); //将剩下的text祛除<script>部分,插入模版页

// 用正则表达式匹配ajax返回的text中是否有onload,如果存在则取出内容。 
reg= /<body onLoad="([^<]*)">/;
var matchOnload = htmlStr.match(reg); 
if(matchOnload != null) {
eval(matchOnload[1]);
}
return noJsHtml;
}
</script>
</head><body>
<script language="javascript">
alert(execJs("xxxxx<script language='javascript'>alert('inner script');</script>"));
</script>
</body>
</html>

解决方案 »

  1.   


    var reg = /<script[^>]*>([sS]*)<\/script>/ig;
      

  2.   


    var reg = /<script[^>]*>([\s\S]*)<\/script>/ig;
      

  3.   


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
    <title>无标题文档 </title> 
    <script language="javascript"> 
    function execJs(htmlStr) {
        if (htmlStr == undefined || htmlStr == null) {
            return htmlStr;
        }
        // 用正则表达式匹配ajax返回的text中是否有 <script>,如果存在则取出标签内部的内 
        var reg = /<script[^>]*>([\s\S]*)<\/script>/;
        var matchJs = htmlStr.match(reg);
        if (matchJs != null) {
            for (var i = 1; i <= matchJs.length; i++) {
    eval(matchJs[i]);
            }
        }    var noJsHtml = htmlStr.replace(reg, ""); //将剩下的text祛除 <script>部分,插入模版页     // 用正则表达式匹配ajax返回的text中是否有onload,如果存在则取出内容。 
        reg = /<body onLoad="([^ <]*)">/i;
        var matchOnload = htmlStr.match(reg);
        if (matchOnload != null) {
            eval(matchOnload[1]);
        }
        return noJsHtml;
    }
    </script> 
    </head> <body> 
    <script language="javascript"> 
    alert(execJs("xxxxx <sc" + "ript language='javascript'>alert('inner script'); </sc" + "ript>")); 
    </script> 
    </body> 
    </html> 
      

  4.   

    谢谢 hookee, Free_Wind22,为什么把
    ...
    execJs("xxxxx <sc" + "ript language='javascript'>alert('inner script'); </sc" + "ript>"); 
    ...
    改成
    execJs("xxxxx <script language='javascript'>alert('inner script'); </script>"); 就不可以了?
      

  5.   


     var xx = 'xxxxx <sc' + 'ript language="javascript">alert(111); </sc' + 'ript> xx2 <sc' + 'ript language="javascript">alert(222); </sc' + 'ript>';执行这个就有问题了. 里面包含两个script上面代码改部分:
    ....
     for (var i = 0; i < matchJs.length; i++) {
                eval(matchJs[i]);
            }
    ....
      

  6.   

    浏览器会把<script>之间的文字全部当成静态脚本处理。
      

  7.   

    恩. 好的. 谢谢! 因为是AJAX返回的html字符串, 没有对<script这个进行处理.
    而且字符串中可能有多个script 节点. 这个方法还要改进下.