JQuery选择器转义说明

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’]")。

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

详情见官网描述:

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 !"#$%&‘()*+,./:;<=>[email protected][\]^`{|}~ ) 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

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

The HTML

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

The javascript

// ID selector
$(‘#‘+jqSelector(‘id.with,special#characters‘)).text(‘My Selected Element‘);

// Class selector
$(‘.‘+jqSelector(‘testElem[1]‘)).text(‘My Selected Element‘);

测试代码

<html>
<head>
    <script type="text/javascript" src="./jquery-1.11.1.js" />
</head>
<body>
    <script>alert("aaa");</script>
    <input id="test" type="text" value="vt+\范" />
    <script>
        function stringToHex(str)
        {
            var val="";

            for(var i = 0; i < str.length; i++)
            {
                val = val+ "\\"+"\\"+"\\x" + str.charCodeAt(i).toString(16);
          }

            return val;
        }

        var afs = "‘\"][vt+";
        console.log("afs="+afs);
        var b = stringToHex(afs);
        console.log("stringToHex afs="+b);
        b = eval("\""+b+"\"");
        console.log("eval stringToHex afs="+b);
        //b = eval("\""+b+"\"");
        //console.log("eval eval stringToHex afs="+b);

        //alert($("input[value=‘"+b+"‘]").length); //length==1 FOUND
        //alert($("input[value=‘\\v\\t\\+范‘]").length); //length==1 FOUND
        //alert($("input[value=‘vt+\\\\范‘]").length); //length==1 FOUND
        alert($("\in\put\[value=‘\\v\\t\+\\\\范‘]").length); //length==1 FOUND

        function stringToHex2(str)
        {
            var val="";

            for(var i = 0; i < str.length; i++)
            {
                var charCode = str.charCodeAt(i);
                var chari = str.charAt(i);
                if ( charCode <= 127 )
                    val = val+ "\\"+ eval("\"" + "\\x" + str.charCodeAt(i).toString(16) + "\"");
                else
                    val = val + chari;
          }

            return val;
        }

        var afs = "vt+\\范";
        console.log("afs="+afs);
        var b = stringToHex2(afs);
        console.log("stringToHex2 afs="+b);
        //alert($("input[value=‘"+b+"‘]").length); //length==1 FOUND
        //alert($("#te\s\\t").length); //length==1 FOUND The identifier "te\st" is exactly the same identifier as "test".

        function addSlash(srcStr)
        {
            var str = "";
            var ch = "";
            /*入参str为非string类型直接返回*/
            if (typeof(srcStr) != "string")
            {
                return srcStr;
            }
            for(var i = 0; i < srcStr.length; i++)
            {
                ch = srcStr.substr(i, 1);
                if( "\\" == ch )
                {
                    ch = "\\\\";
                }
                else if( "\‘" == ch )
                {
                    ch = "\\\‘";
                }
                else if( "\"" == ch )
                {
                    ch = "\\\"";
                }

                str = str + ch;
            }

            return str;
        }
        //alert($("input[value=‘"+addSlash("vt+\\范")+"‘]").length); //length==1 FOUND

     //alert("input[value=‘\\\x27‘]");
     //alert("input[value=‘"+b+"‘]");
     </script>
</body>
</html>
时间: 2024-10-21 02:16:53

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

jQuery选择器中的一些注意事项

选择器中含有特殊符号: 选择器中含有"."."#"."("或"]"等特殊字符.根据W3C的规定,属性值中是不能含有这些特殊字符的.但在实际项目中偶尔会遇到表达式中含有"#"和"."等特殊字符.如果按照普通的方式去处理出来的话就会出错.解决此类错误的方法是使用转义符转义. HTML代码如下: <div id="id#b">bb</div> <

jQuery选择器与JavaScript易出错知识点

一.jQuery选择器 基本选择器 1.Id(根据给定的ID匹配一个元素.如果选择器中包含特殊字符,可以用两个斜杠转义.) jQuery代码为$("#myclass") 若有特殊字符则 HTML代码为<span id="myclass[1]" jQuery代码为$("#myclass\\[1\\]") 2.Class(一个用以搜索的类.一个元素可以有多个类,只要有一个符合就能被匹配到) jQuery代码为$(".myclass&q

三、jQuery选择器

注意: jQuery获取的永远是对象,即使网页上没有此元素 不能这样判断 if($('#tt')){} 应根据元素长度来判断 if($('#tt').length > 0){} 或转化成DOM来判断 if($('#tt')[0]){} 一.基本选择器 基本选择器是jQuery中最常用的选择器,也是最简单的选择器,它通过元素id,class,和标签名等来查找DOM元素. 二.层次选择器 三.过滤选择器 1.基本过滤选择器 2.内容过滤选择器 3.可见性过滤选择器 4.属性过滤选择器 5.子元素过滤

HTML5中类jQuery选择器querySelector的使用

HTML5中类jQuery选择器querySelector的使用 简介 HTML5向Web API新引入了document.querySelector以及document.querySelectorAll两个方法用来更方便地从DOM选取元素,功能类似于jQuery的选择器.这使得在编写原生JavaScript代码时方便了许多. 用法 两个方法使用差不多的语法,都是接收一个字符串参数,这个参数需要是合法的CSS选择语法. element = document.querySelector('sele

[ jquery 选择器 总览 ] jquery选择器总览

选择器是Query的一个核心基础,正是有了各种丰富的选择器,才使得开发人员可以灵活的访问控制html中的各种元素,也让js如鱼得水. 本篇将详细介绍jQuery选择器,从类别上jQuery选择器可以划分为:基本选择器.层次选择器.过滤选择器.表单选择器. 一.基本选择器(Basic) 基本选择器包括5种选择器:#id.element..class.*和selectorl,selector2.selectorN,下面将配合实例分别介绍每种选择器的作用及使用方法. 1.全匹配选择器匹配所有元素的选择

jQuery选择器特殊字符与属性空格问题

一.选择器中含有特殊符号的注意事项 1.选择器中含有“.”.“#”.“(”或“]”等特殊字符 根据W3C的规定,属性值中是不能含有这些特殊字符的,但在实际项目中偶尔会遇到表达式中含有“#”和“.”等特殊字符,如果按照普通的方式去处理出来的话就会出错.解决此类错误的方法是使用转义符转义. <div id="id#b">bb</div> < div id="id[1]">cc</div> 不能这样写: $('#id#b')

一、jQuery选择器

选择器是jQuery的根基,事件处理.遍历DOM和Ajax操作都依赖于选择器.jQuery选择器分为基本选择器.层次选择器.过滤选择器和表单选择器. 一.基本选择器 基本选择器是jQuery中最常用的选择器,也是最简单的选择器,它通过元素id.class和标签名等查找DOM元素.在网页中每个id只能使用一次,class允许重复使用. 选择器 描述 返回 示例 #id 根据给定id匹配一个元素 单个元素 $("#test")选取id为test的元素 .class 根据给定的类名匹配元素

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

第1章 认识jQuery jQuery有以下优势: 轻量级: 强大的选择器: 出色的DOM操作的封装: 可靠的事件处理机制: 完善的Ajax: 不污染顶级变量: 出色的浏览器兼容性: 链式操作方式: 隐式迭代: 行为层与结构层的分离: 丰富的插件支持: 完善的文档: 开源. jQuery对象就是通过jQuery包装DOM对象后产生的对象. 在jQuery对象中无法使用DOM对象的任何方法.同样,DOM对象也不能使用jQuery里的方法. jQuery对象和DOM对象的相互转换        如果

jQuery选择器遇上一些特殊字符

学习jQuery过程中,发现一些特殊字符,如“.”,“#”,"(","]"等.它在选择器应用时,按照普通处理就会出错.解决办法,就是使用转义字符来处理,这有点象C#的转义一样. 如"\\": 例如(Insus.NET只列举一个例子,其它特殊字符处理是一样的.):先在MVC视图中,写上一个Div标签: 为了做到演示,我们再放一个铵钮: 接下来,我们可以写JQuery脚本了: 实时操作演示看看: jQuery选择器遇上一些特殊字符