我仍在努力学习AJAX和各种实施方法。我的网站上有一个DIV标签,我通过将status.php文件重新加载到DIV标签中,使用AJAX在5秒后动态更新(定时更新是出于无关的原因)。
我遇到的问题是当我直接浏览status.php时,命令按钮正常工作,但是当我通过index.php使用它们时,它们没有响应。
我试图了解为什么他们以这种方式失败以及我能以“ELI5”的方式在工作中做出什么。
命令按钮运行Python脚本,打开/关闭车库门。下次运行状态Python脚本(在status.php顶部)时,它将具有门的新状态,并在AJAX更新该部分页面时最终显示在DIV标签中。
当我单击按钮时,现在index.php会一直显示在其中,但DIV标记完全重新加载status.php。但是,当发生这种情况时,Python脚本似乎不会被触发。
我怀疑命令按钮需要以更多的AJAX / Java-ey方式运行,而不是通过PHP运行,但我甚至不知道从哪里开始。
哦,还有一件事:我还有一个CGI脚本(e.h。http://example.com/cgi-bin/myq-cgi.py?username=user&pass=pass&command=open),我也可以用来打开/关闭门。我不会将它用于状态,因为它没有像完整的Python脚本那样包含状态上次更改的时间/日期。这可能是更好地打开/关闭门的潜在方式。
的index.php:
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.0/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
setInterval(function(){
$.ajax({
url: "status.php",
type: "POST",
dataType: "text",
success: function(data){
$("#status_div").html('The Garage Door Status is: ' + data);
}
})
}, 5000);
});
</script>
</head>
<body>
Somethign on the web page. Normally this would be the main website while the DIV tag waits to load.
<div id="status_div"></div>
</body>
</html>
status.php:
<?php
// Call Python script which gives me the status of my garage door in a text string.
$output = shell_exec('python /home/blah/garage_door/myq-garage.py status');
//I am NOT including lots of parsing of the $output. Eventually I get the $output trimmed down to the to the $status PHP variable.
$status[1] = "Closed" //values here can be either 'Closed' or 'Open'
?>
<!-- // Style info for table(s) -->
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:7px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:7px 7px;border-style:solid;border-width:1px;overflow:hidden;wor$
.tg .tg-baqh{text-align:center;vertical-align:top}
.tg .tg-yw4l{vertical-align:center;text-align:left}
</style>
<!-- // HTML table to display garage door status info. Display the image of the door and door status in left cell, time/date and options in right -->
<center>
<table class="tg">
<tr>
<th class="tg-baqh">
<div class="garage_status">
<?php
//Stuff unrelated to OP question here. Dynamically displaying an image based on garage door status.
?>
</div>
</th>
<th class="tg-yw4l">
<?php
// Command button to open door.
if (isset($_POST['button_open'])){
if ($status[1] = "Closed"){
shell_exec('python /home/blah/garage_door/myq-garage.py open "Garage Door"');
}
}
// Command button to close door.
if (isset($_POST['button_close'])){
if ($status[1] = "Open"){
shell_exec('python /home/blah/garage_door/myq-garage.py close "Garage Door"');
echo "<script>alert (\"cmd button works\")</script>";
}
}
?>
<form method="post">
<p>
<button name="button_open">Open Door</button>
<button name="button_close">Close Door</button>
</p>
</form>
</th>
</tr>
</table>
</center>
答案 0 :(得分:0)
我让他们工作。车库门打开/关闭。 index.php重新加载ajax足够快,用户可以看到状态,例如从Closed更改 - &gt;开幕 - &gt;打开 - &gt;结束 - &gt;关闭。更重要的是,该页面不会像旧的PHP按钮那样进行整体重新加载。
这次我用HTML / javascript中的按钮而不是PHP。另外,我没有运行Python脚本,而是使用了一个不同的基于python的CGI脚本,正如我提到的那样,我可以在我的OP中使用。
一旦这个工作在index.php中,只是为了它,我把它复制到status.php,当它加载了ajax时,它仍然在那里正常工作并将执行!
这是首先在index.html中的javascipt,但最终转移到status.php:
<script>
function open_door() {
jQuery(function($) {
$.ajax( {
url : "http://example.com/cgi-bin/myq-cgi.py?user=somethibng@hotmail.com&pass=dfgsdfgsdfg&cmd=open",
type : "GET",
success : function(data) {
alert ("Opening Door..."); //or use data string to show something else
}
});
});
}
</script>
<script>
function close_door() {
jQuery(function($) {
$.ajax( {
url : "http://example.com/cgi-bin/myq-cgi.py?user=something@hotmail.com&pass=dfgdfgsdfg&cmd=close",
type : "GET",
success : function(data) {
alert ("Closing Door..."); //or use data string to show something else
}
});
});
}
</script>
<form>
<input type="button" value="open" onClick="open_door()"
</form><form>
<input type="button" value="close" onClick="close_door()"
</form>