【问题标题】:Ajax not working on select tag, PHP, AJAXAjax 不适用于选择标签、PHP、AJAX
【发布时间】:2015-07-14 00:00:21
【问题描述】:

我试图在带有 2 个选项的选择标签上使用 ajax,但由于某种原因它没有得到 $_POST。它会打印出“---”,但不会打印出 $_POST 值,即 1 或 2。我不确定我做错了什么。请看我的代码:

newtest.php

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

<script type = "text/javascript"> 

function ajax(url,type,theName,id) {

      $.ajax({
           type: "POST",
           url: url,
           data: { select: $(type+'[name='+theName+']').val()},
           error: function(xhr,status,error){alert(error);},
           success:function(data) {
             document.getElementById( id ).innerHTML = data;
           }

      });

}

</script>

<?php

echo "<select name = 'name' onchange = 'ajax(\"newtestx.php\",\"input\",\"name\",\"output\")'>";
echo "<option value = '1'> 1 </option>";
echo "<option value = '2'> 2 </option>";
echo "</select>";

echo "<div id = 'output'></div>";

?>

newtestx.php

<?php

$name = $_POST['name'];
echo $name."---";

?>

【问题讨论】:

    标签: php jquery ajax


    【解决方案1】:

    您在 AJAX 调用中向服务器发送带有“select”键的 POST 参数:

       data: { select: $(type+'[name='+theName+']').val()},
    

    在 newtestx.php 中,您尝试使用键“name”从 POST 参数中检索值 - 它不存在:

    $name = $_POST['name'];
    

    您可以通过为参数键指定相同的名称来轻松解决此问题。如果您要查找 $name = $_POST['select'],就会找到该参数。

    内联 Javascript 被认为是不好的做法,没有必要回显 HTML 标记,这会使标记更难使用。

    newtest.php

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script src="[link to your javascript file here]"></script>
    <select name='numbers' class="postValueOnChange" data-id-to-update="output" data-post-url="newtestx.php">
        <option value='1'>1</option>
        <option value='2'>2</option>
    </select>
    <div id='output'></div>
    

    Javascript 文件

    $(document).ready(function () {
        $('.postValueOnChange').change(postSelectedValue);
    
        function postSelectedValue(e) {
            var $self = $(this);
            var url = $self.data('post-url');
            var $elementToUpdate = $('#' + $self.data('id-to-update'));
    
            var jqxhr = $.ajax({
                type: "POST",
                url: url,
                data: {
                    selected: $self.val()
                }
            });
            jqxhr.done(function (data) {
                $elementToUpdate.html(data);
            });
            jqxhr.fail(function (jqXHR, textStatus, errorThrown) {
                alert(errorThrown);
            });
        }
    });
    

    newtestx.php

    <?php
    $name = $_POST['selected'];
    echo $name."---";
    ?>
    

    【讨论】:

    • 您为 ajax 编写了全新的代码。你能告诉我代码的哪一部分是错误的,并为我修复那部分吗?除非,整个事情都是错的。谢谢。
    【解决方案2】:

    您正在发送帖子参数select 并尝试以$_POST['name'] 接收。

    确保它们匹配...nameselect

    【讨论】:

    • 对于&lt;select&gt;typeinput 也是没有意义的。如下所述更好地摆脱内联 onchange 代码
    • didn't do anything 不是对网络选项卡中实际请求的正确检查
    • @frosty... 假设您了解数据对象是什么以及服务器上的 post 键是什么...否则您可能需要在 php 手册和 jQuery ajax 文档中学习更多基础知识.周围有很多教程来了解它是如何工作的
    • 在浏览器开发工具中检查请求...我们无法为您执行此操作
    • 你看懂charlie关于...is input for a &lt;select&gt;...类型的第三条评论了吗,我想你不明白你的函数在做什么
    【解决方案3】:

    首先,既然你用的是jQuery,那你为什么还要用内联javascript呢?

    我建议您首先围绕 jQuery change 事件重新构建您的代码:

    $(document).ready(function() {
            $('select').change(function(e) {
            e.preventDefault();
    
            var selected = $('.select option:selected').val();
            var id, theName, url= ...// get it from the DOM 
    
            $.ajax({
               type: "GET",
               url: url,
               data: { select: selected},
               error: function(xhr,status,error){alert(error);},
               success:function(data) {
                 $('#'+id).html(data);
               }
    
          });
    
    
        }); 
    }); 
    

    其次,你为什么要用 PHP 编写 HTML,你只会用引号和双引号以及不需要的空格来让自己挣扎和浪费时间。

        <form action="">  
            <select name="name">
            <option value="1">1</option>
            <option value="1">1</option>
            </select>
    
    
        </form>
    
    <div id="output"></div>
    

    【讨论】:

    • 你能告诉我代码的哪一部分导致了故障,以及如何解决它吗?
    • 我正在尝试,但是您从一开始就编码的方式不尊重最佳实践。更好地解决这两个问题。我还在想办法
    • 对,当您有许多不匹配时,您需要使用浏览器调试工具开始评估什么是什么,看看变量是否符合预期以及与服务器通信的实际情况
    • 我完全同意 Charlietfl 的看法,console.log 客户端 + var_dump 服务器端运行良好,网络选项卡可以跟踪 HTTP 通信。
    • @whitelettersinblankpapers 请帮我找出我做错了代码的哪一部分。我问是因为我不知道自己做错了什么,并试图寻求专业帮助。
    猜你喜欢
    • 2015-07-07
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多