jquery 冒号转义 为啥双斜杠

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jquery 冒号转义 为啥双斜杠相关的知识,希望对你有一定的参考价值。

下面是jquery api中的代码片段:
html 代码:
<span id="foo:bar"></span>
<span id="foo[bar]"></span>
<span id="foo.bar"></span>
jQuery 代码:
#foo\\:bar
#foo\\[bar\\]
#foo\\.bar

jQuery 代码中转义 . [ ] : 都用了两个\\ 为什么需要两个\\ ?用一个\为什么不行?
如果用 #foo\\:bar 取到的应该是#foo\:bar啊? 希望高手能解答下
谢谢1楼的回答 但我还是不懂
为什么最终的目标是为了取到 ===> 反斜杠 点
而不是 取到 ===> 点

如果最终目标是为了取到 ===> 反斜杠 点
那么 反斜杠 点 -> 点这个过程是谁转换的?

举例说明:$('#foo\\:bar')
jQuery的选择器需要对 : 进行转义, : 需要写成 \:
但是你可以看出 '#foo\:bar' 是一个字符串,那么这个字符串中的所有 \ 都应该被转义,所以 \: 就应该写成 \\:

代码经过javascript的解析器解析后少掉一个,被jquery的解析器解析后又少掉一个。追问

解析两次?javascript和jquery各解析一次? 那么顺序呢? 我之前一直以为解析一次 各式在什么时候解析的呢?

追答

$() 这个是jquery的function,字符串常量是传递给这个function的。
字符串先被javascript解析,然后当成参数传递给 $() 这个jquery的function,jquery这个function内部再对这个字符串进行处理。

参考技术A 被转义的不是冒号,而是反斜杠本身。
冒号,中括号,点这些符号如果在前面加上反斜杠就没有任何意义了,就变成纯字符串。
但反斜杠本身就是应该被跳出,所以要给自己再加一个反斜杠
来达到最终目的 ====> 反斜杠 点
参考技术B

\\\\:   

     : 需要转移 所以用 \\:

    当上述写完后,\\ 需要再次转移。所以就要写成\\\\:

参考技术C 其实 输出下我想你了解的比别人告诉你的更多

使用 jQuery $().find 解析带有命名空间的 XML

【中文标题】使用 jQuery $().find 解析带有命名空间的 XML【英文标题】:Parsing XML with namespaces using jQuery $().find 【发布时间】:2010-09-12 19:36:06 【问题描述】:

我正在尝试获取 XML 文档元素的内容,但该元素的名称中有一个冒号。

此行适用于所有元素,但名称中带有冒号的元素除外:

$(this).find("geo:lat").text();

我认为冒号需要转义。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

使用反斜杠,它本身应该被转义,这样 JavaScript 就不会吃掉它:

$(this).find("geo\\:lat").text();

【讨论】:

@Vaske,我在使用最新版本的 jQuery 之一的 Chrome 中看到了同样的事情。在冒号后使用节点名称的后半部分对我有用。使用.find("lat") 而不是.find("geo\\:lat"),它对我有用。 @Mike 是的,这有帮助,但我遇到了命名空间问题,我返回的 XML 的一般问题是它包含 和 <title> 和 chrome 在这种情况下将它放在一起:( 它在 FF 中对我不起作用,但我找到了这个答案:***.com/questions/853740/… .find 就像 getElementsByTagName 在浏览器(尤其是 Chrome 和 Firefox)之间的行为不同。如果您对直接子代感兴趣,请使用.children,它可以跨浏览器工作。更多信息:wiki.orbeon.com/forms/doc/contributor-guide/… 我在相关问题的答案中引用了@MikeGrace 的评论:***.com/a/30040350/775359【参考方案2】:

这不仅仅是一个普通的元素名称。这是一个限定名称,这意味着它是一个专门引用命名空间中元素类型的名称。元素类型名称为“lat”,命名空间前缀为“geo”。

目前,jQuery 不能很好地处理命名空间,详情请参阅bug 155。

现在,作为一种解决方法,您应该能够仅使用本地名称选择这些元素:

$(this).find("lat").text();

如果必须区分具有相同本地名称的元素类型,则可以使用filter()

var NS = "http://example.com/whatever-the-namespace-is-for-geo";
$(this).find("lat").filter(function()  return this.namespaceURI == NS; ).text();

编辑:我的错误,我的印象是补丁已经登陆。使用 Adam 对选择器的建议,如果您也需要命名空间,请使用 filter()

var NS = "http://example.com/whatever-the-namespace-is-for-geo";
$(this).find("geo\\:lat").filter(function()  return this.namespaceURI == NS; ).text();

【讨论】:

【参考方案3】:

如果你有 chrome 或 webkit 的 jquery 选择器问题没有选择它尝试

$(this).find('[nodeName=geo:lat]').text();

这种方式适用于所有浏览器

【讨论】:

值得注意的是,从 jQuery 1.7 开始,一些用于查找命名空间元素的变通方法存在问题。有关更多信息,请参阅这些链接:bugs.jquery.com/ticket/10377steveworkman.com/html5-2/javascript/2011/… 绝对建议查看 ArnisAndy 在上面的评论中提供的第二个链接。它胜过所有其他解决方案。 steveworkman 的链接真的很有帮助。这适用于我的 Chrome 和 FF:$(xData.responseXML).find("z\\:row, row").each(function() // Do stuff );

以上是关于jquery 冒号转义 为啥双斜杠的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery $().find 解析带有命名空间的 XML

为啥我不能使用双冒号在命名空间中前向声明一个类?

配置web.config以将具有特定模式的URL重定向/转发到另一种模式(使用冒号和双斜杠)

为啥我需要双转义(使用 4 \)才能在纯 SQL 中找到反斜杠( \ )?

使用 Hibernate 查询:冒号被视为参数/转义冒号

Oracle 中的 JDBC 瘦连接字符串同时使用冒号和正斜杠