Scr*_*uff 1 javascript asp-classic
大家,早安,
我正在开发一个需要升级和重构的旧版 ASP 经典应用程序。需要进行的最大改进之一是通过缓存数据库中的结果来加速应用程序。通过将它们缓存到 .dat 文件,我已经能够成功地做到这一点。此应用程序遵循特定路径,因此我在完成处理后一直删除未使用的缓存文件。但是,在应用程序 (PV.asp) 的最终 .asp 页面上,文件在不应该被删除的情况下被删除了。
我的意图是这样的
<input type="button" value="Done" style="width: 56px; height: 40px" onclick="finish()" />
Run Code Online (Sandbox Code Playgroud)
^ 这是“完成”按钮的代码,它调用finish() 函数。下面是:
function finish() {
var size = "<%response.write(size) %>";
if (size == "0") {
var done = confirm("All Items mod, would you like to save?");
if (done == true)
{
if (window.XMLHttpRequest)
{
xmlhttp = new XMLHttpRequest();
}
else
{
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var concode = "<%=Replace(concode, "\", "\\" )%>";
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById('concode').value = concode;
document.forms["confirm"].submit();
}
}
<%if NOT rsTrxTy.EOF then
if rsTrxTy.fields("TYPE").value = "TO" then%>
~Stuff happens here~
<%end if
if rsTrxTy.fields("TYPE").value = "TI" then%>
~Stuff happens here~
<%end if
end if
if NOT rsOrdrs.EOF then%>
~Stuff happens here~
<%end if %>
<%
dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFile "C:\M\cache\rstrxis-" & Session.SessionID & ".dat"
fso.DeleteFile "C:\M\cache\rstrxos-" & Session.SessionID & ".dat"
fso.DeleteFile "C:\M\cache\rstrxty-" & Session.SessionID & ".dat"
fso.DeleteFile "C:\M\cache\rsords-" & Session.SessionID & ".dat" %>
}
}
else {
alert("All items have not been mod.");
}
}
Run Code Online (Sandbox Code Playgroud)
当用户单击“完成”按钮时,对项目所做的更改将提交到数据库。我的意图是当执行此操作时,缓存文件将被删除。 但是,即使用户没有单击“完成”按钮,DeleteFile 命令也会运行。它在页面加载完成后运行。这会导致问题,因为页面将尝试从加载 PV.asp 时删除的缓存文件加载。 由于此应用程序旨在在不关闭窗口的情况下几乎持续使用,因此会话 ID 将保持不变,这使得不会删除缓存文件成为可能(因为当应用程序重新启动时,它将尝试加载已加载的内容)缓存)。
我的问题是,为什么文件应该包含在仅在用户单击完成时执行的 javascript 函数中时被删除?我在 ASP/Javascript 方面没有经验,因为这个项目是强加给我的,所以如果这是一个简单的问题,我深表歉意,但老实说我很难过。
注意 -移动到 ASP.Net 是不可能 的。请不要提出这个建议。
这不是 ASP 的工作方式。ASP 代码段(之间的内容<% ... %>)仅在页面首次加载时计算一次。
例如,如果您这样做:
<script type="text/javascript">
function finish() {
<%
dim fso
Set fso = Server.CreateObject("Scripting.FileSystemObject")
fso.DeleteFile "C:\M\cache\rstrxis-" & Session.SessionID & ".dat"
fso.DeleteFile "C:\M\cache\rstrxos-" & Session.SessionID & ".dat"
fso.DeleteFile "C:\M\cache\rstrxty-" & Session.SessionID & ".dat"
fso.DeleteFile "C:\M\cache\rsords-" & Session.SessionID & ".dat"
%>
}
</script>
Run Code Online (Sandbox Code Playgroud)
该fso.DeleteFile函数调用被称为页面加载时,而不是在JavaScript函数被触发。
为什么?当服务器收到对 ASP 页面的请求时……它首先通过<% %>真正的 HTML处理并处理所有动态代码段,然后向用户返回一个他们可以加载的页面。注意:浏览器不知道如何处理<% %>标签!服务器是唯一可以做到这一点的人。
这有意义吗?
您有几个选项可以执行您在此处实际尝试执行的操作,但我会继续对新 ASP 页面执行 Ajax 请求,它所做的只是调用您需要的 fso.DeleteFile 命令。
这是一个例子:http : //www.degraeve.com/reference/simple-ajax-example.php
其他选项是使用 get/post 到同一页面,并带有将触发 DeleteFile 的参数。你必须重新设计一下才能使用它。我推荐 ajax 解决方案。