jQuery中不为人知的秘密之二

又开始写jQuery的秘密了~
这里写的基本上都是没啥用的东西,大家随便看看好了,有用的都放在文档里了~

这回先说选择器,
两个特殊的选择器,没有在文档里列出来。有可能只是选择器正则匹配的失误,也可能是故意的,但我源码中看不出来。望各位看官指点。注意,下面两个特殊选择器,随时可能在以后版本中消失,慎用。本文涉及的是1.2.6,经测试1.2.3也可使用。

创建一个空jQuery对象:

$(” “); //切记,引号中间至少有_一个_空格

这段简易的代码即可创建一个空的jQuery对象。这就类似创建一个代码片段。但由于是空的,所以无法append进任何东西。但你可以用add将你要的东西添加进去。

获取document,有时候需要写一些关于document的事件,比如keypress之类的,或者其他的,就可以用

$(“”); //切记,引号中间_没有_空格

这一定程度上可以用于混淆代码,比如将$(document).ready()写成$(“”).ready(),不知道的人就看不懂了。当然,要看过本文的人就都知道了~~(笑~)

顺便一说,前端加密是没有可能的,混淆也是有限度的。有jQuery的操作是链式操作,没有中间变量,同时通常绑定函数也是匿名函数,所以对于jQuery代码的混淆更是没有太大用处。除非,不再使用匿名函数,每次都外部定义一个。同时不再使用链式操作,用next,parent之类操作的时候,统统再定义一个中间变量。这样你的jQuery代码已经没有jQuery风格了,对混淆会稍微有点点帮助。注意,以上所有混淆操作,只防君子不防小人!切记,前端开发不可能加密!所以一切都做好开源的准备!了解GPL、MIT之类的都是有必要的!

如果你要用中间变量,像前面说的为了混淆,有时候你可能需要用到之前的一个对象,就好像在链式写法中用end()的效果,那就可以用prevObject属性,end()就是返回这个属性。

$(“#id”).prevObject; //切记,最后没有括号,这个是属性不是方法

下面说的这个其实不是很秘密,但值得一提
attr是很伟大的方法,以下这些都是可以执行的,你就可以通过这些来进行一些简单的判断,比如这个元素的标签名啦之类的。

$(“body”).attr(“tagName”);
$(“body”).attr(“nodeName”);
$(“body”).attr(“nodeType”);

还有个相关的,他返回的是布尔值true/false

jQuery.nodeName( elem, nodeName )

第一个参数是一个DOM对象,不是jQuery对象,第二个就是节点名称(标签名)了,大小写无关。返回true/false
有人问,为什么我不直接使用elem.nodeName==nodeName呢,爱用写这么麻烦呢?
看一下jQuery的源码就知道了

nodeName: function( elem, name ) {
return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
},

明白了么?浏览器兼容性问题,某些浏览器中的nodeName是大写,有些是小写,够恶心吧?
兼容一下总是好的~~

《jQuery中不为人知的秘密之二》有8个想法

  1. 不知你有没有见过获得jQuery的版本号的问题

    我看了下代码,发现在$.fn里面有定义,
    所以这样可以得到jQuery的版本
    $.fn.jquery,同样是一个变量,不是函数~

  2. jQuery.fn.jquery~~
    感觉怪怪的。
    还有我有点奇怪,他为什么要给fn添加这个属性
    这意味着,我通过
    $(“div”).jquery也能得到jQuery的版本号,这似乎是完全没有必要的功能。
    他完全可以通过jQuery.extend来给jQuery这个对象本身加上版本号啊。

  3. 我对用$(” “)创建一个空的jQuery对象的说法表示质疑,经测试$(” “).length的结果为1.
    我是用笨办法创建空的jQuery对象的,代码如下:
    var $empty=$(““).not(“b”);

  4. 刚才发的显示有误,补充一下:
    var $empty=$("<b></b>").not("b");

  5. 如果我想判定一个$(this)是不是一个div可不可以用
    $(this).attr(“nodeName”)==div

  6. “jQuery中不为人知的秘密”,博主怎么就知道了呢?博主已经成审了吗?

发表评论