【问题标题】:How to I post a value through the XMLHTTPRequest Object?如何通过 XMLHTTPRequest 对象发布值?
【发布时间】:2009-08-18 22:01:29
【问题描述】:

我有一组在表中动态生成的链接。每一行的标签上都有一个唯一的“id”属性。目标是让 XMLHTTPRequest 告诉页面“deletepost.php”要从外部数据库中删除哪条记录。

它将隐藏的输入值更改为行的值(一个数字),然后提交该表单

    <script type="text/javascript">
        var http = false ;

        // instance the request object!!!!
        if(navigator.appName == "Microsoft Internet Explorer") {
          http = new ActiveXObject("Microsoft.XMLHTTP");
        } else {
          http = new XMLHttpRequest();
        } 
        /////////////////////////////////////////////////

        function rdel(num) {
        document.getElementById("pid_to_del").value = num; 
        //this element is a hidden <input> tag. this line changes the value.

        http.open("POST", "deletepost.php", true); //this _SHOULD_ post the form 
        http.onreadystatechange = function() {

         if(http.readyState == 4) {
            $("tr#r" + num).fadeOut("slow"); // jquery fadeout animation
            alert(http.responseText); // this alerts whatever deletepost.php says
         }      
        }

        http.send(null);
    } 


</script>

此函数 rdel() 由其中一个链接调用,如下所示:

<a href="javascript:rdel('7');"> delete </a>

这就是 deletepost.php 的样子:

<?php
   print_r($_POST);
?>

发出请求警报的页面:

数组 ( )

一个空数组。 :(为什么?!

【问题讨论】:

    标签: php javascript jquery ajax post


    【解决方案1】:

    这里有两件事,第一是您实际上必须将您的帖子字符串(非常类似于查询字符串)放入

    http.send(null);
    

    打电话。所以你会这样做:

    http.send('field1=value1')
    

    其次,为了真正通知服务器有正在发布的值,您必须使用以下方法为您的请求设置内容类型:

    http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    

    希望有帮助

    编辑:

    我现在看到您正在尝试使用此请求将 html 表单的序列化副本异步发送到服务器。 Javascript 不包含执行此操作的功能,但某些库和插件(例如 JQuery 和 AjaxForm)包含。

    但是,对于您的示例,您应该能够使用以下方法完成此操作:

    http.send('pid_to_del=' + pid);
    

    【讨论】:

      【解决方案2】:

      最快的解决方法是:

      打开 XMLHttpRequest 对象的位置: http.open("POST", "deletepost.php", true) 将 url 更改为 "deletepost.php?number="+num

      然后在您的 php 页面中将 POST 更改为 GET。 $number = $_GET['number']

      POST 允许您发送大量参数/选项,但除非您的数字长度超过 140 个字符,否则这不会有任何区别。似乎有一个普遍的误解认为 POST 比 GET 更安全,仅仅是因为如何让浏览器操作 post 变量似乎更明显。然而,用 POST 变量做同样的事情是一个非常小的延伸,因此安全性不应该依赖于 POST 而不是 GET。使用 POST 并没有什么问题,只是您似乎无法让它轻松工作。我永远不会直接在javascript中这样做。我总是会使用 jquery 之类的东西。您可以将整个脚本替换为以下内容,它适用于大多数浏览器:

      
      function rdel(num) {
          $.post("/webroot/deletepost.php", {number: num},
              function(dat){
                  $("tr#r" + num).fadeOut("slow"); // jquery fadeout animation
                  alert(dat.responseText); // this alerts whatever deletepost.php 
          });
      }
      

      顺便说一句,在您的选择器 $('tr#r'+num) 中,tr 是不必要的,因为页面上的 id 是唯一的,因此结果将与 $('#r'+num) 相同但计算选择器需要更长的时间。通过 id 引用是最快的,前者查找所有 tr 标签,然后在该集合中查找 id,而不是通过仅在选择器中使用 id 来使用“本机”getElementById 函数。简而言之,不要让 jquery 做任何你不需要它做的事情;)

      【讨论】:

        猜你喜欢
        • 2011-04-22
        • 1970-01-01
        • 2012-01-07
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2019-08-26
        • 2016-06-04
        相关资源
        最近更新 更多