D3 在回调期间为用户定义的输入获取 NULL

Posted

技术标签:

【中文标题】D3 在回调期间为用户定义的输入获取 NULL【英文标题】:D3 getting NULL for user-defined input during callback 【发布时间】:2015-01-23 12:38:13 【问题描述】:

我有两个名为 startDate 和 endDate 的输入文本框,以及一个提交按钮。我在 php 中做了代码的后端,以便它从两个文本框中获取输入(日期),并在单击提交按钮后输出 D3 可以呈现的 JSON 文件。

问题是,我得到“Uncaught TypeError: Cannot read property 'length' of undefined”,但是当我手动输入 startDate 和 endDate 的值时(声明值而不是用户输入),它工作得很好.我猜测 sDate 和 eDate 的值在回调期间没有正确传递,这就是它返回 NULL 的原因。我不知道如何解决它。

在这里分享我的代码。

html

<body>
<form id="user" action="#" method="post"> 
        <table>
          <tr>
            <td>Start Date:</td>
            <td><input id="start_date" type="text" name="startDate" value="" size="30" /> </td>
          </tr>
          <tr>
            <td>End Date:</td>
            <td> <input id="end_date" type="text" name="endDate" value="" size="30" /></td>
          </tr>
        </table>
        <div id="submit_button">
            <input type="reset" value="Clear" /> 
            <input id="submitButton" type="submit" value="Submit" />
        </div>
</form>
<div id="contents" style="width:500px; height:500px;"></div>

<!-- data should appear once Submit button is clicked -->
<script>
        $(document).ready(function()
            $('#submitButton').click (function(e)
                e.preventDefault();
                renderTable();
            );     
        );
</script>

<!-- D3 -->
<script>
function renderTable()
    d3.json("data.php", function(error, data) 
                var c_data = d3.select("#contents").append("svg")
                                .attr("width", 500)
                                .attr("height", 500)

                var bars = c_data.selectAll("rect")
                                .data(data)
                                .enter()
                                    .append("rect")
                                    .attr("width", function(d)return d.value * 30)
                                    .attr("height", 50)
                                    .attr("y", function(d, i)return i * 80)

            )
   
</script>
</body>

PHP:

<?php
    $db = new PDO($hostname, $username,$password);
    //$startDate = '2014-11-21'; --> works when this is used
    //$endDate = '2014-11-23'; --> works when this is used

    if(isset($_POST['startDate']))
         $startDate = $_POST['startDate'];;

    if(isset($_POST['endDate']))
         $endDate = $_POST['endDate'];;

    $statement = $db->prepare(*SQL statement edited out*);

    $statement->execute(array($startDate, $endDate));

    $jsonData=$statement->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode($jsonData);
?>

附加信息:

我正在为 data.php 元素获取这个:

通知:未定义索引:/Applications/XAMPP/xamppfiles/htdocs/myProject/data.php 中的 startDate 注意:未定义索引:/Applications/XAMPP/xamppfiles/htdocs/myProject/data.php 中的 endDate []

【问题讨论】:

好吧,你不是POST表单,所以数据不会被发送。您可以将值作为参数添加到您调用的 URL 中,并通过 $_GET 查询它们。 嗨,@LarsKotthoff!我不确定我明白你的意思。你能提供一个更具体的例子吗?当我看到代码时,我学得最好。谢谢! 类似d3.json("data.php?startDate=" + startDate + "&amp;endDate=" + endDate, function (...) ... ) 【参考方案1】:

表单通过 POST 或 GET 将输入值发送到服务器来工作。 (因此他们的方法属性)。

您正在尝试访问您的 php 代码中的 POST 变量,您实际上并没有发布表单。将变量放在 url 中可能更容易,如下所示:

d3.json("data.php?startDate=" + startDateValue + "&endDate=" + endDateValue, funct.....

POST 和 GET 之间的许多区别之一是 GET 通过 url 发送值,因此 php 代码的唯一区别是更改对 $startDate = $_GET['startDate']; 的访问权限

编辑:因为我意识到我基本上只是重复了 Lars Kotthoff 所说的,here is an interesting solution 使用 POST 而不是 GET,使用 xhr.send(method[, data][, callback])

【讨论】:

【参考方案2】:

谢谢@LarsKotthoff 和@IgnacioAmpuero!我没有完全使用你建议的方法,但它确实帮助我理解了我所缺少的。

对于遇到同样问题的任何人,这就是我所做的:

使用 AJAX 请求填充我的查询。

var jsonData = $.ajax(
                type: 'POST',
                url: 'data.php',
                dataType: 'json',
                data: $('#user').serialize(),
                async: false
            ).responseText;

将结果分配给数据。

var data = JSON.parse(jsonData_status);

然后用它来生成我的图表。

var canvas = d3.select("body").append("svg")
                .attr("width", 500)
                .attr("height", 500);

var bars = canvas.selectAll("rect")
                .data(data)
                .enter()
                    .append("rect")
                    .attr("width", function(d)return d.value * 30)
                    .attr("height", 50)
                    .attr("y", function(d, i)return i * 80);      

【讨论】:

以上是关于D3 在回调期间为用户定义的输入获取 NULL的主要内容,如果未能解决你的问题,请参考以下文章

在模拟期间通过 GUI 读取用户的输入 [关闭]

如何在 onKeyPress 期间获取输入文本框的文本?

如何在 YouTube 直播期间获取通过“聊天”框输入的评论源?

Plotly Dash 表回调

如何设计布局以在注册期间获取图像作为输入?

急求一个JAVA中判断用户输入的数字是一个合法的电话号码的正则表达式,包括住宅电话与移动电话。