0

通常,网页上的 Javascript 需要能够访问服务器上已知的变量。例如,用户的用户名。假设我们不想发出 JSON/XML 请求,因为这会增加不必要的复杂性以及页面点击次数。我们希望将数据与 html/Javascript 一起发送。

发送数据的一种方法是将其注入 Javascript。

var x={{username}};

另一个想法是在头部创建一个元项目并将数据存储在那里,然后使用 jQuery(或等效)来检索它。

这些方法中的任何一种都比另一种更可取,还是我应该考虑其他任何方法?

4

4 回答 4

1

我只会在头部有一个元素,它声明一个包含您的信息的命名良好的全局对象。就像是 :

<script type="text/javascript" >
    this.blah = this.blah || {};
    this.blah.userinfo = this.blah.userinfo || {};

    this.blah.userinfo = {
        "username" : "UserName42"
        "gender" : "Male"
    };
<script>

前两行只是初始化你的全局对象。由于它是全局的,我们使用“blah”来命名它。

于 2011-10-31T05:57:22.550 回答
1

我认为这个问题有点令人费解,因为根据我的经验,对于具有帐户、用户权限等的网站,您很少依赖静态/预先创建的 HTML 页面。

通常,这样的站点/应用程序依赖于某种“服务器页面”技术 - ASP、JSP、PHP(或通过 AJAX 请求管理所有这些) - 这将允许您编写某种标签/服务器代码,类似于<%=request.getAttribute("userName")%>-当服务器编译/解释时,它将在您想要的页面中为您注入用户名。

如果出于某种原因,您声称在您的应用程序中并非如此,并且您向用户提供了纯预先创建的或静态的 HTML - 那么,您确实必须执行以下操作之一:

1.获取用户名的AJAX请求

我认为你的论点

这将不必要地增加复杂性以及页面点击次数

不是一个有效的。技术使用的正确性应该胜过(也许不存在的)性能增益。相反,我也不认为这会增加复杂性-您可以将“用户”登录部分分离到一个模块中,然后在其他地方重用它。

2.注入JavaScript(或使用元标记)

而这个我不完全确定你将如何做到这一点并在那之后维护你的页面......

于 2011-10-31T06:06:31.553 回答
1

你的建议完全没问题。例如,CoffeeScript、Underscore.js 和 Backbone.js 的创建者 Jeremy Ashkenas 建议在Backbone 文档中做同样的事情

<script>
  Accounts.reset(<%= @accounts.to_json %>);
  Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
于 2011-10-31T06:15:06.477 回答
1

这些方法中的任何一种都比另一种更可取,还是我应该考虑其他任何方法?

我不认为有一个正确的答案,当然我在这个主题上听到了很多相互矛盾的意见,但是从你提到的两种方法中选择我会选择将值注入 JavaScript,因为我发现它更容易。

但是由于您要求其他建议,您可以将这两种想法结合起来:您的服务器端代码可以只<script><head>您的其他脚本(包括多个源文件中的脚本)。您可以将所有数据粘贴在一个对象中以避免大量全局变量:

<html>
<head>
<script>
   var dataFromServer = { /* all your server data here */};
</script>
<script type="text/javascript" src="somelibrarycript.js"></script> 
<script type="text/javascript" src="someotherscript.js"></script>
<script>
   if (dataFromServer.someProperty) {
      // someProperty provided above so do something with it...
   }
</script>
</head>
etc...

这种方法还有一个额外的优势,即服务器端代码本质上只是生成 JSON(如果直接包含在页面源中,它将成为对象字面量),因此如果您以后决定开始使用某些 Ajax,那么您就已经差不多了。

于 2011-10-31T07:40:03.690 回答