这有点复杂,但让我试着总结一下。我有两组Javascript代码,它们使用AJAX和JSON(以及PHP和...)来获取特定数据并加载一组控件。在一种情况下,从click事件处理程序调用所有控件都正确加载了正确的数据,一切都很好。在第二种情况下,当页面首次加载时(正确调用,代码在页面加载时执行并且确实返回值),除非我在代码中添加alert()对话框,否则几个控件实际上不会被加载。如果alert()在函数中,则加载控件。温和地说,这是令人困惑的。
不工作的代码与代码相同。这是表单加载时调用的代码:
function getFirstAward()
{
// this has to go get the first award at the top of the list
// (sort order) by rank and date, and return that to the entryfields:
var namecode = document.getElementById("namecode").value;
// now we need to set up the Ajax code to return just this specific
// award, and stuff it into the fields above ..
$.ajax
({
type: "POST",
url: "<?php echo $admin_html_RootPath; ?>lookups/returnFirstAward.php",
data: { 'namecode' : namecode },
dataType: "json", // return value is json array
//cache: false,
success: function(data)
{
// why is this necessary?
//alert( "First Award in List loaded" );
// first get the data array and break it up ...
document.getElementById("awardcode").value = data[0];
document.getElementById("currentaward").value = data[1];
getAwards();
document.getElementById("awardnumber").value = data[2];
document.getElementById("awarddate").value = data[3];
document.getElementById("eventname").value = data[4];
document.getElementById("region").value = data[5];
// Barony ... is it empty? If not, enable it, and set the value
if ( data[6] != "" )
{
document.getElementById("barony").disabled = false;
document.getElementById("barony").value = data[6];
}
else
{
// empty, enable, set value to empty, and disable it
document.getElementById("barony").disabled = false;
document.getElementById("barony").value = "";
document.getElementById("barony").disabled = true;
}
document.getElementById("royalcode").value = data[7];
// this one is necessary because of the way the code for getRoyals works:
document.getElementById("currentroyalcode").value = data[7];
getRoyals();
document.getElementById("notes").value = data[8];
tinymce.get('notes').setContent(data[8]);
document.getElementById("laurelprimary").value = data[9];
tinymce.get('laurelprimary').setContent(data[9]);
document.getElementById("laurelsecondary").value = data[10];
tinymce.get('laurelsecondary').setContent(data[10]);
// set focus on the currentaward entry:
document.getElementById("currentaward").focus();
}, // end success
error: function( xhr, textStatus, err )
{
//alert( data );
alert( xhr + "\n" + textStatus + "\n" + err );
} // end error
}); // end ajax call
} // end of function: getFirstAward
如果我取消注释alert()对话框,则所有控件都会正确显示。如果没有,最后四个不会。我已经尝试重复该代码以查看是否有帮助(设置不同控件的值等)并且它没有起作用。我尝试使用location.reload()并且它没有做任何好事(无论是否使用参数:location.reload(true),没有任何区别)。
答案 0 :(得分:2)
我认为您的代码在页面加载完成之前就已执行,并且错过了正确执行代码所需的一些细节/值。请尝试以下
setTimeout(function() {
getFirstAward();
}, 0); // try changing the duration from 0 to 100/500 whichever works for u.