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

时间:2018-08-01 15:20:30

标签: javascript 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对象?是某个禁忌之王吗?有任何解决方法吗?

谢谢

3 个答案:

答案 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();
    });