我从一个XML文件加载值,然后在php页面上用表单更新XML。我的问题是——我有一个在节点上运行计数的查询,它工作得非常好,但我还想用计数更新节点并获得准确的值。当我提交表单时,它会像加载文件时一样提交值,但为了正确更新计数(因为我需要更新的节点计数),我需要让它提交两次。我曾尝试让它在body-onload函数中提交表单,但从我所能确定的情况来看,当你点击提交按钮时,它不会进行真正的整页刷新。它重新加载页面,但我无法让它实际运行任何脚本或onload函数。我想到的另一种方法是,如果我将选项值更改为closed,则计数会下降,但我无法确定如何实现。
<!DOCTYPE html>
<?php
$xml->load('test.xml');
$xpath = new DOMXpath($xml);
$liftsopen = $xpath->query("//node/Lifts-Open")->item(0);
$lift1status = $xpath->query("//areas/area[@name='Lift1']/lifts/lift[@name='Lift1']/@status")->item(0);
$lift2status = $xpath->query("//areas/area[@name='Lift2']/lifts/lift[@name='Lift2']/@status")->item(0);
$liftcount = 0;
foreach ( $xpath->query('//lifts/lift[@status="OPEN"]') as $count1 ) {
$liftcount++;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$lift1->nodeValue = $_POST['lift1statusform'];
$lift2->nodeValue = $_POST['lift2statusform'];
$liftsopen->nodeValue = $liftcount;
$xml->save('test.xml');
}
?>
<body>
<form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
<h4>Lift1</h4>
<select name="lift1statusform" >
<option selected value="<?= htmlspecialchars($lift1status->nodeValue) ?>"><?= htmlspecialchars($lift1status->nodeValue) ?></option>
<option value="OPEN">OPEN</option>
<option value="CLOSED">CLOSED</option>
</select>
<h4>Gondola</h4>
<select name="lift2statusform" >
<option selected value="<?= htmlspecialchars($lift2status->nodeValue) ?>"><?= htmlspecialchars($lift2status->nodeValue) ?></option>
<option value="OPEN">OPEN</option>
<option value="CLOSED">CLOSED</option>
</select>
<input name="submit" type="button" value="Save"/>
</form>
</body>
</html>
使用以下Ajax函数提交表单两次:
function Test() {
var form = $('form');
$.ajax({
type: 'POST',
url: form.attr('action'),
data: form.serialize(),
success: function(data) {
$.ajax({
type: 'POST',
url: form.attr('action'),
data: form.serialize(),
success: function(data) {
location.reload(true);
}
});
}
});
}
AJAX是解决您的问题的有效方法吗?
如果需要执行多个“表单提交”,那么应该检查AJAX的功能。Ajax允许您使用后端PHP文件发送exchange数据,而无需离开(甚至刷新)当前页面。也许这就是你的解决方案。
与大多数js操作一样,它可以是事件驱动的(即由某个事件触发一次或多次),或者在循环中重复,等等。
AJAX最常用于jQuery库实现:
$(document).ready(function(){
$.ajax({
type: 'post',
url: 'my_backend_file.php',
data: {varname:value}
}).done(function(recd){
console.log('data recd from PHP side, if needed: ' + recd);
});
});
尽管它在vanilla js中处理得同样好。
参考文献和其他示例:
https://stackoverflow.com/a/54332971/1447509
我应该有一个表格还是两个独立的表格
https://www.html5rocks.com/en/tutorials/file/xhr2