安全地查找jQuery中是否存在元素

时间:2015-05-09 11:56:39

标签: javascript jquery

Stackoverflow已经有了如何检查元素exists in jQuery的答案 当使用jQuery时,答案很小,基本上归结为“将元素的名称发送到魔法jQuery函数并检查是否返回了某些内容”:

if ($('elementName')[0]) ...

这种方法的问题在于,如果jQuery函数接收到html片段,它将“实例化”html(包含javascript)并返回表示它的节点。 这意味着jQuery函数只能与受信任的输入一起使用,至少您将站点暴露给基于DOM的XSS like the one reported not long ago for wordpress。 我的问题是:

有没有办法使用jQuery检查元素是否存在不受信任的输入?

问题的重要部分是:

  1. 使用jQuery
    我知道使用“vanilla javascript”有jQuery的替代方法,我会想到getElementById,如果元素不存在则返回null;但...... jQuery选择器比getElementById更强大,jQuery使您免于担心浏览器是否支持这些功能。
  2. 带有不受信任的输入
    您显然可以使用正则表达式或html编码来清理输入,但您仍然需要担心浏览器对清理代码的支持。
  3. 即。我的问题基本上是有一种方法可以阻止jQuery创建新的DOM对象,并说明jQuery函数的输入是否映射到现有的DOM对象?

2 个答案:

答案 0 :(得分:4)

jQuery构造函数将根据输入的格式执行不同的操作,但您可以使用find method确保它仅将输入用作选择器(只要输入是字符串) :

var q = $(document).find(selector);
if (q.length > 0) {
  // found something
}

如果您想将搜索限制在页面的一部分,也可以使用与document元素不同的起点。

答案 1 :(得分:2)

  

jQuery选择器比getElementById

更强大

有机会面对你的jQuery要求飞行。 : - )

您正在寻找document.querySelector(找到第一个匹配的元素)和document.querySelectorAll(找到所有匹配的元素)。他们接受全系列的CSS选择器,在现代浏览器上确实是一个非常完整的工具包。它们受到所有现代浏览器以及IE8的支持。他们没有实例化元素,他们纯粹是查找它们。