如何动态将JS值传递至JSCRIPT(ASP)?求解决方案
动态通过JS为ASP(JScript)变量赋值的解决方案
我的家庭自动化系统仅支持通过运行在SPS嵌入式IIS上的JScript(ASP)通信。目前正将旧的纯HTML+JScript界面迁移至Bootstrap架构,但数据访问仍需依赖JScript(ASP)。读取ASP变量、静态赋值操作均正常,但动态通过JS为ASP变量赋值遇到瓶颈,需要实现类似WritetoASP(A_Var, J_Var)的功能——其中A_Var为ASP变量名,J_Var为待传递的值。
原测试代码及运行结果
<% @LANGUAGE="JSCRIPT"%> <% var A_Var=88; %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>ASP JS HTML Test</title> <script runat="server" type="text/javascript"> var J_Var, Par="A_Var"; /* 直接使用ASP变量名,能正确读取值 */ J_Var = <%=A_Var %>; document.write ('J_Var = '+J_Var+'<br>'); /* 静态赋值ASP变量,能正确写入 */ <%A_Var = 66;%>; document.write ('A_Var = '+<%=A_Var%>+'<br>'); /* 尝试用JS变量存储ASP变量名再读取,失败 */ J_Var = <%="Par"%>; document.write ('J_Var = '+J_Var+'<br>'); /* 用eval执行ASP命令,失败 */ J_Var = eval('<%="Par" %>'); document.write ('J_Var = '+J_Var+'<br>'); /* 用eval执行生成的字符串,失败 */ /* 替换是为了避免JS解析ASP标签 */ Par="'Ü%="+Par+"%>'"; document.write ('Par = '+Par+'<br>'); J_Var = eval(Par.replace(/Ü/g,"<")); document.write ('J_Var = '+J_Var+'<br>'); </script> </head> <body> </body> </html>
运行结果:
J_Var = 88 A_Var = 66 J_Var = A_Var J_Var = A_Var Par = 'Ü%=A_Var%>' J_Var = <%=A_Var%>
问题本质
核心是ASP脚本块与服务器端JScript的执行上下文隔离:<%=...%>是服务器端直接输出内容到HTML,服务器端JScript里的eval只能处理JS代码,无法解析ASP标签。ASP变量在服务器端JScript中是全局变量,但无法直接通过字符串名字引用,必须借助对象属性的动态访问语法。
解决方案
方案1:服务器端JScript动态操作ASP变量
将需要动态赋值的ASP变量存入一个全局对象,通过对象的属性访问语法实现动态读写:
<% @LANGUAGE="JSCRIPT"%> <% // 统一管理需要动态操作的ASP变量 var aspVars = { A_Var: 88 }; // 实现WritetoASP函数:根据变量名动态赋值 function WritetoASP(varName, value) { if (aspVars.hasOwnProperty(varName)) { aspVars[varName] = value; } } %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>ASP JS HTML Test</title> <script runat="server" type="text/javascript"> var J_Var, Par="A_Var"; // 动态读取ASP变量 J_Var = aspVars[Par]; document.write ('J_Var = '+J_Var+'<br>'); // 动态赋值ASP变量 WritetoASP(Par, 66); document.write ('A_Var = '+aspVars.A_Var+'<br>'); // 再次测试动态赋值 Par = "A_Var"; WritetoASP(Par, 99); document.write ('更新后A_Var = '+aspVars[Par]+'<br>'); </script> </head> <body> </body> </html>
方案2:前端JS触发服务器端ASP变量赋值
如果需要客户端浏览器JS触发赋值,必须通过HTTP请求(表单提交或AJAX,嵌入式IIS需确认支持情况),因为客户端JS与服务器端ASP完全处于不同运行上下文:
<% @LANGUAGE="JSCRIPT"%> <% var A_Var = 88; // 处理表单提交的赋值请求 if (Request.Form["action"] === "updateVar") { var varName = Request.Form["varName"]; var varValue = parseInt(Request.Form["varValue"]); // 用对象管理变量,支持动态赋值 var aspVars = { A_Var: A_Var }; if (aspVars[varName] !== undefined) { aspVars[varName] = varValue; A_Var = aspVars.A_Var; } } %> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>ASP JS HTML Test</title> <script type="text/javascript"> // 前端JS实现WritetoASP:通过表单提交传值到服务器 function WritetoASP(varName, varValue) { const form = document.createElement("form"); form.method = "POST"; form.action = window.location.href; // 隐藏域传递操作类型、变量名、变量值 form.innerHTML = ` <input type="hidden" name="action" value="updateVar"> <input type="hidden" name="varName" value="${varName}"> <input type="hidden" name="varValue" value="${varValue}"> `; document.body.appendChild(form); form.submit(); } // 页面加载后测试赋值 window.onload = () => { WritetoASP("A_Var", 77); }; </script> </head> <body> 当前A_Var值:<%=A_Var%> </body> </html>
内容的提问来源于stack exchange,提问作者Hodde
相关产品推荐
相关产品推荐

