JavaScript / Ajax - 文档加载,某些控件未加载

时间:2018-02-23 17:27:14

标签: javascript jquery ajax

这有点复杂,但让我试着总结一下。我有两组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),没有任何区别)。

1 个答案:

答案 0 :(得分:2)

我认为您的代码在页面加载完成之前就已执行,并且错过了正确执行代码所需的一些细节/值。请尝试以下

setTimeout(function() {
    getFirstAward();
}, 0); // try changing the duration from 0 to 100/500 whichever works for u.