从包含圆括号的字符串创建jQuery对象会引发异常



我一直使用jQuery 1.7.2(无法升级,因为这是客户端的选择(。

这是我的场景:我有一个js变量(由客户端编写(,我需要检查它,看看它是否包含javascript,如果是,执行它(想象一下没有安全风险(。这是我的简单实现:

$(value).filter("script").each(function () {
let scriptFn = new Function(this.text);
scriptFn();
});

问题是,当值包含一些特殊字符时(例如value="a(b(",则$(value(抛出异常:

未捕获错误:语法错误,无法识别的表达式:(b(

有人能解释一下为什么我不能创建一个包含括号的字符串的jQuery对象吗?这是某种禁言之王吗?有解决办法吗?

谢谢

"a(b(">是一个函数调用。您传递的值将成为jquery的选择器参数。对于选择器,jquery只有某些预定义的函数,如eq(2(nth-child(2(等。由于jquery中没有定义此方法a(b(,因此抛出了无法识别的表达式错误。

您将编写一个接受转义参数的选择器,例如:

$.extend($.expr[':'], {
containsEscaped: function (el, index, m) {  
var s = unescape(m[3]);
return $(el).text().indexOf(s) >= 0;
}  
});   

参考我的样本:http://jsfiddle.net/9wWP5/15/

正如Amuthesan所解释的,jQuery不能接受任何东西作为选择器。所以我的变通办法是不使用jQuery:(
let tmp = document.createElement("DIV");
tmp.innerHTML = value;
let scripts = tmp.getElementsByTagName("script");
Array.from(scripts).forEach(function (script) {
let scriptFn = new Function(script.text);
scriptFn();
});

最新更新