解决ajax返回innerHTML中javascript不能运行问题

 在实际应用的过程中,我们经常会遇到使用ajax返回某一个网页的内容到模版页面的某一个<div>标签中显示的操作。如果返回的值仅仅是文本类数据不会影响模版页面的功能,但是如果返回的数据包括javascript,那么直接innerHTML到模版页的这段脚本是不会被运行的。原因在于浏览器只在显示模版时才解析javascript,而使用ajax返回的js是被后期倒入的并没有被解析,所以调用的时候找不到对应的function()。

想要解决这个问题,最基本的方法就是需要让浏览器可以同时解析<div>标签中的js。如果单适用IE浏览器,最简单的方式就是在<div>中的<script>标签中添加属性defer,它可以通知IE该脚本需要异步解析。但是令人头痛的是Firfox的标准总是和IE有着各种各样的不同,由于FF不支持defer所以使得开发者不得不另辟蹊径来解决这个问题。

实际上,我们可以在ajax返回数据并innerHTML到模版之前先把<div>中的javascript取出并写到模版页面的<head>中让浏览器解析。这样就相当于在打开模版页面的同时加载了所有<div>标签需要的javascript。奇怪的是这些脚本必须添加在<head>标签中FF才能有效,如果有人知道原因希望可以指点偶一下。

实现方法举例:

function  get_div_content(divid) {
        
        
var xmlHttp = GetXmlHttpObject();
        
var url = "http://" + document.location.host + "/divpage.jsp?id="+divid+"&random="+Math.random();
        
var div_content_id = "drag_content_"+divid;
        
var xmlHttp=GetXmlHttpObject();
            
if (xmlHttp==null)
            
{
                alert (
"AJAX初期化失敗!");
                
return;
            }

            xmlHttp.onreadystatechange
=function(){
               
                
if(xmlHttp.readyState < 4){
                    document.getElementById(div_content_id).innerHTML
="Loading...";
                }
    
                
if(xmlHttp.readyState==4){
                    //用正则表达式匹配ajax返回的text中是否有onload,如果存在则取出内容。 
                      
var reg_onload = /<body onLoad="([^<]*)">/;
                      
var match_onload=xmlHttp.responseText.match(reg_onload);            
                    //用正则表达式匹配ajax返回的text中是否有<script>,如果存在则取出标签内部的内容。       
                    
var reg = /<script[^>]*>([sS]*)</script>/;
                    
var match=xmlHttp.responseText.match(reg);

                    
var MyScript="";
                    
if(match!=null){
                        MyScript
=match[1];
                        
var script=document.createElement("script");//在模版页创建新的<script>标签
                        script.text
=MyScript;//给新的script标签赋值
                        document.getElementsByTagName(
"head")[0].appendChild(script);//把该标签加入<head>
                        }

                    
var Html=xmlHttp.responseText.replace(reg,"");//将剩下的text祛除<script>部分,插入模版页
                    document.getElementById(div_content_id).innerHTML
=Html;
                       
if(match_onload!=null){
                          eval(match_onload[
1]);//如果存在onload方法,则调用;
                      }

                   }

            }

            xmlHttp.open(
"GET",url,true);
            xmlHttp.send(
null);
    }

test.html

< table >
    
< script  type ="text/javascript"  defer ="defer" >
     
function test(){alert('测试下,用ajax的话,这段代码也会执行的!');}
    
</ script >
    
< tbody >
       
< tr >
          
< td >< input  onclick ="test()"  value ="click me"  type ="button" ></ td >
       
</ tr >
     
</ tbody >
</ table >
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在 JSP 页面显示 AJAX 请求返回的参数,你可以使用 JavaScript 和 DOM 操作。以下是一个示例代码: 1. 在 JSP 页面添加一个元素用于显示返回的参数,比如 <div id="result"></div>。 2. 编写一个 JavaScript 函数用于发送 AJAX 请求并将返回的参数显示在页面上,示例如下: ``` function sendAjaxRequest() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("result").innerHTML = this.responseText; } }; xhttp.open("GET", "ajax_request.jsp", true); xhttp.send(); } ``` 3. 在 JSP 页面添加一个按钮或链接,用于触发 AJAX 请求,比如 <button onclick="sendAjaxRequest()">发送请求</button>。 4. 在服务端编写一个 JSP 页面,用于处理 AJAX 请求并返回参数,比如 ajax_request.jsp。在这个页面,你可以通过 request 对象获取请求参数,通过 response 对象返回响应参数,比如: ``` <% String param = request.getParameter("param"); String result = "Hello, " + param + "!"; response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(result); %> ``` 当你点击发送请求按钮时,JavaScript 函数 sendAjaxRequest() 会向 ajax_request.jsp 发送一个 AJAX 请求,并在返回参数后将其显示在页面上。注意,ajax_request.jsp 返回的参数必须是一个纯文本字符串,否则显示可能会出现问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值