草庐IT

javascript - 我将所有内容都保存在外部 .js 文件中。但并非所有功能都在每个页面上使用。这会影响速度吗?

coder 2024-07-19 原文

我的应用程序的 JavaScript/jQuery 包含在外部 scripts.js 文件中。它通常看起来像这样:

$('document').on('ready', function() {
    giraffe();
    elephant();
    zebra();
});

function giraffe() {
    // code
}

function elephant() {
    // code
}

function zebra() {
    // code
}

giraffe() 仅用于 /animal/giraffe
可用的 View elephant() 仅用于 /animal/elephant
可用的 View zebra() 仅用于 /animal/zebra 可用的 View ,

但所有 3 个都应该在可用 View /animal/all 上运行。这是一个基本示例,但除了将 HTTP 请求保持在最低限度之外,这就是将它们全部放在一个 .js 文件中的原因。

我的问题是,这会影响 JavaScript 渲染吗?即使 giraffe() 没有在 /animal/zebra 上使用(没有可处理的元素),它仍然会被调用。如果 js/jQuery 发现无事可做,是否会忽略该函数?我确信整个脚本都已阅读,这可能需要时间。那么,处理此问题的最佳方法是什么?

一个解决方案

为避免冲突,我在 js 文件的顶部创建了条件语句以仅运行事件页面需要的功能:

$('document').on('ready', function() {
    var body = $('body');

    if( body.hasClass('giraffe') ) {
        giraffe();
    }

    if( body.hasClass('elephant') ) {
        elephant();
    }

    if( body.hasClass('zebra') ) {
        zebra();
    }
});

这比我想要的要冗长一点,但它成功地保持了这些功能的模块化/无冲突。我欢迎对此解决方案进行改进。

最佳答案

只运行您需要的代码肯定会更好。这并不难;唯一较小的复杂性是处理您的 /animals/all案件。如果您想将所有代码保存在一个文件中,您可以这样做:

var animals = {
    giraffe: function() {
        console.log( "I'm a giraffe" );
    },
    elephant: function() {
        console.log( "I'm an elephant" );
    },
    zebra: function() {
        console.log( "I'm a zebra" );
    }
};

$(function() {
    var animal = location.pathname.split('/').pop();
    if( animal == 'all' ) {
        for( var animal in animals ) {
            animals[animal]();
        }
    }
    else if( animal in animals ) {
        animals[animal]();
    }
    else {
        console.log( "I'm a mystery animal" );
    }
});

您实际上可以通过在 Stack Overflow 上访问这样的 URL 来测试此代码,然后将该代码粘贴到 JavaScript 控制台中:

https://stackoverflow.com/animal/giraffe
https://stackoverflow.com/animal/elephant
https://stackoverflow.com/animal/zebra
https://stackoverflow.com/animal/ocelot
https://stackoverflow.com/animal/all

更新:好的,所以你在评论中解释说实际情况要复杂一些。我会把这段代码留在这里,以防它对任何人都有用,但对于你的情况,你可能更接近你已经拥有的代码所需要的东西。

WRT 这个问题是,当您在一个与动物功能无关的页面上时,您的动物功能会做什么,当然这取决于它的编码方式。它可能什么都不做,也可能出错,对吧?

由于我们讨论的是 jQuery 代码,这里有几个示例。假设您有通过 ID 查找元素的代码,然后假设该元素存在:

var zebraElement = $('#zebra')[0];
console.log( zebraElement.value );

#zebra 所在的页面上元素存在,此代码将记录其 value属性。 (为了讨论,我假设它是一个具有值的元素,例如输入元素。)

但是如果 #zebra不存在,那么zebraElementundefined ,并试图访问其 value将失败并进入调试器。

OTOH,如果你这样编码:

var $zebra = $('#zebra');
console.log( $zebra.val() );

如果 #zebra 就不会失败缺少,它将成功打印 undefined而不会导致错误。

同样,如果您有使用 $().each() 的代码,它通常会在缺少元素时正常运行,因为它根本不会执行回调函数:

$('.animal').each( function( i, e ) {
    console.log( $(e).val() );
});

如果没有带class="animal"的元素, 然后是 console.log()电话将永远无法接通。所以没有错误,它只是什么也没做。

根据您正在做的事情,这可能是一种完全合理的方式来仅触发您需要的行为 - 只需确保您的代码干净利落地处理丢失的 DOM 元素即可。

另请务必阅读 nick's answer了解更多信息。

还有一个更新……在评论中你提到在 body 上关闭类名元素。一个很好的方法是类似于上面的代码示例。您不需要为每只动物设置条件,只需一个循环和一个条件:

var animals = {
    giraffe: function() {
        console.log( "I'm a giraffe" );
    },
    elephant: function() {
        console.log( "I'm an elephant" );
    },
    zebra: function() {
        console.log( "I'm a zebra" );
    }
};

$(function() {
    var $body = $('body');
    for( var animal in animals ) {
        if( $body.hasClass(animal) ) {
            animals[animal]();
        }
    }
});

例如,如果您有 <body class="giraffe zebra">它会调用 animals.giraffe()animals.zebra()功能。

关于javascript - 我将所有内容都保存在外部 .js 文件中。但并非所有功能都在每个页面上使用。这会影响速度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041607/

有关javascript - 我将所有内容都保存在外部 .js 文件中。但并非所有功能都在每个页面上使用。这会影响速度吗?的更多相关文章

  1. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  2. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  3. ruby-on-rails - 如果我将 ruby​​ 版本 2.5.1 与 rails 版本 2.3.18 一起使用会怎样? - 2

    如果我使用ruby​​版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby​​1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更

  4. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

  5. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  6. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby - 如何在ruby中提取方括号内的内容 - 2

    我正在尝试提取方括号内的内容。到目前为止,我一直在使用它,它有效,但我想知道我是否可以直接在正则表达式中使用某些东西,而不是使用这个删除功能。a="Thisissuchagreatday[coolawesome]"a[/\[.*?\]/].delete('[]')#=>"coolawesome" 最佳答案 差不多。a="Thisissuchagreatday[coolawesome]"a[/\[(.*?)\]/,1]#=>"coolawesome"a[/(?"coolawesome"第一个依赖于提取组而不是完全匹配;第二个利用前瞻和

  9. ruby-on-rails - prawnto 显示新页面时不会中断的表格 - 2

    我有可变数量的表格和可变数量的行,我想让它们一个接一个地显示,但如果表格不适合当前页面,请将其放在下一页,然后继续。我已将表格放入事务中,以便我可以回滚然后打印它(如果高度适合当前页面),但我如何获得表格高度?我现在有这段代码pdf.transactiondopdf.table@data,:font_size=>12,:border_style=>:grid,:horizontal_padding=>10,:vertical_padding=>3,:border_width=>2,:position=>:left,:row_colors=>["FFFFFF","DDDDDD"]pdf.

  10. ruby-on-rails - 如何找出拦截 'method_missing' 的内容 - 2

    使用Ruby1.8.6/Rails2.3.2我注意到在我的任何ActiveRecord模型类上调用的任何方法都返回nil而不是NoMethodError。除了烦人之外,这还破坏了动态查找器(find_by_name、find_by_id等),因为即使存在记录,它们也总是返回nil。不从ActiveRecord::Base派生的标准类不受影响。有没有办法追踪在ActiveRecord::Base之前拦截method_missing的是什么?更新:切换到1.8.7后,我发现(感谢@MichaelKohl)will_paginate插件首先处理method_missing。但是will_pa

随机推荐