我一直使用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/
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();
});