如何将变量传递给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】:

我们使用PageRegisterStartupScript 方法向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)));
%>

这也可以与ScriptManagers 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() 插入的文件中?

在生产中使用 dotenv,还是将 env 变量传递给 js/js.erb?并尝试使用凭据

js变量传递给json