Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 监听器:可以在每个页面上运行,还是只在需要它们的页面上初始化?_Jquery_Performance - Fatal编程技术网

Jquery 监听器:可以在每个页面上运行,还是只在需要它们的页面上初始化?

Jquery 监听器:可以在每个页面上运行,还是只在需要它们的页面上初始化?,jquery,performance,Jquery,Performance,在我的网站上,我有带有“事件监听器”的元素(.live、.bind或.delegate),我可以根据它们出现的频率将它们分成几个组: 每个页面上的元素 某些页面上的元素 如果我在每个页面上都有一个元素,并且该元素需要一个监听器,那么当然我只是在整个站点上实现该监听器 我试图找出对于一个(a)只出现在几页上的元素和(b)需要一个侦听器的元素来说,什么是最明智的: 在站点范围内实现侦听器 实现侦听器,以便它必须首先在任何想要使用它的页面上初始化 例如,假设我有 出现在多个页面上,但不在站点范围内

在我的网站上,我有带有“事件监听器”的元素(.live、.bind或.delegate),我可以根据它们出现的频率将它们分成几个组:

  • 每个页面上的元素
  • 某些页面上的元素
  • 如果我在每个页面上都有一个元素,并且该元素需要一个监听器,那么当然我只是在整个站点上实现该监听器

    我试图找出对于一个(a)只出现在几页上的元素和(b)需要一个侦听器的元素来说,什么是最明智的:

    • 在站点范围内实现侦听器
    • 实现侦听器,以便它必须首先在任何想要使用它的页面上初始化
    例如,假设我有
    出现在多个页面上,但不在站点范围内。当有人输入文本时,它会点击数据库并尝试为他们完成查询


    由于此元素不会出现在每个页面上,因此
    jQuery.live('someEventsHere',MyHandler())
    的开销是否足够高,以至于我应该只在使用它的页面上调用它?(例如,通过创建一个
    initializeMyHandler()
    函数并在这些页面上调用它?)或者,在不使用该侦听器的页面上,这是否足够便宜,可以进行设置而不用担心?

    live()会带来开销,因为每当DOM发生变化时,它都必须不断检查元素。根据您的网站流量,这可能是您可以接受的


    但是,我要说的是,将代码分为多个文件,并且只在每个页面上包含所需的文件。

    live()
    通过将事件处理程序附加到文档而不是元素来工作。因此,
    live()
    利用了事件冒泡,因此附加事件处理程序不会产生太多开销,尽管确实会有一些开销。包含JavaScript文件的HTTP请求比将未使用的事件处理程序附加到文档所产生的开销还要大。

    目前,我在每个页面上都包含一个主JavaScript文件。这样,它就被缓存了。我担心将其拆分为不同页面上需要的不同文件(从开发人员的角度来看)和调用.initialize()函数一样容易混淆,但是,如果对不同的JS文件有多个HTTP请求,则会产生额外的成本。@jpp一个文件通常被认为是加载时间的最佳实践,是的。实际上,使用并行加载文件的脚本加载程序(如head.JS)现在被认为比一个大文件更快。我认为这是
    .live()
    的良好背景,但我不会一直使用live。有时我会使用更便宜的
    .bind()
    。这是否便宜到在未使用的页面上调用1
    .bind()
    事件没有什么大不了的,也不值得设置
    .initialize()
    函数来避免调用
    .bind()
    ?在一个只使用一个或两个的页面上,10个
    bind()
    事件怎么样?在一个页面上,只有一个或两个元素会被实际使用?
    .bind()
    将自身附加到元素,因此您需要首先检查元素是否存在(这需要对DOM进行查询)仅仅为了设置事件处理程序而查询DOM 100次在我看来是不可接受的。我相信你的问题的答案与这个问题的答案是相同的:就开销而言,有多少个事件处理程序初始化等于一个HTTP请求?啊,谢谢你的评论;现在我更清楚地明白你的回答是什么意思了。