PHP和JS在多页面环境中

我提前道歉,因为这有点长。 我一直试图弄清楚这一点没有成功,所以我想发布我的大部分代码,以便帮助我的神奇人物可以更好地了解我在做什么。 在我的上一篇文章中向我建议 – 不能在表单POST上调用.js – 我创建了一个新线程

我有一个项目,所有代码都发生在一个页面,html,php,javascript和一堆SQL查询。 我试图摆脱这一点,使用单独的页面,并将AJAX纳入其中,这样我就可以更新数据库,这是页面的核心,无需刷新。

我有两个主要页面 – test.phpgetuser.php ,以及两个较小的位, update.phpupdate.js

test.php是我首先加载的页面。 它分为两个

,顶部div,其中包含一个SQL查询到我的数据库以选择一个用户,以及底部div,当从下拉菜单中选择一个用户时,启动脚本showUser(),并向getuser.php发送一个AJAX请求,以加载下面的其余页面。

test.php的

           body { padding-top: 50px; padding-bottom: 20px; }    function showUser(str) { if (str !==".PM") { if (str=="") { document.getElementById("txtHint").innerHTML=""; return; } if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("txtHint").innerHTML=xmlhttp.responseText; } } } xmlhttp.open("GET","getuser.php?q="+str,true); xmlhttp.send(); }     
Select a name from the dropdown menu above...

getuser.php

            body { padding-top: 50px; padding-bottom: 20px; }     <?php $q = $_GET['q']; include('./db.php'); $LimitStart = 0 ; $LimitItems = 10 ; //THIS IS THE SQL COMMAND THAT ACTUALLY GRABS THE CORRECT PM $sqlPM= "SELECT * FROM report WHERE PMName = '".$q."' and REGNSB  0.000 ORDER BY TrackNumber ASC Limit $LimitStart,$LimitItems"; $result = mysqli_query($con, $sqlPM); // THIS IS FOR THE PAGE COUNT TOTAL OF THAT SPECIFIC PM $sqlCommand = "SELECT COUNT(*) FROM report where PMName = '".$q."' AND REGNSB  0.000"; $query = mysqli_query($con, $sqlCommand) or die(mysqli_error()); $pages = mysqli_fetch_row($query); $totalPages = round($pages[0] / 10); mysqli_free_result($query); if (isset($_POST['previous'])) { $postedLimit = (isset($_POST['previous']) ? (int) $_POST['previous'] : 0); $prevLimit = 1; $_SESSION['page'] = ((int) $nextLimit / 10)+1; $result = mysqli_query($con, "SELECT * FROM report WHERE PMName = '$PMSelection' AND REGNSB  0.000 ORDER BY TrackNumber ASC Limit $LimitStart,$LimitItems"); } if (isset($_POST['next'])) { $postedLimit = (isset($_POST['next']) ? (int) $_POST['next'] : 0); $nextLimit = $postedLimit + 10; $_SESSION['page'] = ((int) $nextLimit / 10)+1; $result = mysqli_query($con, "SELECT * FROM report WHERE PMName = '$PMSelection' AND REGNSB  0.000 ORDER BY TrackNumber ASC, RegNSB DESC Limit $nextLimit,$LimitItems"); } if (isset($_SESSION['page'])) { } else { $_SESSION['page'] = 1 ; } ?>  

DW1 Invoice-Backlog Report

Page  of   :   <input class="button" type="submit" name="previous" value="START" onclick="this.value="> <input class="button" type="submit" name="next" value="NEXT" onclick="this.value=">      

<input class="button" name="update"" type="submit" id="update" value="UPDATE">

update.js和update.php文件:

 $(function() { // Get the form. var form = $('#updateChanges'); // Set up an event listener for the contact form. form.submit(function(event) { // Stop the browser from submitting the form. event.preventDefault(); // Serialize the form data. var formData = form.serialize(); // Submit the form using AJAX. $.ajax({ type: 'POST', url: form.attr('action'), data: formData }); }); }); 

 <?php include('./db.php'); $data = array(); //array to pass back the sum of PM Comments, PM Recs, Outcomes... etc.... for ($n = 0, $t = count($_POST['PMComments']); $n  
<?php echo $sqlUPDATE . "
"; //this echos back the entire SQL entry that will be made ?>
<?php $doUPDATE = mysqli_query($con, $sqlUPDATE); if (!$doUPDATE) { die('Could not update data: ' . mysqli_error($con)); } if ($OutcomeValue 'null') { $sqlMOVE = "INSERT INTO results SELECT * FROM report WHERE LineID = $LineID ;" ; $sqlDELETE = "DELETE FROM report where LineID = $LineID ;" ; $doMOVE = mysqli_query($con, $sqlMOVE); if (!$doMOVE) { die('Could not MOVE data: ' . mysqli_error($con)); } $doDELETE = mysqli_query($con, $sqlDELETE); if (!$doDELETE) { die('Could not DELETE data: ' . mysqli_error($con)); } } } mysqli_close($con); ?>

问题

现在,我首先加载test.php并从下拉菜单中选择一个名称,该名称使用getuser.php生成的表填充页面的下半部分。 这是我的问题开始的地方。 在getuser.php页面上,我有3个按钮 – startnext按钮,以及submit按钮。 startnext按钮将我发送回开始(就像我从头开始加载test.php)和update按钮WORKS,但它加载update.php而不加载update.js,重定向到update.php并处理它成功了,(这是我试图通过使用多页面AJAX环境来避免的全部内容…) 如果我自己加载getuser.php?q = John%20Doe ,这些按钮都完全像我一样工作设计他们。

我试过的

我把这段代码放在我的update.js文件的开头,因为我在test.php和getuser.php中都调用它:

 $(document).ready(function(){ $("div").css("border", "3px solid red"); console.log("update.js loaded successfully"); }); 

只是为了确保我的.js文件正确加载。

如果正常加载页面(test.php),我页面的顶部标题周围会有一个小的红色边框 – 所以正在调用update.js,但是在之后加载的getuser.php上没有调用它在该页面上的div周围没有小红色边框。 如果我直接加载getuser.php而不通过test.php,边框就在那里,一切正常。

当我开始讨论这个时,我必须跳过一些学习部分,因为我不知道出了什么问题,或者我的一些代码仅在我直接加载页面而不是在另一个页面的“内部”时才起作用。

最大的问题是您加载到DOM中的HTML内容不会处理您包含的JavaScript文件。 因此,您应该使用jQuery的.load()来正确加载AJAX调用后面的页面。 这将加载包含的JavaScript文件。

整个块:

 function showUser(str) { if (str !==".PM") { if (str=="") { document.getElementById("txtHint").innerHTML=""; return; } if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else { // code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("txtHint").innerHTML=xmlhttp.responseText; } } } xmlhttp.open("GET","getuser.php?q="+str,true); xmlhttp.send(); } 

变为:

 function showUser(str) { if (str !==".PM") { if (str=="") { document.getElementById("txtHint").innerHTML=""; return; } } $("#txtHint").load( "getuser.php?q="+str ); } 
..all my headers..........
....all my rows...