JQuery选择器

JQuery选择器规则, 借用了css1-3的规则(css选择器规则), 因为css本身也需要一套规则来索引DOM元素, 进而进行样式渲染,例如div.blue 表示目标DOM为 class属性值为blue的div元素。

同时JQuery添加了一些自己的规则, 例如按照查询连接元素 $("[href]")。

这样就衍生出, 一套元字符, 用于表达选择器 合法格式, 故对于 其他部分例如属性值在选择器中的情况, 例如查询href为 www.baidu.com的 链接, 则为 $("[href=‘www.baidu.com’]") 其中.就需要转义, 否则跟div.blue中作为格式的点冲突, 应该写为 $("[href=‘www\\.baidu\\.com’]")。

需要转义的字符, 包括 !"#$%&'()*+,./:;<=>?@[\]^`{|}~

详情见官网描述:

http://api.jquery.com/category/selectors/

Borrowing from CSS 1–3, and then adding its own, jQuery offers a powerful set of tools for matching a set of elements in a document.

To use any of the meta-characters ( such as !"#$%&'()*+,./:;<=>?@[\]^`{|}~ ) as a literal part of a name, it must be escaped with with two backslashes: \\. For example, an element with id="foo.bar", can use the selector $("#foo\\.bar"). The W3C CSS specification contains the complete set of rules regarding valid CSS selectors. Also useful is the blog entry by Mathias Bynens on CSS character escape sequences for identifiers.

CSS 转义

根据上文描述给出的 W3C CSS规范,包括了 关于合法css选择器规则的全部集合。

http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier

其中说明, ID中字符转义效果, 转义的反斜杠总被认为是 ID的一部分:

Note: Backslash escapes are always considered to be part of an identifier or a string (i.e., "\7B" is not punctuation, even though "{" is, and "\32" is allowed at the start of a class name, even though "2" is not).

The identifier "te\st" is exactly the same identifier as "test".

css转义owasp建议:

https://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet#RULE_.234_-_CSS_Escape_And_Strictly_Validate_Before_Inserting_Untrusted_Data_into_HTML_Style_Property_Values

Except for alphanumeric characters, escape all characters with ASCII values less than 256 with the \HH escaping format. DO NOT use any escaping shortcuts like \" because the quote character may be matched by the HTML attribute parser which runs first. These escaping shortcuts are also susceptible to "escape-the-escape" attacks where the attacker sends \" and the vulnerable code turns that into \\" which enables the quote.

HTML5中的 选择器函数

HTML4没有选择器函数, JQuery提供封装接口, 提供选择器规则, 包含了css定位规则,

技术在革新,HTML5最终提供了js原生接口:

见:

HTML5中类jQuery选择器querySelector的使用  http://m.oschina.net/blog/282816

JQuery选择器敏感字符转义函数

jQuery的id选择器不支持特殊字符,需要转义(引入jqSelector()函数)

http://maijunjin.github.io/jquery/2013/10/11/jqueyr-id%E9%80%89%E6%8B%A9%E5%99%A8%E4%B8%8D%E6%94%AF%E6%8C%81%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6%EF%BC%8C%E9%9C%80%E8%A6%81%E8%BD%AC%E4%B9%89.html

  1. // Escapes special characters and returns a valid jQuery selector
  2. function jqSelector(str)
  3. {
  4. return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
  5. }

The HTML

  1. <div id="id.with,special#characters" class="testElem[1]"></div>

The javascript

  1. // ID selector
  2. $('#'+jqSelector('id.with,special#characters')).text('My Selected Element');
  3. // Class selector
  4. $('.'+jqSelector('testElem[1]')).text('My Selected Element');

测试代码

  1. <html>
  2. <head>
  3. <script type="text/javascript" src="./jquery-1.11.1.js" />
  4. </head>
  5. <body>
  6. <script>alert("aaa");</script>
  7. <input id="test" type="text" value="vt+\范" />
  8. <script>
  9. function stringToHex(str)
  10. {
  11. var val="";
  12.  
  13. for(var i = 0; i < str.length; i++)
  14. {
  15. val = val+ "\\"+"\\"+"\\x" + str.charCodeAt(i).toString(16);
  16.   }
  17.  
  18. return val;
  19. }
  20.  
  21. var afs = "'\"][vt+";
  22. console.log("afs="+afs);
  23. var b = stringToHex(afs);
  24. console.log("stringToHex afs="+b);
  25. b = eval("\""+b+"\"");
  26. console.log("eval stringToHex afs="+b);
  27. //b = eval("\""+b+"\"");
  28. //console.log("eval eval stringToHex afs="+b);
  29.  
  30. //alert($("input[value='"+b+"']").length); //length==1 FOUND
  31. //alert($("input[value='\\v\\t\\+范']").length); //length==1 FOUND
  32. //alert($("input[value='vt+\\\\范']").length); //length==1 FOUND
  33. alert($("\in\put\[value='\\v\\t\+\\\\范']").length); //length==1 FOUND
  34.  
  35. function stringToHex2(str)
  36. {
  37. var val="";
  38.  
  39. for(var i = 0; i < str.length; i++)
  40. {
  41. var charCode = str.charCodeAt(i);
  42. var chari = str.charAt(i);
  43. if ( charCode <= 127 )
  44. val = val+ "\\"+ eval("\"" + "\\x" + str.charCodeAt(i).toString(16) + "\"");
  45. else
  46. val = val + chari;
  47.   }
  48.  
  49. return val;
  50. }
  51.  
  52. var afs = "vt+\\范";
  53. console.log("afs="+afs);
  54. var b = stringToHex2(afs);
  55. console.log("stringToHex2 afs="+b);
  56. //alert($("input[value='"+b+"']").length); //length==1 FOUND
  57. //alert($("#te\s\\t").length); //length==1 FOUND The identifier "te\st" is exactly the same identifier as "test".
  58.  
  59. function addSlash(srcStr)
  60. {
  61. var str = "";
  62. var ch = "";
  63. /*入参str为非string类型直接返回*/
  64. if (typeof(srcStr) != "string")
  65. {
  66. return srcStr;
  67. }
  68. for(var i = 0; i < srcStr.length; i++)
  69. {
  70. ch = srcStr.substr(i, 1);
  71. if( "\\" == ch )
  72. {
  73. ch = "\\\\";
  74. }
  75. else if( "\'" == ch )
  76. {
  77. ch = "\\\'";
  78. }
  79. else if( "\"" == ch )
  80. {
  81. ch = "\\\"";
  82. }
  83.  
  84. str = str + ch;
  85. }
  86.  
  87. return str;
  88. }
  89. //alert($("input[value='"+addSlash("vt+\\范")+"']").length); //length==1 FOUND
  90.  
  91. //alert("input[value='\\\x27']");
  92. //alert("input[value='"+b+"']");
  93. </script>
  94. </body>
  95. </html>

JQuery选择器转义说明的更多相关文章

  1. 《锋利的jQuery(第2版)》笔记-第2章-jQuery选择器

    选择器是jQuery的根基,在jQuery中,对事件处理.遍历DOM和Ajax操作都依赖于选择器.熟练使用选择器,不仅可以简化代码,而且可以达到事半功倍的效果. 2.1 jQuery选择器是什么 1. ...

  2. jQuery选择器和DOM操作——《锋利的jQuery》(第2版)读书笔记1

    第1章 认识jQuery jQuery有以下优势: 轻量级: 强大的选择器: 出色的DOM操作的封装: 可靠的事件处理机制: 完善的Ajax: 不污染顶级变量: 出色的浏览器兼容性: 链式操作方式: ...

  3. 第二章 jQuery选择器

    选择器是行为与文档内容之间的纽带,其目的是能轻松的找到文档中的元素. jQuery中的选择器继承了CSS的风格.利用jQuery选择器,可以非常便捷快速地找出特定的DOM元素,然后给它们添加相应的行为 ...

  4. jQuery选择器 之详述

    jQuery选择器 一. 单词小计 Pervious 上一页sibling  同级first  第一last  最后not  不 Even  偶数    odd  奇数 header  页眉 一.jQ ...

  5. WEB入门之十三 jQuery选择器

    学习内容 jQuery层次选择器 jQuery属性选择器 jQuery表单选择器 jQuery过滤选择器 能力目标 熟悉jQuery各种选择器的使用场合 能熟练使用jQuery各种选择器 本章简介 上 ...

  6. Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串

    Jquery 选择器 详解   在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...

  7. jQuery(二):jQuery选择器

    jQuery选择器类似于CSS选择器,用来选取网页中的元素.例如: $("h3").css("background-color","red" ...

  8. 处理jQuery选择器中的特殊符号,如(、#等

    前几天解决一个外网问题,客服反馈页面数据加载不出来,首先看一下服务端日志也没报错异常,自己测试了一下,在chrome的Console发现有js报错,原来是js报错导致的数据加载不出来. 调试了一番,发 ...

  9. JQuery - 特殊字符转义(Uncaught Error: Syntax error, unrecognized expression:的处理)

    今天在改一个jQuery老项目时候,发现标签上的data-id中含有特殊字符时候报错Uncaught Error: Syntax error, unrecognized expression,如何处理 ...

随机推荐

  1. 求n个排序链表的交集

    题目大致意思是 给出n个排序list,每个list只有两个方法 (1)bool goNext(); 判断是否有下一个元素,没有元素返回false, 有元素返回true (2)int next(); 返 ...

  2. 基于jquery的图片懒加载js

    function lazyload(option){ var settings={ defObj:null, defHeight: }; settings=$.extend(settings,opti ...

  3. 【BZOJ】3239: Discrete Logging

    http://www.lydsy.com/JudgeOnline/problem.php?id=3239 题意:原题很清楚了= = #include <bits/stdc++.h> usi ...

  4. XCode编译文件过多导致内存吃紧解决方法

    XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧

  5. Flex与.net进行URL参数传递编码处理

    在JS中用到的三种编码方式escape 对应于Flex中是一样的,并且支持相互的解码 var a:String = "超越梦想#"; trace(escape(a)); //%u8 ...

  6. PHP.ini文件读取不到

    Configuration File (php.ini) Path /usr/local/php/lib Loaded Configuration File (none) Linux 把 dtruss ...

  7. Hibernate中易错地方的总结

    1.Hibernate中的配置文件要放在src下,注意不能放在包目录下 2.Hibernate中@Before   @After方法不能再普通的类里用,只有在专门的JUnit测试用例里面用. 3.使用 ...

  8. java: cairo-misc.c:380: _cairo_operator_bounded_by_source: Assertion `NOT_REACHED' failed.

    出错原因 该问题会在Centos6.6及更高版本出现.也会在其他版本中出现. 解决方案 禁用carioGraphics > Add -Dorg.eclipse.swt.internal.gtk. ...

  9. hdu Sudoku Killer

    简单的dfs,主要就是每个?处填的值是否满足条件的判断.这道题感觉考察的是输出格式的控制. #include"iostream" #include"stdio.h&quo ...

  10. linux卸载mysql,apache,php

    卸载Mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的包: mysql-3.23.58-9php-mysql-4.3.4-11mod_a ...