1

我有一个 jsp 页面 DEMO1.jsp,我在其中编写了 ajax 代码以每 1 分钟刷新一次。在 DEMO1.JSP 中我有

<head>

    <script type='text/javascript'>
        setInterval(function(){
            document.getElementById('bgframe').contentWindow.myInternalFunction();
        }, 5*1000);

    </script>
</head>
<body onload="AutoRefreshValid();"  style="margin:1px;font-family: Serif, Arial,Times, serif;" id="ValidWaybills"><center>

    <iframe id='bgframe' style='display:none;' src='DEMO2.jsp'></iframe>

    <script type="text/javascript">
        function AutoRefreshValid(){
            var xmlHttp;
            try{
                xmlHttp=new XMLHttpRequest();// Firefox, Opera 8.0+, Safari
            }
            catch (e){
                try{
                    xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); // Internet Explorer
                }
                catch (e){
                    try{
                        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
                    }
                    catch (e){
                        alert("No AJAX");
                        return false;
                    }
                }
            }

            xmlHttp.onreadystatechange=function(){
                if(xmlHttp.readyState==4){
                    document.getElementById('ValidWaybills1Valid').innerHTML=xmlHttp.responseText;
                    setTimeout('AutoRefreshValid()',5*1000);
                }
            }

            xmlHttp.open("GET","DEMO2.jsp",true);
            xmlHttp.send(null);



        }
    </script>
    <div  id="ValidWaybills1Valid">

    </div>

我有 DEMO2.JSP,我在其中编写了 JAVASCRIPT 我必须在 DEMO1.JSP 中使用 AJAX 运行该 JAVASCRIPT,而无需每 5 秒重新加载一次页面

<head>


    <script type="text/javascript">
        function callme3(){

        <%  Date d1 = new Date();
        %>
                alert("Date is          <%=d1%>");
            }
    </script>
</head>
<body onload="callme3()">



</div>

感谢和 regads 苏达山

4

2 回答 2

1

XML Http 请求是关于发送一些东西和检索一些东西。执行检索到的数据不是其工作的一部分。

这是针对您的问题的天真/简单的解决方案,但不建议您这样做。

xmlHttp.open("GET", "SU3.jsp", true);
xmlHttp.onload = function(evt) {
  var div = document.createElement('div');
  div.innerHTML = evt.target.responseText;
  document.body.appendChild(div);
};
xmlHttp.send(null);

很长一段时间后,这段代码最终会导致浏览器崩溃。

正确的做法是让 SU3.jsp 以 json 或纯 html 格式返回数据,并将所有逻辑移至 SU2.jsp。


根据您提供的最新信息(应在第一个版本中提供),该解决方案非常简洁。

在 Su2.jsp 上,添加以下代码:

// assume map refers to the map object.
// and I use jQuery here to make the point clear, 
// it's ok to use XmlHttpRequest directly.

var timer = null;

function updateMarker() {

  $.get('su3.jsp', function(data) {
    for (var i = 0; i < data.length; i++) {
      var datum = data[i];
      new google.maps.Marker({
        map: map,
        position: new google.maps.LatLng(datum.pos.lat, datum.pos.lng),
        title: datum.title
      });
    }
    // after all jobs are done, set timeout for another update.
    // use setTimeout() instead of setInterval() to tolerate net latency.
    timer = setTimeout(updateMaker, 5000);
  });

}

// this should be called in onLoad() handler.
updateMaker();

在 SU3.jsp 上,您应该使用Content-Type: application/json. 它将制造商信息输出为:

[{"pos":{"lat":-25.363882,"lng":131.044922},"title":"Australia"}]
于 2012-11-10T07:34:33.710 回答
0

如果您只想从 SU3.jsp 执行 javascript,您可以通过 SU2.jsp 中的隐藏 iframe 调用它

将以下 JavaScript/标记添加到 SU2.jsp

<html>
<head>
  <script type='text/javascript'>

    setInterval(function(){
        document.getElementById('bgframe').contentWindow.location.reload();
    },60000); // reload every 60 seconds

  </script>
</head>
<body>
    <iframe id='bgframe' style='display:none;' src='SU3.jsp'></iframe>
</body>
</html>

请记住,如果 SU3.jsp 需要访问其父级 (SU2.jsp) 中的函数/变量,您将需要使用window.parent ,如此所述

另一方面,如果您只需要每 60 秒在 SU3.jsp 中调用一个 JavaScript 函数,您可以这样做:

document.getElementById('bgframe').contentWindow.myInternalFunction();

setInterval(function(){
    document.getElementById('bgframe').contentWindow.myInternalFunction();
}, 60000);
于 2012-11-10T08:31:07.243 回答