【问题标题】:Complete ajax call before body loads在正文加载之前完成 ajax 调用
【发布时间】:2018-07-29 05:38:42
【问题描述】:

我在 w3schools 中读到有几种方法可以执行外部脚本:

  1. 如果存在异步:脚本与页面的其余部分异步执行(脚本将在页面继续解析时执行)
  2. 如果 async 不存在而 defer 存在:脚本在页面完成解析后执行
  3. 如果 async 或 defer 都不存在:在浏览器继续解析页面之前立即获取并执行脚本。

所以,如果我理解正确,因为我的 html 文件的头部有以下脚本 不使用 async 或 defer 应该首先执行它,然后浏览器将继续解析。

<script type="text/javascript" src="js/display.js"></script>

display.js

$.ajax({
    url:"fetch_items.php"
});

fetch_items.php 从数据库中获取一些项目并将它们放入数组$_SESSION("my_array")

所以在 html 文件夹的正文部分,我使用位于 $_SESSION("my_array") 中的值来显示一些内容。

<?php 
if(isset($_SESSION["my_array"]))
{
?>
 <!-- html code echoing values from session -->
<?php
}
?>

$_SESSION["my_array"] 尚未设置,因此内容不会出现。 (如果我重新加载页面内容将正确显示)

为什么会这样?我如何确保脚本在正文加载之前完成了它的执行?以下仅指脚本: 如果 async 或 defer 都不存在:在浏览器继续解析页面之前立即获取并执行脚本。

【问题讨论】:

  • 你可能在输出你正在输出的任何内容后填充 SESSION
  • 发生这种情况是因为 php 代码在您的 js 脚本之前运行。您可以做的是使用 ajax 从 php 获取内容,而不是尝试将其设置为 session。 ajax 完成请求后,您可以使用 DOM 或 jquery 更新您的页面
  • $.ajax({ 是异步的 - 因此,在发送请求之前加载整个页面
  • 这是一个很好的例子,说明如何使用 ajax 从 php 获取内容:w3schools.com/js/js_json_php.asp
  • 我不知道 php 先运行。 Marcel Kohls 这就是我正在做的事情......然后我会将数据附加到特定的 div,一切都会好起来的。但是后来我也想通过单击按钮以各种方式重新排序项目,尽管在会话中将它们放在数组中会非常方便。

标签: javascript php html ajax dom


【解决方案1】:

AJAX 代表“异步 JavaScript 和 XML”。因此,它通过运行您的 javascript 代码从您的浏览器发出异步请求。您当前的代码从浏览器向服务器发出请求。然后服务器使用您的 PHP 代码将您的数组保存到会话中,而不是重新加载页面。这就是为什么您的阵列没有立即打印的原因。

糟糕的解决方案:刷新页面关于您的 ajax 请求的成功方法。

更好的解决方案:如果不是真的需要,请不要让您的阵列保持在会话中。在“fetch_items.php”的方法中返回您的数组。然后使用 ajax 请求的成功回调打印数组。

这里是成功和打印方法的使用示例:Ajax response inside a div

更多信息可以阅读jquery api文档:http://api.jquery.com/jquery.ajax/

【讨论】:

  • 也就是说,除了刷新页面之外,没有办法让 session 在 body 加载之前就已经填满数据了吧?
  • 是的。会话在第一次加载页面后获取新数据。如果您希望页面响应已打印数据,浏览器应该在页面加载之前知道该数组。
【解决方案2】:

尝试将async : false 放入您的 ajax 调用参数中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多