【问题标题】:Refresh javascript calculations without reloading page刷新javascript计算而不重新加载页面
【发布时间】:2013-04-20 05:53:13
【问题描述】:

我有一个提交按钮,它使用 javascript xmlhttp 请求来调用 php 页面,其唯一功能是在我的主页上为 google earth 窗口编写 kml 文件。 php 页面在 Web 浏览器中无法以 html 格式查看。

php 文件中的公式按预期工作。我遇到的问题是,在我第一次手动按下提交后,我希望脚本继续每 5 秒重复一次,直到我手动重新加载页面(或按下按钮停止脚本)。因为我计划让多个用户同时查看该页面,每个用户被分配一个随机的 5 位数字来保存他们的会话信息并在新创建的会话文件夹中创建 kml 文件,直到他们重新加载页面(然后将创建用户的新会话号)。

因为每个用户都被指定了一个唯一的会话 ID,所以页面无法在 php 计算重复时重新加载。因此,我的 javascript 函数末尾有一个 return false 行。

我希望能够使用 javascript 调用 setInterval 来重复该功能而无需重新加载页面。如果页面要重新加载刚刚创建的 kml 文件,现在将无法在新会话中查看。让我知道是否有人有任何建议。以下是适用的代码。

主 index.php 页面上的 DIV id

<div>
  <form id="KMLsubmit" name=KMLsubmit >
    <input class="KMLsubmit" type="submit" value="Create KML" onclick="createKML()"/>
  </form>
</div> 

index.php 主页面上的 JavaScript 函数

function createKML() {
    $('#KMLsubmit').submit(function () {
        $.get("generateKML.php",function(data,status){
        });
        //alert("Generating your KML files!");
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp.onreadystatechange=function()
        {
            if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
                document.getElementById("kmldetails").innerHTML=xmlhttp.responseText;
            }
        }
  xmlhttp.open("POST","generateKML.php?session=" + session,true);
  xmlhttp.send();
  return false; 
    });
  }

如果有人对如何执行此操作有任何建议,请告诉我。感谢您的帮助。

【问题讨论】:

  • 你在用jquery,不是吗?
  • session 变量是如何创建的
  • $.get("generateKML.php",function(data,status){});的目的是什么?
  • 是的,利用我有限的知识。
  • 我正在使用 get 调用来允许从我的主 index.php 页面中调用 generateKML.php 页面。我尝试了很多东西,这是我可以开始工作的唯一安排。我确定我有错误,但这是唯一有效的方法。如果您有任何改进建议,请告诉我。谢谢。

标签: php javascript jquery


【解决方案1】:

createKML() 设为外部,在KMLsubmit 提交事件上调用它,设置超时功能为5 秒,并在下次提交时清除超时,然后像这样重新启动流程:

var myTimer = false;

function createKML() {
    var xmlhttp = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
            document.getElementById("kmldetails").innerHTML=xmlhttp.responseText;
        }
    }
    xmlhttp.open("POST", "generateKML.php", true);
    xmlhttp.send("session=" + session);
    myTimer = setTimeout(function(){createKML()}, 5000);
}

document.getElementById('KMLsubmit').onsubmit = function(event){
    (event.preventDefault) ? event.preventDefault() : event.returnValue = false; //prevent the form from submitting and reloading the page
    if(myTimer) clearTimeout(myTimer);
    createKML();
}

【讨论】:

  • 不幸的是,当我使用它时,它会在提交时重新加载页面,因此我无法将新的 KML 带入页面。有什么地方可以使用“return false;”
  • 您可以将提交输入更改为按钮或使用event.preventDefault,就像我刚刚在上面的代码中添加的那样。
  • 上述更改不起作用,但是当我更改提交到按钮时,它就像预期的那样工作。谢谢大家的帮助。
【解决方案2】:

试试

$(function(){
    $('#KMLsubmit').submit(function () {
        $.get("generateKML.php",function(data,status){
        });

        update();

        return false; 
    });

    function update(){
        $.ajax({
            url: 'generateKML.php',
            data: {
                session: session
            }
        }).done(function(result){
            $('#kmldetails').html(result);

            setTimeout(update, 5000)
        });
    }
})

【讨论】:

  • 你想删除最初的$.get,这是一个空操作。
  • @T.J.Crowder 我在我的 cmets 中提到过这个问题,但 OP 的 cmets 让我怀疑
  • 没有 $.get 怎么写?
  • @Arun P Johny 我试过了,它仍然以同样的方式工作。它不会创建新的 KML。我也尝试使用 setInterval 但没有运气。
猜你喜欢
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 2021-12-23
  • 2017-12-24
  • 2011-05-17
  • 2014-02-14
相关资源
最近更新 更多