如何将变量传递给JS文件
Posted
技术标签:
【中文标题】如何将变量传递给JS文件【英文标题】:How to pass variables in to a JS file 【发布时间】:2010-11-18 13:19:29 【问题描述】:我知道这有一个简单的答案,但这有两个问题。
问题一:
在 asp.net 页面中有一个这样的 javascript 块:
<script type="text/javascript">
function doSomethingRandom()
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
</script>
好的,这是问题的简化版本,但应该很清楚。我现在想将此函数移动到 JS 文件中...但我无法将 asp:Literal 放入 JS 中。
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
<script src="myJSFile.js" />
...让我有点不舒服,有没有更好的方法?
问题 2:
类似的问题,但是这次第二个版本是这样的:
<asp:ScriptManagerProxy runat="server">
<Scripts>
<asp:ScriptReference Path="~/tree/AttributeTree.js" />
</Scripts>
</asp:ScriptManagerProxy>
但这次我不能现实地把
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
上面是因为使用 ScriptManagerProxy 无法真正知道脚本文件将出现在哪里。
所以,问题出在他们身上!谢谢。
【问题讨论】:
【参考方案1】:我们使用Page
的RegisterStartupScript
方法向ClientScriptManager 注册初始化函数。我们的 Javascript 文件仅包含函数,并通过 ScriptManager
加载(就像在您的 sn-p 中一样)。我们为页面编写了一个扩展方法(称为JSStartupScript
),它有助于注册启动脚本,最终我们的代码如下所示:
<%
Page.JSStartupScript(string.Format("initFeatureX(0, 1, 2);",
AntiXss.JavaScriptEncode(ViewData.Property1),
AntiXss.JavaScriptEncode(ViewData.Property2),
AntiXss.JavaScriptEncode(ViewData.Property3)));
%>
这也可以与ScriptManager
s CompositeScript
集合和LoadScriptsBeforeUI = false
设置结合使用。
【讨论】:
【参考方案2】:基本上:你不能那样做。
您可以做的是在网站上设置由 ASP 生成的值(就像您现在一样),然后从外部 js 脚本中引用该变量,但这很难看。
另一种解决方案是您可以将此变量存储在 cookie 中(由 ASP 设置),然后在外部 JS 中读取该 cookie。您还可以将此值传递给您正在显示的站点的 URL,并在 JS 中解析 url 以获取该值,但我认为 cookie 会更好,因为您仍然有一个干净的 URL,并且读取 cookie 比解析 url 更容易参数。
【讨论】:
【参考方案3】:您可以将 aspx 文件用作 js 文件。
\<script src="<%= ResolveUrl("~/js/dynamic.aspx") %>"></script>
你可以在 aspx 中做任何你想做的事情。
【讨论】:
(删除斜线 - *** 想要去掉脚本标签) 恐怕您在使用该解决方案时会遇到缓存问题。如果您不在链接中保留动态参数,您的浏览器可能会缓存它并且不会下载可能因为 id 已更改而更改的更新版本。如果您添加动态参数,浏览器将在每次页面刷新时下载此文件。【参考方案4】:另一种方法是动态加载javascript文件。 我的意思是这样的
<script>
var myVarToUse = <asp:Literal runat="server" ID="HackyLiteral" />
ComponentLoad("/tree/AttributeTree.js"); //here Javascript file will be loaded
</script>
但这也不是最好的解决方案。因为会有很多全局变量比。 所以最好这样做:
<script>
ComponentLoad("/tree/AttributeTree.js","doSomethingRandom",myVarToUse:"<asp:Literal runat="server" ID="HackyLiteral" />"); //here Javascript file will be loaded
</script>
【讨论】:
以上是关于如何将变量传递给JS文件的主要内容,如果未能解决你的问题,请参考以下文章
将视图(php文件)作为字符串传递给yii 2中registerJS中的变量js
PhoneGap / Cordova 将 appdelegate 变量传递给 JS
如何将 node.js 变量传递/访问到 html 文件/模板
Node.js:如何将全局变量传递到通过 require() 插入的文件中?