javascript - 为什么重新加载对 ajax 不可见,但从控制台可见?
问题描述
所以,我有一个相当古老的项目,当我比现在经验少得多时(因此这种方法一定非常糟糕),现在查看我的旧代码,我得到了一些关于背后机制的问题。
我有index.php
,input.php
当我在表单上按提交时,表单上index.php
的数据被发送到input.php
然后验证数据,放入 MySQL 数据库。如果那一刻一切正常,服务器将作为响应返回:
<script>location.reload();</script>
这是我发送该请求的方式:
$.ajax({
url: $("#input_form").attr("action"),
data: formData,
processData: false,
contentType: false,
type: 'POST',
success: function(info){$("body").html(info);}
});
因此,基本上,如果一切顺利,页面将被迫重新加载。它有效,我们可以在页面上看到新数据。
问题是:
1)为什么页面重新加载实际上是不可见的?背后是什么机制?至于我将整个主体的 html 更改为内部带有 reload 功能的脚本标记,因此它应该类似于(如果不一样)放入$('body').html("<script>location.reload()</script>")
浏览器控制台但差异非常明显 - 如果我把它放在浏览器控制台中然后刷新按钮更改,当前活动浏览器选项卡的图标也更改为重新加载图标,这不会随请求发生
2)为什么 Chrome 开发工具将重新加载视为来自(网络选项卡)的重定向并将整个 html index.php 生成的响应作为响应,如果我在控制台中input.php
运行则不会发生这种情况?$('body').html("<script>location.reload()</script>")
解决方案
我认为我们可以同意 alocation.reload();
简单地重新加载整个页面。它也可以是一个完全不同的页面。
$("body").html(info);
完全替换了页面元素的内容,<body> ... </body>
但那不是整个页面。HTML 页面更多。它有标题、a <head>
、脚本等。当您使用$("body").html(info);
.
JQuery 文档说.html()
使用浏览器的innerHTML属性。确切的机制是:
- 指定的值被解析为 HTML,从而生成一个DocumentFragment 对象,该对象表示新元素的新 DOM 节点集。
- 元素的内容将替换为新DocumentFragment中的节点。因为所有节点都一次插入到文档中,所以如果单独插入每个插入的节点,只会触发一次重排和渲染,而不是可能触发一次。
该页reload()
面对文档进行了完整的重建,包括所有内容。它构建了一个 DOM 注释树,并尝试渲染它。可能是在构建整个页面时触发了几次重排和渲染。例如,当一个 CSS 文件被加载,或者当更多的 HTML 源代码进来时。许多页面也有 Javascript,在加载后会稍微修改页面。这就是您在完成重新加载时看到的内容。
推荐阅读
- python - Python Pandas - 从每个位置/“NAME”平均每月获得“SNOW”
- javascript - 如何使用js将UTC日期转换为本地时间?
- typescript - 如何用 Chai 期望替换 Jext 期望的类型?
- pandas - 集群后如何处理数据?
- javascript - 如何修复 React-Native 中的“您可能忘记从文件中导出组件..etc”错误?
- swift - 将 vapor 链接到自己的 openssl 编译
- c++ - 它在VS中不起作用,但是当我运行它时它在CLion中起作用
- python - 是否可以在python中绘制一个正则表达式来提取所有字符串的属性值
- c - 自引用结构,包含三个指针(称为左、右和父)
- javascript - 如何在 ES6 中重写 Headless Autodesk Forge Viewer