这是一个奇迹!帮助我理解它。
我的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 ????
答案 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,则数组的初始长度将增加一倍。您可能希望事先清除它。
几乎总是,如果相同的函数在看似没有原因的情况下表现不同,那是因为还没有加载的东西 - 这应该是你在这种情况下的第一个怀疑。