击败jQuery成瘾:哪些jQuery方法很容易翻译成纯粹的javascript?

ser*_*erg 25 javascript jquery

被jQuery宠坏了我现在将它包含在每个项目中,即使我需要的只是调用$("#div).hide()$("#link").click()一次.

我知道jQuery通常会为您处理跨浏览器问题,但有时它只是本机javascript方法的一个方便的包装器.

所以我的问题是哪些jQuery方法可以很容易地被原生javascript替换?

Fel*_*ing 13

以下是我使用的一些示例,而不是jQuery方法(如果我不使用jQuery):

  • $(node).css(values):

    function css(node, style) {
      if(node && node.style) {
        for(var key in style) {
            node.style[key] = style[key];
        }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • $(node).show():jQuery在这里更复杂,因为它也可以将显示值设置为例如inline.

    function show(node) {
      if(node && node.style) {
        node.style.display = "";
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • $(node).hide():此外,jQuery方法存储以前的显示值.

    function hide(node) {
      if(node && node.style) {
        node.style.display = "none";
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • $(node).addClass(class)

    function addClass(node, cls) {
      if(node) {
        if(!node.className) {
            node.className = cls;
        }
        else if(node.className.indexOf(cls) == -1) {
            node.className = node.className + " " + cls;
        }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • $(node).removeClass(class)

    function removeClass(node, cls) {
      if(node && node.className && node.className.indexOf(cls) >= 0) {
        var pattern = new RegExp('\\s*' + cls + '\\s*');
        node.className = node.className.replace(pattern, ' ');
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

这些方法应该是跨浏览器兼容的.jQuery方法通常提供更多选项,例如删除多个类,或者更复杂.
这取决于您的需求,是否需要"高级"功能.更简单的方法可能就足够了.例如,如果我知道我将永远必须隐藏div元素,这hideshow方法是相当不错的.

更新:

根据您正在开发的浏览器(例如,制作Firefox扩展程序),您甚至可以获得与jQuery的选择器引擎相近的内容:document.querySelectorAll(selector)

  • 对于`show()`和`hide()`,我更喜欢在元素中添加或删除一个类("hidden").这让我不必担心"显示"价值.".hidden"的CSS表示"display:none",所以当你把"隐藏"类带走时,它会回到之前的状态. (4认同)
  • 您的类添加/删除例程也会被类名"apple"和"big-apple"混淆.最好通过在类名字符串的任一侧粘贴"\ b"来构建正则表达式,并且(如果您的类名称可能很古怪)将其擦除为正则表达式元字符. (2认同)
  • 有许多CSS属性会失败,例如[float](http://www.webdevthings.com/2008/05/ie-fun-fact-cssfloat-vs-stylefloat.html)或[opacity]( http://jszen.blogspot.com/2005/04/ie6-opacity-filter-caveat.html).此外,当一个类是另一个类的前缀(虽然这很容易修复)并且显示无法查看时,addClass/removeClass失败:隐藏和显示除块之外的任何其他元素. (2认同)

use*_*716 8

其中一个最大的jQuery滥用必须创建一个jQuery对象,仅仅是为了获取元素的属性.attr().

也许最常见的是使用以下方式获取ID属性:

$(this).attr("id");
Run Code Online (Sandbox Code Playgroud)

代替

this.id;
Run Code Online (Sandbox Code Playgroud)

在不使用jQuery的情况下,可以跨浏览器方式访问大量属性.

或者,如果我需要访问处理程序中元素的父级,而不是:

$(this).parent()...
Run Code Online (Sandbox Code Playgroud)

我更有可能直接用父母包裹:

$(this.parentNode)...
Run Code Online (Sandbox Code Playgroud)

如果您可以规划HTML以使元素之间没有空格,则可以跨浏览器方式轻松使用其他DOM遍历方法,例如:

this.nextSibling
this.previousSibling
this.firstChild
this.lastChild
Run Code Online (Sandbox Code Playgroud)

  • 我不同意.attr()只能处理元素的属性,而不能处理节点的属性,所以它更像是setAttribute/getAttribute.此外,它提供了比本机方法更多的能力.遍历方法也有不同的行为,例如(空)textNodes的统一跨浏览器处理. (2认同)

Joh*_*eek 4

最简单的找出方法就是阅读您感兴趣的方法的源代码。它非常易读。