【问题标题】:$.ajax return [object Object] for data (WordPress)$.ajax 为数据返回 [object Object] (WordPress)
【发布时间】:2021-01-13 11:08:32
【问题描述】:

我不是程序员,所以尽管搜索了网络,但我遇到了麻烦。

我正在使用插入到 WordPress 中的 JS 脚本,通过它我进入一个域并返回一些数据。

脚本调用外部 PHP 文件。

但是,当我单击表单按钮时,它会返回一个 HTML 字符串,其中包含先前输入的输入字段的值,而不是它从 PHP 文件处理的 DATA 值,而是字符串 [object Object]。

这是 HTML:

<div class="divtoolg">
<form id="form">
        <div class="form-group">
            <input class="form-control" type="text" id="domain" required placeholder="Enter Input">
        </div>
        <div class="form-group">
            <button class="btn btn-danger btn-block">
                Get Data
            </button>
        </div>
        <div id="result"></div>
</form>
</div>

这是脚本:

/*jshint esversion: 6 */
let $ = jQuery;
$(document).ready(function(){
        $("#form").submit(function(e){
            e.preventDefault();
            $("#result").html("");
            var domain = $("#domain").val();
            console.log(domain);

            $.ajax({
                metod: 'POST',
                url:'process.php',
                data:{domain:domain},
                async: true,
                
                complete:function (data) {
                console.log("data ="+data);
                $("#result").html(`<h2>The ${domain} is ${data} old </h2>`);
                $("#domain").val(domain);
                },
                error:function () {
                $("#domain").val("");
                $("#result").html("Error!");
                }
            });
        });
});

这是 PHP 文件:

<?php

if(isset($_POST['domain']))
{
require('Ageclass.php');
$w=new DomainAge();
echo $w->age($_POST['domain']);
}
?>

有人有什么想法吗? 非常感谢。


新的 JS

/*jshint esversion: 6 */
let $ = jQuery;
$(document).ready(function(){
        $("#form").submit(function(e){
            e.preventDefault();
            $("#result").html("");
            var domain = $("#domain").val();
            console.log(domain);

            $.ajax({
                method: 'POST',
                url:'../process.php',
                data:{domain:domain},
                
                success:function (data) {
                console.log(data);
                $("#result").html(`<h2>The ${domain} is ${data} old </h2>`);
                $("#domain").val("");
                },
                error:function () {
                $("#domain").val("");
                $("#result").html("Error!");
                }
            });
        });
});

