JS中的奇迹。一个结果不同的函数

时间:2017-03-16 07:58:45

标签: javascript php jquery json

这是一个奇迹!帮助我理解它。

我的php文件中有一些html代码:

<form action="" method="post" name="r_form" >
<table>
<tr>
<td> Name: </td>
<td> <input type="text" name="r_name" id = "rname" /> </td>
</tr>
<tr>
   <td align="center" colspan="2"> <img src="FE.png" width="40" height="40" id="firstentryID" onClick="nextFunc()"></td>
</tr>
</table>
</form>

我的auth.php中的以下代码:

    <script type="text/javascript">

    Preload();
    nextFunc();

    function Preload() { 
    var valueToPush = {};
var name2 = [];
    var userID1 = '<?php echo $id_user;?>';
                   $.ajax({
                       url: 'TR.php',
                        type: 'POST',
                        data: {userID1: userID1},
                       success: function(data){
                        var names = data
                $('#result_div_id').html(data);
                             var json2 = $.parseJSON(data);
                     EntriesCount =json2.length; 
               $.each(json2, function() {
               $.each(this, function(k, v){


    switch(k) {
     case 'Name':
       valueToPush.Name = v;    
         break;

    // and more parametrs - it doesnt matter.
    }
    });

    name2.push({ID_Clients: valueToPush.id, Name: valueToPush.Name, Phone: valueToPush.Phone, Email: valueToPush.Email, Status: valueToPush.Status, Birthday: valueToPush.Birthday, ClientFrom: valueToPush.ClientFrom, User: valueToPush.User});

    });
    }
    });
    }
    ...

在我的nextFunc()中,我有:

function nextFunc(){

document.getElementById("rname").value = name2[currententry]['Name'];
}

在我的JSON中,我有:

[12]
0:  {
ID_Clients: "87"
Name: "Вася"
Phone: "1234578"
Status: "4"
Birthday: "2016-10-21"
ClientFrom: "4"
User: "2"
}-
1:  {
ID_Clients: "88"
Name: "Петя"
Phone: "2345669"
Status: "3"
Birthday: "2016-10-11"
ClientFrom: "2"
User: "2"
} ...  and so on...

奇迹是:

当我从我的块中调用NextFunc()时,就像在此代码中一样,我收到了

未捕获的TypeError:无法读取属性&#39;名称&#39; of undefinedat NextFunc()

但是当我在我的网页上按下FE.png时,代码正在运行!!!

WHY ????

2 个答案:

答案 0 :(得分:0)

CS

中没有奇迹

我很确定你的变量范围中的问题,即在preLoad函数范围内定义变量,然后尝试从另一个范围调用此变量。

要解决此问题,您需要将name2变量移动到全局范围

如下:

var name2 = [];
Preload();
nextFunc();

并在Preload();函数中,对此行var names2 = [];

进行评论

答案 1 :(得分:0)

这是你的问题。

Preload();
nextFunc();

当您调用Preload时,它会开始下载您的JSON。但是,由于下载可能需要很长时间,因此下载不会暂停其余代码 - 它是异步的,因此它会在后台继续下载,而其余代码会执行。当你调用nextFunc时,JSON仍然没有下载。

当您单击图像时,JSON已完成下载,因此该功能可以正常工作。

不是一个接一个地调用Preload和nextFunc,而是需要使用回调。回调是JSON完成下载后将调用的函数。实际上,您已经有一个名为success的回调。

success: function(data){
                        var names = data
                $('#result_div_id').html(data);
                             var json2 = $.parseJSON(data);
                     EntriesCount =json2.length; 
               $.each(json2, function() {
               $.each(this, function(k, v){


    switch(k) {
     case 'Name':
       valueToPush.Name = v;    
         break;

    // and more parametrs - it doesnt matter.
    }
    });

    name2.push({ID_Clients: valueToPush.id, Name: valueToPush.Name, Phone: valueToPush.Phone, Email: valueToPush.Email, Status: valueToPush.Status, Birthday: valueToPush.Birthday, ClientFrom: valueToPush.ClientFrom, User: valueToPush.User});

    });

要解决此问题,请在回调中显示name2.push的行之后直接调用nextFunc,以便在调用nextFunc时确保name2存在。

另外,请注意,由于您使用的是push函数,因此如果多次下载JSON,则数组的初始长度将增加一倍。您可能希望事先清除它。

几乎总是,如果相同的函数在看似没有原因的情况下表现不同,那是因为还没有加载的东西 - 这应该是你在这种情况下的第一个怀疑。