javascript - 调用 PHP 函数表单 Javascript 后页面不加载
问题描述
当我从 javascript 函数(位于 .js 外部文件中)调用 PHP 函数时,网页会刷新并且似乎停止在 PHP 函数处加载。
function completePurchase(){
//check if perosn signed in
if (signedIn){
alert("Purchase Complete! Total : " + total);
//Upadte database - call PHP function in MainPage2
document.write('<?php echo upadtePurchaseToDB();?>');
}
}
PHP 函数驻留在 PHP 标记内的 PHP 页面中:
//PHP to handle data when purchase button is pressed
function upadtePurchaseToDB(){
echo "PHP CALLAED AS PURCHASE BUTTON PRESSED";
};
这个想法是在调用 PHP 函数时更新数据库。
但是,当被调用时,页面会刷新并保持空白。在控制台中,如果我导航到“元素”选项卡,我可以看到 PHP 调用:
不确定根本问题是我如何使用 JS 调用 PHP 函数或 PHP 函数的放置位置。
解决方案
一个问题是你试图让 JS 生成 PHP 代码,然后期望它能够工作:它不能。PHP 在服务器上运行,只有在浏览器请求页面时才“做事”:PHP 生成源代码供浏览器处理。这就是它所做的一切。
当浏览器有页面时,JS 启动,PHP 不再存在:有关这方面的更多信息,请参阅Javascript 和 PHP 之间的差异,我强烈建议您阅读该内容。
但是,您所描述的真正document.write()
问题(您的页面看似重新加载但在 PHP 代码上死机)是由您使用 引起的,它绝对不会像您认为的那样做,您不应该在现代代码。
document.write
是JS中最早的函数之一,也是超低级的:它不会将文本写入网页,而是将字节写入文档字节流,以便文档解析器同时从字节流中提取数据并将其解析成页树。
虽然页面仍在处理中,但这似乎是安全的:document.write
只需将字节注入打开的字节流,解析器将解析它,一切看起来都很好。然而,一旦页面树完成并且文档字节流关闭,事情就开始变得非常非常错误:
任何调用都document.write
将尝试写入打开的字节流,如果它已关闭,document.write
则只会打开一个字节流:现在您有一个空文档字节流。因为文档解析器看到一个打开的字节流,它开始根据里面的内容构建一个页面树,现在你的页面已经消失了,因为这是你告诉浏览器做的。
它也不是“似乎在 PHP 函数处停止加载”的情况,实际发生的是您已经告诉页面解析器形成页面树的新页面代码是 byte sequence <?php echo upadtePurchaseToDB();?>
。所以解析器看着它,看到了<
,所以知道后面会是一个标签,因为这就是 HTML 的工作方式。然后它看到?
并运行“错误:此 HTML 是无效的 HTML”并停止。
所以这里的底线是阅读 PHP 运行的地点和时间,以及 JS 的运行地点和时间,但可以说更重要的是:永远不要使用document.write
,因为它根本不会按照你的想法运行。
推荐阅读
- java - 更改 DatePicker DayCell 颜色
- java - ResulSet web 服务调用错误resulset close
- javascript - 我可以隐藏我的平均菜单 jquery 的文本和按钮吗?
- sql - 计算sql过程中给定日期范围的百分比
- django - 如何在 Python 中迭代 json 对象?
- python - 如何为 Netmiko 访问的 if/else 输出创建每个 for 循环的专用文件
- python - 在 python 中如何使用选定的 Outlook 电子邮件
- java - RepositoryException:org.sql2o.Sql2oException:数据库错误:查询未返回任何结果
- c# - 如何在数据库操作正在进行时更新我的 XAML,然后在完成后再次更新它?
- c++ - c++ argmax of function(vector)