【问题讨论】:

  • data 很可能是一个数组或对象,而不是字符串。浏览器不知道您希望如何显示它,因此它只是显示 [Object object]。这是一个提示,您需要先处理数据,然后从中提取您在屏幕上实际需要的信息。当您将data 登录到控制台时,它向您显示了什么?附言尝试不带 data= 部分的 console.log(data);
  • 你好,谢谢。所以,console.log(data) 是一样的。
  • 你用哪个浏览器来测试这个?在大多数现代浏览器中,它允许您在控制台中展开对象。如果没有,请尝试console.log(JSON.stringify(data)); 以获取 JSON 格式的可视化表示。 (有关更多日志记录选项,另请参阅this question。)尝试查看它的另一种方法是查看开发人员工具中的“网络选项卡”,找到对 process.php 的请求,打开它并查看“响应”选项卡为那个请求。
  • 因此,在控制台中返回:“{readyState: 4, getResponseHeader: ƒ, getAllResponseHeaders: ƒ, setRequestHeader: ƒ, overrideMimeType: ƒ, ...}”。在“网络”选项卡上,该文件存在 200 OK 响应,但这里的请求方法是 GET?!?!?
  • 哦...我刚刚注意到您出于某种原因正在使用“完成”回调。根据文档查看它返回的内容:api.jquery.com/jquery.ajax。如果您只想获取返回的实际数据,而不是整个内部 XHR 对象(具有 HTTP 请求和响应的完整详细信息),请使用“成功”回调。即用success(data) { 替换complete(data) { - 再次检查文档。而且,几乎所有你见过的 jQuery ajax 教程都会使用“success”(除非他们使用类似 Promise 的回调),你永远不会看到使用“complete”。

标签: php ajax wordpress object


【解决方案1】:

这可能会帮助您以正确的方式在 wordpress 中更好地处理 ajax。

这个答案可能需要进行中才能完全满足您的要求,因为目前尚不清楚您到底想要什么。请按照以下说明操作...


让我们整理一下您的表单,让我们只使用 name 而不是 id 来定位输入。

<form id="form">
   <div class="form-group">
      <label for="domain">Domain</label>
      <input class="form-control" name="domain" type="text" placeholder="Enter domain" required>
   </div>
   <div class="form-group">
      <button class="btn btn-danger btn-block" type="submit">Get Data</button>
   </div>
</form>

现在让我们创建一个 wordpress ajax url 窗口变量,它可以在您的 js 文件中使用或在您的 wordpress 页面上内联。

在加载 ajax js 脚​​本之前,将此 html/php 放入您的 wordpress 模板 &lt;head&gt;...

<script>window.admin_ajax_url = '<?php echo admin_url('admin-ajax.php'); ?>';</script>

由于您无法手动编辑主题文件,因此您无法使用上述内容,请参阅下面更新的 js 代码,包括此 var 非动态。

现在让我们整理一下表单 js 和 wordpress ajax 调用...

// document ready
jQuery(document).ready(function ($) {
     
    // non-dynamic wordpress ajax url
    const admin_ajax_url = '/wp-admin/admin-ajax.php';

    // our form jquery object
    const $form = $('#form');

    // on form with id submit
    $form.on('submit', function (e) {

        // prevent the form from submitting
        e.preventDefault();

        // set empty submission object
        let submission = {};

        // for each of this form submit event target object entries as key/field
        for (const [key, field] of Object.entries(e.target)) {

            // if object entry (field) has a name attribute
            if (field.name) {

                // add name/value to submission object
                submission[field.name] = field.value;

            }

        }

        // our form submit ajax call
        $.ajax({
            method: 'GET',
            url: admin_ajax_url,
            data: {
                action: 'handle_form_submission',
                submission: submission
            },
            success: function (response) {

                // console our response (object, not string)
                console.log(response);

            },
            error: function (response) {

                // do error js send response

                // console our error response (object, not string)
                console.log(response);

            }
        });

    });

});

在您的functions.php 中,添加此代码以处理 ajax 表单提交发送 json 响应...

// require your age class (make sure you are actually hitting this)
require_once(__DIR__ . '/lib/DomainAge.lib.php');

// add our handle #form submission php ajax actions
add_action('wp_ajax_nopriv_handle_form_submission', 'handle_form_submission', 20);
add_action('wp_ajax_handle_form_submission', 'handle_form_submission', 20);

// function to handle submission
function handle_form_submission() {

    // get our form submission object
    $submission = $_GET['submission'];

    // create our domain age object
    $domain = new DomainAge();

    // get our domain age result
    $age = $domain->age($submission['domain']);

    // dump results
    var_dump($submission['domain'];
    var_dump($age);

    // if we have domain age
    if($age) {

        // send age response
        wp_send_json_success($age);

    } else {

        // send error response
        wp_send_json_error([
            'message' => 'Domain age cant be found.'
        ], 404);

    }

    // kill handler
    die;

}

原来的DomainAge.lib.php 在最新的 php 中不起作用。

请参阅下面的更新要点链接以使用 php-7...

https://gist.github.com/joshmoto/9ee439f6a7046f449b49b51e9cf6275f

【讨论】:

  • 我的php 中存在语法错误,我已修复。您的主题中Ageclass.php 的路径是什么?
  • 示例:wp-content/foldername/foldertool/
  • 我也修复了js
  • 您需要将Ageclass.php 类放在您的主题wp-content/themes/yourtheme/foldername/foldertool/ 中,您会看到我已经更新了主题目录的路径。
  • 再次更新JS
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2012-08-20
  • 1970-01-01
相关资源
最近更新 更多