【问题标题】:Calling PHP scripts from Javascript without leaving current page在不离开当前页面的情况下从 Javascript 调用 PHP 脚本
【发布时间】:2011-07-15 10:57:31
【问题描述】:

我在不离开当前 HTML 页面的情况下从 Javascript 调用 PHP 脚本时遇到了一些问题(如果可能的话)。我知道可以使用 AJAX,但可以单独使用 Javascript 吗?

上下文:-

我希望我的页面使用 Javascript(使用 onclick)执行一个简短的动画,然后立即调用 PHP 脚本将数据插入 MySQL 数据库 - 所有这些都无需离开页面,因此它不会抑制动画。

我可以做的动画部分以及将数据插入数据库等,但是我如何在那个 Javascript 动画函数的末尾调用 PHP 脚本?

任何指针、代码片段等将不胜感激! ^_^

如果之前有人问过这个问题,我们深表歉意。

【问题讨论】:

标签: javascript php html onclick dom-events


【解决方案1】:

AJAX 是异步 Javascript 和 XML, 它是一种 Javascript 技术,允许您向服务器发送请求(就像您的浏览器在输入 URL 时所做的那样),并在 javascript 字符串中获得响应,而不是在页面中呈现它。

问题是不同的浏览器实现AJAX的方式不一样,所以我建议使用jQuery进行抽象。

用 jQuery 做这个:

<script>
$.get("backend.php",{param:value},callbackFunction);
callbackFunction(data)
{
alert(data);
}

</script>

【讨论】:

    【解决方案2】:

    碰巧遇到了同样的问题,所以我想出了类似的东西。您所要做的就是添加您需要的代码,并将 do_the_script 函数分配给 onclick 事件。

    <script type="text/javascript">
    var myIntv;
    function do_the_script() {
        // play animation ...
        var address='fancy_script.php';
        var tmp = new XMLHttpRequest();
        myIntv=setInterval(function(){
        tmp.addEventListener("load", doneHandler, false);
        tmp.open("POST", address);
        tmp.send(null);
        }, 1000);
    }
    
    function doneHandler(event) {
        // maybe do something when script is executed
        clearInterval(myIntv);
    }
    </script>
    

    您可能已经注意到,“调用”地址的代码每 1 秒执行一次。这是为了确保调用的次数足够多,以便得到一个肯定的答案,然后调用 doneHandler 并清除间隔。如果您认为您的服务器可以更快或更慢地响应,您应该相应地更改这些毫秒。

    【讨论】:

      【解决方案3】:

      你可以使用 jquery ajax:

      http://api.jquery.com/jQuery.ajax/

      【讨论】:

        【解决方案4】:

        PHP 是一种服务器端语言。 JavaScript 是一种客户端语言。

        如果您想执行服务器端代码,则无法选择往返服务器。如果您不想离开该页面,您唯一的选择是执行异步请求(也称为 AJAX)。

        使用 jQuery 或 MooTools 等 JavaScript 库可大大简化此类任务。例如,您可以使用MooTools 在脚本末尾发出请求,如下所示:

        var req = new Request({url: '/backend/doPHPInsert.php'});
        req.send();
        

        有一些方法可以在不使用 AJAX 的情况下执行此操作,例如动态创建 iFrame(或任何其他获取资源的元素)。

        【讨论】:

          【解决方案5】:

          我知道可以使用 AJAX,但可以单独使用 Javascript 吗?

          如果你不想使用 XHR,你可以使用这个丑陋的 hack...

          var request = 'mysql-insert.php',
              image = new Image();
          
          image.onload = function() {
            // Success
          }
          
          image.onerror = function() {
            // Error
          }
          
          image.src = request;
          

          除了在广泛使用 AJAX 之前才真正使用过(或需要进行跨域请求)。

          我只会使用 AJAX。 jQuery 为使用 XHR 提供了一些很棒的抽象。

          【讨论】:

          • 这里不合适。这也可以使用 iframe 来完成。
          • @AbiusX 它回答了问题你能单独使用 JavaScript 发出请求吗? 我认为这意味着没有 XHR。
          • 我不是在谈论没有 XHR 的部分,而是在谈论图像黑客。它用于 CSRF 而不是请求。如有必要,您可以添加
          • @AbiusX 我不知道你刚才说了什么,对不起。
          • @AbiusX: 没有安全软件可以阻止...指向.php 文件的Image() 对象可以有合法用途(加载动态图像)。
          【解决方案6】:

          如果您不想包含 jquery 库,您可以简单地执行以下操作

          a) 广告 iframe,大小为 0px,因此不可见,href 为空白

          b) 在你的 js 代码函数中执行这个

           window.frames['iframename'].location.replace('http://....your . php');
          

          这将执行 php 脚本,例如,您可以进行数据库更新...

          【讨论】:

            【解决方案7】:

            这里有一些使用纯 XMLHttpRequest 的好例子:https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest

            (特别是,向下滚动到异步示例 - 现在你正在用煤气做饭。)

            编辑:另请参阅http://msdn.microsoft.com/en-us/library/ms535874%28v=vs.85%29.aspx,其中包含处理没有本机 window.XMLHttpRequest 的 IE 版本的示例。

            现在,坦率地说 - 是的,使用 XHR 本身(尤其是跨浏览器)有点迟钝。您可以使用几乎任何东西(jQuery、Dojo、MooTools、Prototype、Closure、YUI 等)来更轻松地进行 XHR,因为其中所有其他的东西,给你更简洁的XHR设施。

            不过,在开始让图书馆为您做这件事之前,先了解一下您正在使用的内容仍然是件好事。 :)

            【讨论】:

              猜你喜欢
              • 2015-12-31
              • 2014-06-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-08-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多