我坚持使用jQuery 1.7.2(由于是客户的选择,无法升级)。
这是我的情况:我有一个js变量(由客户端编写),我需要对其进行检查,以查看它是否包含javascript,如果是,则执行它(假设没有安全隐患)。 这是我的简单实现:
$(value).filter("script").each(function () {
let scriptFn = new Function(this.text);
scriptFn();
});
问题是,当值包含一些特殊字符(例如value =“ a(b)”时,则$(value)抛出异常:
未捕获的错误:语法错误,无法识别的表达式:(b)
谁能解释我为什么不能使用包含括号的字符串创建jQuery对象?是某个禁忌之王吗?有任何解决方法吗?
谢谢
答案 0 :(得分:1)
“ a(b)” 是一个函数调用。您传递的值将成为jquery的选择器参数。对于选择器,jquery仅具有某些预定义函数,例如 eq(2), nth-child(2)等。由于jquery中没有定义此方法a(b),因此会抛出无法识别的表达式错误。
答案 1 :(得分:0)
您将要编写一个将接受转义参数的选择器,例如:
$.extend($.expr[':'], {
containsEscaped: function (el, index, m) {
var s = unescape(m[3]);
return $(el).text().indexOf(s) >= 0;
}
});
请参阅我的示例:http://jsfiddle.net/9wWP5/15/
答案 2 :(得分:0)
正如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();
});