Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从包含括号的字符串创建jQuery对象时引发异常_Javascript_Jquery - Fatal编程技术网

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

Javascript 从包含括号的字符串创建jQuery对象时引发异常,javascript,jquery,Javascript,Jquery,我坚持使用jQuery1.7.2(因为这是客户的选择,所以无法升级) 这是我的场景:我有一个js变量(由客户机编写),我需要检查它是否包含javascript,如果是,则执行它(想象一下没有安全风险)。 这是我的简单实现: $(value).filter("script").each(function () { let scriptFn = new Function(this.text); scriptFn(); }); 问题是,当值包含一些特殊字符(例

我坚持使用jQuery1.7.2(因为这是客户的选择,所以无法升级)

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

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