Javascript 从包含括号的字符串创建jQuery对象时引发异常
我坚持使用jQuery1.7.2(因为这是客户的选择,所以无法升级) 这是我的场景:我有一个js变量(由客户机编写),我需要检查它是否包含javascript,如果是,则执行它(想象一下没有安全风险)。 这是我的简单实现:Javascript 从包含括号的字符串创建jQuery对象时引发异常,javascript,jquery,Javascript,Jquery,我坚持使用jQuery1.7.2(因为这是客户的选择,所以无法升级) 这是我的场景:我有一个js变量(由客户机编写),我需要检查它是否包含javascript,如果是,则执行它(想象一下没有安全风险)。 这是我的简单实现: $(value).filter("script").each(function () { let scriptFn = new Function(this.text); scriptFn(); }); 问题是,当值包含一些特殊字符(例
$(value).filter("script").each(function () {
let scriptFn = new Function(this.text);
scriptFn();
});
问题是,当值包含一些特殊字符(例如value=“a(b)”,则$(value)会引发异常:
未捕获错误:语法错误,无法识别的表达式:(b)
有人能解释一下为什么我不能创建一个包含括号的字符串的jQuery对象吗?这是一个禁止使用的字符吗?有什么解决方法吗
谢谢您需要编写一个接受转义参数的选择器,例如:
$.extend($.expr[':'], {
containsEscaped: function (el, index, m) {
var s = unescape(m[3]);
return $(el).text().indexOf(s) >= 0;
}
});
请参阅我的示例:“a(b)”是一个函数调用。您传递的值是jquery的选择器参数。对于选择器,jquery只有某些预定义函数,如eq(2)、第n个子(2)和类似函数。因为jquery没有此方法a(b)在其中定义的是抛出无法识别的表达式错误。正如Amutesan所解释的,jQuery不能接受任何作为选择器的内容。 因此,我的解决方法不是使用jQuery:)
我知道你说过要忽略潜在的安全风险,但我想说的是,即使你非常确定没有人可以在以后介绍。让安全代码成为一种习惯是非常重要的。除此之外,我认为使用
eval
比使用新函数(字符串)
更好,因为eval
更容易识别。通过这种方式,其他开发人员可以立即知道发生了什么。$()
需要一个有效的选择器、DOM元素或html标记,并将其转换为DOM元素<代码>a(b)对于任何此类情况都无效。
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();
});