2

我现在正在开发一个 facebook 应用程序,这一切都靠我的孤独。我正在尝试对 onclick 事件进行 javascript 调用。在这个 onclick 事件中,我根据正在链接的项目填充一些参数(来自 php 中的服务器端)。我正在插入一些 JSON 和其他一些带有时髦字符的东西。

Facebook 要求锚点的所有属性字段都是严格的字母数字。除了 0-9a-Z_ 之外,没有引号、感叹号和其他任何内容。因此,当用户单击该链接时,它会对我想要传递给我的 javascript 函数(例如 JSON)的参数产生影响。

所以我想,为什么我不使用我的模板系统来自动生成 javascript?对于我要生成的每个链接,我都会生成一个唯一的 javascript 函数(DoItX,其中 X 是此页面的唯一整数)。然后,我不会尝试通过 onclick 将参数传递给我的 javascript 函数,而是将我的参数作为 DoX 的局部变量插入。在链接“X”上,我只是说 onclick="DoX()"。

所以我做了这个并且中提琴它有效!(它也帮助我避免引用我之前遇到的地狱)。但我觉得恶心

我的问题是,我疯了吗?有没有更简单的方法来做到这一点?我理解有人能够以某种方式更改我的模板化局部变量的含义,即:

var local = {TEMPLATED FIELD};

用分号插入一些东西,将任意javascript插入客户端。(而且我正在尝试编写代码来对此持偏执态度)。

什么时候可以(是否可以)从服务器生成 javascript?我应该注意什么/最佳实践?

4

6 回答 6

5

根据您的应用程序,在模板语言中生成 JavaScript 可以节省大量时间,但需要注意一些陷阱。最严重的一点是,当您没有完整的模板堆栈可用时,测试您的 JavaScript 会变得非常困难。

另一个主要缺陷是尝试将 JavaScript 逻辑“抽象”到一些更高级别的类变得很诱人。通常这表明您将在项目中刮牦牛。在 JavaScript 中保持 JavaScript 登录。

从您提供的少量信息来看,您的解决方案似乎是明智的。

于 2009-10-31T03:21:19.787 回答
4

如果你必须生成 javascript,我建议只生成JSON并让所有函数都是静态的。

它更干净地分离了数据,也更容易验证以防止 XSS 等。

于 2009-10-31T03:52:37.990 回答
2

从服务器生成的 JS 用于很多领域。以下是框架生成 JS 脚本的 ASP.NET 页面的示例:

<script src="/WebResource.axd?d=9h5pvXGekfRWNS1g8hPVOQ2&amp;t=633794516691875000" type="text/javascript"></script>

尝试拥有不需要重新生成的可重用脚本函数;并“挤压”出真正动态的服务器端生成。

于 2009-10-31T03:22:55.897 回答
1

如果您想对此感觉更好,请确保您的大部分 JavaScript 位于不会生成的单独库文件中,然后在生成代码时生成对这些库的调用,而不是生成大量 JavaScript 代码。

于 2009-10-31T03:56:25.390 回答
0

从服务器生成JS就可以了。请记住不要从服务器罚款太大的页面。

于 2009-10-31T03:17:22.130 回答
0

一般来说,我会避免从服务器端语言自动生成 JavaScript,尽管我这样做了;创建从我的 JavaScript 将使用的服务器端变量初始化的 JavaScript 变量。这使得测试和调试变得更加简单。

在您的情况下,我可以创建如下易于测试的局部变量:

<script type='text/javascript' language='javascript'>
<!--
var FUNC_ARG_X = <%= keyX %>;
var FUNC_ARG_Y = <%= keyY %>;
var FUNC_ARG_Z = <%= keyZ %>;
//-->
</script>
<script type='text/javascript' language='javascript'>
<!--
function DoCleanCall(arg) {
    // Whatever logic here.
}
//-->
</script>

现在在您的标记中使用:

<a href='#' onclick='DoCleanCall(FUNC_ARG_X);'>Test</a>

现在当然可以在标签上嵌入服务器端变量<a/>,但是有时需要从 JavaScript 的其他部分引用这些值。

还要注意生成的内容是如何在它自己的<script>标签中的,这是故意的,因为它可以防止解析器失败并告诉你你使用它的每个引用都有无效的代码(就像 ASP.NET 一样),它仍然会失败但是只有部分。

于 2009-10-31T04:40:54.697 回答