onload Javascript的最佳实践

时间:2009-01-26 21:17:56

标签: javascript onload

处理分布在多个页面上的几个不同的onload脚本的最佳方法是什么?

例如,我有50个不同的页面,并且在每个页面上我想在dom准备就绪时设置不同的按钮单击处理程序。

最好在每个页面上设置这样的onclicks,

<a id="link1" href="#" onclick="myFunc()" />

或外部js文件中的一个非常长的文档就绪函数,

Element.observe(window, 'load', function() {
  if ($('link1')) {
    // set click handler
  }
  if ($('link2')) {
   // set click hanlder
  }
  ...
}

或者将每个if ($('link')) {}部分拆分为脚本标记,并将它们放在适当的页面上,

或者最后,将每个if ($('link')) {}部分拆分为自己独立的js文件,并在每个页面中正确加载?

解决方案1似乎是最不优雅且相对突兀,解决方案2将导致非常冗长的加载功能,解决方案3不那么突兀然后1但仍然不是很好,解决方案4将加载需要用户下载单独他访问的每页js文件。

这些是最好的(或最差的)还是有解决方案5我没想到?

编辑:我问的是设计模式,而不是哪个onload函数是合适的。

7 个答案:

答案 0 :(得分:3)

您是否考虑过为要附加到元素的每种行为创建一个类?这样,您可以在页面之间重用功能,以防万一有重叠。

例如,假设您想要的某些页面上有一个按钮,可以在页面上弹出一些额外的信息。你的HTML看起来像这样:

<a href="#" class="more-info">More info</a>

您的JavaScript可能如下所示:

jQuery(".more-info").click(function() { ... });

如果您坚持某种约定,您还可以向链接添加多个类,并在需要时让它执行一些不同的操作(因为jQuery将允许您在元素上堆叠事件处理程序)。

基本上,您专注于将JavaScript附加到的每种元素的行为,而不是选择要附加功能的元素的特定ID。

我还建议将所有JavaScript放入一个公共文件或有限数量的常用文件中。主要原因是,在第一次页面加载之后,JavaScript将被缓存,并且不需要在每个页面上加载。另一个原因是,它会鼓励您为整个站点中可用的按钮开发常见行为。

在任何情况下,我都不鼓励在html(选项#1)中直接附加onlick。它是突兀的,限制了JavaScript的灵活性。

编辑:我没有意识到Diodeus发布了一个非常相似的答案(我同意)。

答案 1 :(得分:1)

我会尽可能使用JQuery's 文档准备

  $(document).ready(function() {

      // jQuery goodness here.
 });

答案 2 :(得分:1)

首先,我不明白为什么你认为设置事件监听器是突兀的?

但......

解决方案一个是个坏主意

<a id="link1" href="#" onclick="myFunc()" />

因为你应该保持你的化妆和你的脚本分开。

解决方案二是一个坏主意

Element.observe(window, 'load', function() {
  if ($('link1')) {
    // set click handler
  }
  if ($('link2')) {
   // set click hanlder
  }
  ...
}

因为您在每个页面都使用了大量不需要的javascript。

解决方案三是一个坏主意,出于同样的原因,我说解决方案是一个坏主意。

解决方案4是最好的主意,是的,每页额外加载一次,但如果每个页面只拆分if($('link')){}部分,文件大小不能那么大?另外,如果您从全局javascript中获取此代码,则其加载时间将减少。

答案 3 :(得分:1)

你可以破解课程名称并以创造性的方式使用它:

<a class="loadevent functionA" id="link1" href="#" onclick="myFunc()" />

...在另一页......

<a class="loadevent functionB" id="link1" href="#" onclick="myFunc()" />

您可以按类名“ loadevent ”进行选择,并获取该标记的其他类名,另一个类名是您想要挂钩的实际函数名。这样一个处理程序就能够完成每个页面,你所要做的就是提供相应的类名。

答案 4 :(得分:0)

虽然克里斯有点正确,你可以这样做:

$(document.ready(function() {
  // A
});
$(document.ready(function() {
  // B
});
$(document.ready(function() {
  // C
});

并且将调用所有函数(按照它们遇到的顺序),值得一提的是ready()事件与onload()不完全相同。来自jQuery API docs

  

绑定要执行的函数   每当DOM准备就绪时   遍历和操纵。

您可能需要load()事件:

$(document).load(function() {
  // do stuff
});

将等待加载图像等。

答案 5 :(得分:0)

如果不使用kneejerk jQuery,如果页面变化JS相对较轻,我会将其包含在内联头文件脚本中(绑定到onload事件触发器,是),类似于#4,但我不会这样做一个单独的JS脚本和下载,我想用服务器端包括处理这个 - 但是你想要处理它(我?我将使用XSLT包括)。

这为您提供了高度的模块化分离,并使下载尽可能轻松。

答案 6 :(得分:0)

有很多不同的页面,我会允许对这些页面进行不同的事件处理......

但是,如果差异很小,我会尝试找到一个可以依赖的模式,并且可能会制作一个真正简单的算法来区分页面...

我要采取的最后一件事是使用(大)库(jquery,mootools或其他什么! - ),如果我不打算以任何其他方式使用它...

现在,您正在谈论最佳实践,最佳实践始终是您的用户将体验为最轻的解决方案,并且应该以最广泛的方式理解用户,包括开发人员等等。那个网站!o]