首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >附加JavaScript事件(对于大型web项目)的最佳实践是什么?

附加JavaScript事件(对于大型web项目)的最佳实践是什么?
EN

Stack Overflow用户
提问于 2011-10-18 04:12:32
回答 4查看 274关注 0票数 1

目前,我正在整个项目中使用一个.js文件(加上包含的库)。只是偶尔我会将文件分割成多个文件(即前端和后端部分)。在文件中,我使用jQuery选择器在单个ready事件处理程序中附加事件(和其他功能):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(document).ready(function() {

   $('#an_element_on_homepage').click(function() {
      // do something
   });

   // ...
   // A lot of similar code here
   // ...

   $('.elements_on_homepage_and_contact_page').click(function() {
      // do something
   });
});

这是完全可行的,但是在一个更大的项目上,可能会有大量不必要的代码执行,因为某些事件只需要在特定的页面上执行,或者在不同的页面之间可能会发生id/class冲突。避免问题并仍然保持JavaScript和HTML代码易于维护性的最佳实践是什么?

我能想到两种解决方案:

  1. 将.js文件拆分为多个文件,并在每个页面上只选择所需的文件。但是,很难正确分发事件附件,并且可能会在客户端缓存脚本时出现问题。
  2. 将事件附件包装在函数中,并仅在需要时从HTML代码中调用它们。类似于: 函数attachClickOnElementOnHomepage() {$(‘#an_element_on_homepage’).click(函数(){ // do });} 然后在HTML中:

你能想出另一个/更好的解决办法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-18 04:39:52

正如您所说,解决方案1对于HTTP往返并不特别有效,但是如果您正在开发一个内部应用程序,您可能会选择忽略这个问题。

解决方案2看起来就像内联事件处理程序注册的一种迂回方式。

我使用的模式是一个JS文件,它有我想要作为一个特定于项目的“库”重用的任何代码--很少有足够的代码来分割它。并且每个服务器端代码单元都有一个JS文件-- MVC控制器、独立的Wicket控件--只实现特定于页面的行为,或者连接到可重用的代码。此文件通常以控制器的名称命名。

优点:

  • 有明确的关联JS行为会发生在哪里
  • 您可以删除页面中的内联Javascript --我不喜欢它,因为它使设置JS断点成为一项烦琐的工作。
  • 如果将JS库组合在一起,则在任何给定页上只包含2-3个脚本文件,其中没有在每个页面上重用其中的一个脚本文件。
  • 冲突的风险较小,因为选择器太宽,可能匹配不同页面上的元素,而不是预期的,并将意外的行为附加到它们上。
  • JS代码仍然相当简单--包括在页面中的脚本。不需要设计模块结构。

一个可能的缺点是某些代码可能在特定于页面的脚本之间重复,但这是将机制与策略分离的成本。对于设置jQuery UI按钮或选择的选择框等琐碎代码来说,这种情况大多发生在我身上;因为它们共享一个共同的主题,所以我的解决方案是将它们合并到一个单独的JS文件中,以进行"ui增强“。

您还可以考虑将细粒度、可维护的javascripts合并为更容易加载的工具,作为构建步骤;对于性能提高很重要的大型项目,维护这一点的工作可能不会太费劲。具体情况取决于您的其他工具是什么,回退解决方案可以像调用jsmin命令行版本的calls脚本一样简单。

票数 1
EN

Stack Overflow用户

发布于 2011-10-18 04:52:35

这是一个经典的代码结构问题。

将视图分离为小部件(比如插件)。如果应用程序中有模型,请将它们的声明从主onReady事件中分离出来,在模型中触发事件,并允许UI小部件与模型交互。

大多数情况下,分离您的文件以便:*对您的工作有一个更清晰的视图*分离的关注点,并且只公开所需的内容。

例如,考虑到与文件中的位置无关的内容。如果您使用没有在文件中声明的变量,请考虑您已经破坏了关注点分离的原则。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var myModel = function () {/**...**/};
var myModel.prototype.save = function () {/**...**/}

var myUIElt = function (model) {
  this.render(); //Do whatever required
  this.bind('onchange', function() { model.update();});
};

这样,在您的onReady回调中,您将拥有:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$(function() { var elt = new myUIElt(); }); // Much cleaner, huh ? ;)

在现实世界中,事情可能会更复杂一些,但主要的想法是上面的想法。

不要犹豫想要更多的细节,

HTH,

票数 2
EN

Stack Overflow用户

发布于 2011-10-18 04:44:36

您可以在模块中组织代码,并在每个模块中定义init函数。

然后,只有在当前加载的页面上存在需要的元素时,才调用moduleName.init()函数

就像这样

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var homePageModule = {
  init: function() {
    $('#an_element_on_homepage').click(function() {

    });
    anotherFunction();

  },
  anotherFunction: function() {
    //do something
  }
}; 
   //check for elements
    $(function() { 
      if ($('#an_element_on_homepage').length) {
        homePageModule.init();
      }
    });

P.S.:或者使用类并相应地实例化它们以使元素存在

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7807012

复制
相关文章
DOMContentLoaded实现
IE系列直到IE9才支持DOMContentLoaded事件,对于IE8及其之前版本,如果html内没有框架,则可以采用document.documentELement.doScroll来判断 是否构建好DOM树;如果html内有框架,则利用document的onreadystatechange事件判断当前DOM树是否构建完毕(框架html内容(只是html文件)加载之后DOM树构建完毕)。 所以可以采用这种方式: /** * 实现DomContentLoaded的兼容性
欲休
2018/03/15
5860
为什么LONGNET可以处理10亿个令牌
Vaswani等人在2017年引入的Transformers是LLM和许多其他机器学习任务的基石。它成功的主要原因之一是自注意力机制。但是随着模型的扩大这种机制成为计算瓶颈,特别是对于长序列。
deephub
2023/08/30
2550
为什么LONGNET可以处理10亿个令牌
DOMContentLoaded和window.onload
相信写js的。都知道window.onload吧,可是并非每一个人都知道DOMContentLoaded,事实上即使你不知道。非常有可能你也常常使用了这个东西。
全栈程序员站长
2022/07/06
1.5K0
从 8 道面试题看浏览器渲染过程与性能优化
移动互联网时代,用户对于网页的打开速度要求越来越高。百度用户体验部研究表明,页面放弃率和页面的打开时间关系如下图 所示。
null仔
2020/03/02
1.2K0
微信小程序阻止事件冒泡
江拥羡橙
2023/02/24
2.9K0
微信小程序阻止事件冒泡
文档解析和DOMContentLoaded触发时机
| 导语 大家都知道 HTML 文档完全加载和解析完成之后,会触发 DOMContentLoaded 事件,那么 HTML 里面的内容会如何影响文档解析呢?在解析过程中遇到 script 标签或者 link 标签时,解析会受影响吗?我们通过不同情况举例和 HTML5 规范一起分析一下。 DOMContentLoaded 触发定义 HTML 文档被完全加载和解析完成之后,会触发 DOMContentLoaded 事件,通常外部样式表和文档内的图片加载都不会影响该事件触发,不过也有特殊情况,我们后面会提到。 如
用户1097444
2022/06/29
7820
文档解析和DOMContentLoaded触发时机
前端资源浏览器渲染原理
当有了DOM Tree和 CSSOM Tree后,就可以两个结合来构建Render Tree了
冷环渊
2023/02/26
5750
前端资源浏览器渲染原理
【前端】:async、defer、onload、DOMContentLoaded
The HTML <script> element is used to embed or reference executable code; this is typically used to embed or refer to JavaScript code.
WEBJ2EE
2019/12/31
1.9K0
【前端】:async、defer、onload、DOMContentLoaded
【python图像处理】python绘制
3D图形在数据分析、数据建模、图形和图像处理等领域中都有着广泛的应用,下面将给大家介绍一下如何使用python进行3D图形的绘制,包括3D散点、3D表面、3D轮廓、3D直线(曲线)以及3D文字等的绘制。
py3study
2020/01/10
1.5K0
【python图像处理】python绘制
第一次遭遇挖矿程序
问题分析 1. 两台服务器收到告警,top 查看进程发现如下可疑进程 # top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 19078 vmuser 20 0 680232 14284 1032 S 342.8 0.1 1583:11 md 501 vmuser 20 0 32348 3264 760 R 55.9 0.0 2172:49 [at
tanmx
2018/07/16
1.4K0
第一次绘制K线图与网络图
The following objects are masked from ‘package:base’:
黑妹的小屋
2020/08/06
8970
为什么开源可以提高程序员的编程技能?
为什么开源可以提高程序员的编程技能? 我已经写了很多年的软件。最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好。这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗? 阅
用户1289394
2018/02/27
6790
为什么开源可以提高程序员的编程技能?
为什么开源可以提高程序员的编程技能?
我已经写了很多年的软件。最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好。这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗?
哲洛不闹
2018/09/18
3480
为什么开源可以提高程序员的编程技能?
为什么开源可以提高程序员的编程技能?
我已经写了很多年的软件。最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好。这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗? 阅读代码能让你变得更优秀 我在编程生涯的早期就明白我阅读的代码越多,我的代码就能变得更好。我知道,当我不得不维护其他人的代码时,简单和干净的代码几乎总是比花哨或复杂 的代码好—— 即使有注释。然而另一方面,当我花足够的时间去理解复杂代码的时候,我常常能够学到新的技巧。不论怎么样,都能让我有所提高。 这使得我在那些没有代码审查的地方一再争取。而当没有足够的
wangxl
2018/03/08
6610
css是否会阻塞与DOMContentLoaded
原本只是想分享Network的一些内容,结果到DOMContentLoaded的时候给卡住了,网上很多强调css不会阻塞DOM解析,可以说对又可以说不对。
wade
2021/05/28
6980
css是否会阻塞与DOMContentLoaded
HTML解析之DOMContentLoaded和onload
在很久很久以前,我在封装自己的JQuery库时就使用过DOMContentLoaded,觉得这个知识点看看别的文章就行了,不过现在我想把它记下来。
全栈程序员站长
2022/11/16
1.6K0
HTML解析之DOMContentLoaded和onload
为什么开源可以提高程序员的编程技能?
我已经写了很多年的软件。最近我意识到,我越涉及(致力于,结合于等)开源技术,我写出来的代码就更好。这不由地让我疑惑起来:难道里面有什么相关性或因果关系吗? 阅读代码能让你变得更优秀 我在编程生涯的早期
用户1667431
2018/04/18
6170
为什么开源可以提高程序员的编程技能?
机器为什么可以学习
机器学习、人工智能炙手可热,但是机器到底为什么可以学习呢?本文将从霍夫丁不等式讲到VC维,探究机器学习的原因所在。 机器怎么可能学习 机器确实可能会学习 机器为什么可以学习 机器学习的一
用户1147754
2018/01/02
8380
机器为什么可以学习
java应用被阻止_怎样解决运行java提示应用程序已安全设置被阻止[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 Win7系统运行java时出现提示应用程序已安全设置被阻止,这样就导致运行java失败,那么怎样解决运行java提示应用程序已安全设置被阻止呢?下面跟着学习啦
全栈程序员站长
2022/09/08
4.4K0
java 网页提示被阻止怎么办,应用程序已被java安全阻止怎么办
1、完成JAVA版本更新,然后刷新有问题的网页页面,以排除JAVA版本问题引起JAVA安全阻止;
全栈程序员站长
2022/09/08
6.4K0
java 网页提示被阻止怎么办,应用程序已被java安全阻止怎么办

相似问题

将一年中的日期转换为java中的日期

25

如何将POSIX日期转换为一年中的日期?

59

在Server中将年中的日期转换为日期

11

将0转换为日期和日期

45

将一年中的星期转换为日期

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文