混淆了如何正确使用jquery getJSON

时间:2011-10-31 20:56:49

标签: php jquery json

我正在尝试使用jquery getJSON从php文件获取我的表的信息,并且它不起作用。有人可以给我一些关于我出错的地方:

使用Javascript:

$(document).ready(function(){   
$("input#autofill").click(function()
{
$.get("last_year_ISBN.php",
    function(data){
    var isbns = $.parseJSON(data);  //creates a javascript object.
                  $.each(isbns, function(){
                    var elements = document.getElementById("booklist").getElementsByTagName("input");
                    for (var i=0, i<elements.length; i++)
                    {
                        elements[i] = this;
                    }
                    });
                  },
                  "json");

    });
});

HTML / PHP的

<?php
            $file = fopen("SGS_Fall_Booklist.csv", "r");
            $entry= fgetcsv($file);
            echo $entry[0] . $_GET["program"] . $entry[1] . $GET["school"] . $entry[2] . $GET["term"] . "<br>";
            //COMMENTED OUT FOR TESTINGecho "<input type='submit' name='checkall' value='AutoFill (last years ISBN's)'></input><br>";
            //if ($entry[0] == $_GET["program"] && $entry[1] ==$GET["school"] && $entry[2] == $GET["term"])
            //{                                 
            echo "<table id='booklist'><tr>
                             <th>Edit</th>
                             <th class='coursename'>" . $entry[6] . "</th>
                             <th class='startdate'>" . $entry[7] . "</th>
                             <th class='booktitle'>" . $entry[17]. "</th>
                             <th class='author'>" . $entry[18]. "</th>
                             <th class='isbn'>" . $entry[16]. "</th>
                         </tr>";
            while(! feof($file))
            {
                $entry = fgetcsv($file); 

                echo    "<tr>
                            <td><input type='checkbox'></input></td>
                            <td class='coursename'>" . $entry[6] . "</td>
                            <td class='startdate'>" . $entry[7] . "</td>
                            <td class='booktitle'>" . $entry[17]. "</td>
                            <td class='author'>" . $entry[18]. "</td>
                            <td class='isbn'><input class='ISBN_number' type='text' value='";               

                if(isset($_GET["checkall"]))
                {
                    echo $entry[16];
                }
                echo        "'size='13' maxlength='13'></input></td>    
                      </tr>";                   
            }

            //}
            echo "</table>";
            fclose($file);

&GT;

外部php文件

<?php
$file = fopen("SGS_Fall_Booklist.csv", "r");
$entry = fgetcsv($file);    //discard the first title line
$i=0;
while(! feof($file))
{
    $entry = fgetcsv($file); 

    $isbns=[$i] = $entry;
    $i++;
}
fclose($file);
echo json_encode($isbns);
?>

我已经将我的代码更改为超级插件建议但它仍然无法正常工作。 alert(data)确实返回整个json语句。我错过了什么?

$(document).ready(function(){   
    $("input#autofill").click(function()
    {
        $.get("last_year_ISBN.php",
                  function(data){
                  alert(data);
                  var isbns = $.parseJSON(data);    //creates a javascript object.
                  var elements = $('#booklist .ISBN_number');
                  $.each(isbns, function(index, obj){
                    //var elements = document.getElementById("booklist").getElementsByTagName("input");
                    //for (var i=0, i<elements.length; i++)
                    //{
                        //elements[i].value = this;
                    //}
                    $(elements[index]).val(obj);
                    });
                  },
                  "json");



    });
});

我终于弄明白了我的问题!我在php端使用json_encode,它以json的形式发回请求。 .get调用是在AS JSON中读取它(注意最后一个参数)并自动将其转换为javascript对象。因此,当然我的parseJSON行不起作用,我正在解析一个javascript对象,而不是json文本!!

5 个答案:

答案 0 :(得分:1)

您的jQuery .each循环为您提供了isbns中每个对象的索引和引用。如果isbns是一个简单数组且与booklist包含完全相同的元素数量,

var elements = $('#booklist .ISBN_number');
$.each(isbns, function(index, obj){
    $(elements[index]).val(obj);
});

应填写您的ISBN <input>字段。

如果isbns实际上是一个对象数组,则必须按名称引用该值:

    $(elements[index]).val(obj.ISBN);

答案 1 :(得分:1)

我不知道这是否是唯一的问题,但我可以看到以下代码存在两个问题,根据我在代码中添加的注释和下面的解释:

$.get("last_year_ISBN.php",
   function(data){

      alert(data); // <--- NEW DEBUGGING ALERT HERE

      var isbns = $.parseJSON(data);  //creates a javascript object.
      $.each(isbns, function(){
         var elements = document.getElementById("booklist").getElementsByTagName("input");
         // PROBLEM: you're setting all input elements to the current item
         //          from the $.each
         for (var i=0, i<elements.length; i++)
         {
            elements[i] = this; // <--- SHOULD BE elements[i].value = this
         }
      });
   },
   "json"
);
  1. 我假设您的目的是更新HTML输入以显示JSON中的数据。要做到这一点,您需要说elements[i].value = this,或者使用jQuery,$(elements[i]).val(this)

  2. 您的$.each循环会迭代JSON中的所有项目,但是对于每个项目,您都会运行相同的for循环并更新所有输入书目单“到当前项目。

  3. 我建议您首先输入调试console.log(data)alert(data)语句,以确认您的回调实际上已被调用,以及它正在接收哪些数据。 (我在上面补充说。)

    然后要解决问题(2),您需要将个别输入分配给JSON中的相应值,但如果没有看到JSON的结构,我无法真正建议如何做到这一点。

    编辑:刚看到hyperslug的答案 - 这就是我在谈论问题(2)。假设您的JSON是一个简单的数组,其元素与您的输入一一对应,应该可以正常工作。如果您的JSON更复杂,请更新您的问题以显示其格式。

答案 2 :(得分:0)

选择器$("input#autofill")可能什么都不返回。 没有ID属性'autofill'的输入

答案 3 :(得分:0)

我认为错误就在这里:

$isbns=[$i] = $entry;

应该是:

$isbns[$i] = $entry;

答案 4 :(得分:0)

您的PHP可以使用一些改进:

$isbns = array();
while ($line = fgetcsv($file)) {
   $isbns[] = $line;
}

echo json_encode($isbns);

但是,为什么使用AJAX调用来填充html表单,使用与首先生成表单的PHP脚本相同的源数据?