【问题标题】:jQuery(#id).val() vs. getElementById(#id).valuejQuery(#id).val() 与 getElementById(#id).value
【发布时间】:2011-09-06 15:07:51
【问题描述】:

我一直在搜索,但我只能找到谈论其中之一的文章。哪个更好?

我正在制作一个小型网络应用程序,它的性能不是一个大问题,因为没有什么复杂的事情发生。

我考虑使用 jQuery 的 val() 函数,因为它可能解决了一些我不知道的不一致问题,但 getElementById.value 更快(尽管最终用户不会注意到。)

那么我应该使用哪一个? jQuery 的非本地方法是否值得降低性能以获得更多兼容性?

【问题讨论】:

  • "过早的优化是万恶之源。" ——唐纳德·高德纳

标签: javascript jquery


【解决方案1】:

使用jQuery().val() 而不是document.getElementById().value 的最大优势在于,如果没有匹配的元素,前者将不会抛出错误,而后者会。 document.getElementById() 返回 null 如果没有匹配的元素,其中 jQuery() 返回一个空的 jQuery 对象,它仍然支持所有方法(但 val() 将返回 undefined)。

.value 用于表单元素时没有不一致。但是,jQuery.val() 标准化了用于在选择框中收集所选值的接口;在标准 HTML 中,您必须使用 .options[this.selectedIndex].value

【讨论】:

  • 实际上浏览器之间在文本区域values 的换行符之间存在一些不一致,jQuery 的val() 标准化了,虽然我宁愿它没有。
  • @TimDown 你有关于不一致的更多信息吗?在 Mac OS X 上的 Chrome 53、Firefox 47 和 Safari 9.1 上至少没有。用这个小提琴测试:jsfiddle.net/5hvy75Lf
  • @Dennis98:HTML5 已经解决了这个问题,因为它已经标准化为值中的任何换行符使用 LF 字符,我认为所有最近的浏览器都符合。当然,旧的 IE,可能还有一些旧版本的 Safari 和/或 Opera,使用 CR+LF 而不仅仅是 LF。
  • 啊,好的。谢谢! :)
【解决方案2】:

如果您同时使用 <select> 元素,.value 将不起作用,而 .val() 将起作用。

我不介意仅仅获得价值的表现。如果您想要获得最佳性能,也许您根本不应该使用库。

【讨论】:

    【解决方案3】:

    jQuery 做了很多不错的小错误处理(如下所示),如果没有jquery,我再也不会在浏览器中写一行javascript

    • 首先,val 作用于复选框组、选择、获取 html 和 喜欢。
    • 其次,$ 让你可以使用嘶嘶声选择器,所以在未来,你可以 在IDCSS 路径之间轻松切换。
    • 第三,您的代码将更容易阅读和维护,如果您 只需使用jQuery,即可节省维护代码的时间 超过您承认用户看不到的任何加速。最后, jQuery 是一个非常流行、使用非常广泛的库。他们会让 $val 尽可能快。

    【讨论】:

    • 只是一个小提示:val() (不幸的是)对复选框起作用,至少没有任何有用的方式。如果复选框被选中,它将返回将设置的值 - 但它不考虑是否选中它。 +1 表示不用 jQuery 不写一行 JS。
    【解决方案4】:

    我认为使用纯Javascript 更快,原因如下:

    1. 除了纯js,您无需学习更多内容
    2. 如果您不想出错,请使用catch(exeption)(我认为...)
    3. 您无需花费额外的时间来输入代码即可启动jquery
    4. 如果您不使用jquery,浏览器响应会更快
    5. 普通js (以更好的方式)在复选框@johndodo 上工作

    感谢您聆听我的回答。

    【讨论】:

      【解决方案5】:

      我最近一直在研究这方面的性能差异,不出所料,使用 vanilla JS 获取值比使用 jQuery 更快。但是,jQuery 提供的用于防止错误的回退(如@Matt 提到的)非常有用。因此,我倾向于选择两全其美。

      var $this = $(this),
          $val = this.value || $this.val();
      

      使用该条件语句,如果 this.value 尝试抛出错误,代码将退回到 jQuery .val() 方法。

      【讨论】:

        【解决方案6】:

        这里https://www.dyn-web.com/tutorials/forms/checkbox/same-name-group.php 是复选框的实现,显然选项只需要与名称中的数组括号表示法命名相同,即:name="sport[]" 然后你通过:var sports = document.forms['demoForm'].elements['sport[]'] 获取数组 inJavascript

        我正在寻找 selection 类型字段解决方案不使用 jQuery,我遇到了这个解决方案:

        Selection 组是一个对象:HTMLCollection,它有一个 lenght 方法和一个 selectedOptions 属性,允许您遍历它的 label 属性以使用所选选项填充 Array,然后您可以使用:

        ...
            vehicleCol = document.getElementById('vehiculo').selectedOptions;
            vehiculos  = [];
        
            if (vehicleCol !== undefined) {
                for (let i = 0; i < vehicleCol.length; i++) {
                    vehiculos.push(vehicleCol[i].label.toLowerCase())
                }
            }
        ...
        

        【讨论】:

          【解决方案7】:

          我会使用 jQuery 的 val()。更短的代码意味着更快的下载时间(在我看来)。

          【讨论】:

          • 如果你使用 jQuery,是的。否则我怀疑从 document.getElementById('test')$('#test') 的节省会占用库本身的 31KB。
          • 当我们谈论使用 jQuery 时,我假设该库已经因为其他原因被加载,我不会为了获取字段值而加载 jQuery。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-11
          相关资源
          最近更新 更多