Javascript - 如何安全地评估自动完成的表达式?

标签 javascript autocomplete eval

我正在向我的 JavaScript 控制台添加自动完成功能(该脚本在远程浏览器上运行)。

我的方法是计算插入符所在的表达式,如果计算结果为 object - 建议自动完成属性列表。例如(其中 | 是插入符号位置):

document.|

在这种情况下,我评估 var evalExp = document;然后迭代它的成员 for (var prop in evalExp)创建自动完成建议列表。

问题是,如果我正在计算的表达式包含函数或赋值,例如:
count++ ,
e.click()或者
alert('Some message') ,
我不希望它被执行,因为它改变浏览器状态而不仅仅是评估和返回一个对象。

因此,如果表达式调用函数或包含赋值运算符,我希望避免计算任何表达式。

问题:

  • 我应该避免评估其他类型的表达式吗?
  • 还有哪些其他方法可以创建建议列表?

  • 最佳答案

    创建建议列表的另一种方法是获取字符串形式的对象模型,按句点分割,然后循环最后一个对象的属性。例如...

    var line = "document.body.getElementsBy",
    objs = line.replace(/[\(\{\[]+.*?[\)\}\]]+/g, '').split(/[^\w\-]/),
    lastObj = objs[objs.length - 1],
    currentObj = window,
    i = 0;
    
    if (objs[0] === 'window') {
        objs.splice(0, 1);
    }
    
    objs.splice(-1, 1);
    
    while (currentObj.hasOwnProperty(objs[i])) {
        currentObj = currentObj[objs[i++]];
    }
    
    for (var prop in currentObj) {
        if (prop.indexOf(lastObj) === 0) {
            console.log('Auto complete:', lastObj, 'with', prop);
        }
    }
    
    /* Outputs:
    Auto complete: getElementsBy with getElementsByTagName
    Auto complete: getElementsBy with getElementsByTagNameNS
    Auto complete: getElementsBy with getElementsByClassName
    */
    

    您的最终代码会更复杂,但这是总体思路。

    关于Javascript - 如何安全地评估自动完成的表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584875/

    相关文章:

    r - 当组件可能分散在环境中时评估调用

    r - 给出函数中常见的缺失参数

    javascript - UNDEFINED - 来自 PHP 和 jQuery AJAX 的多个返回值

    javascript - jquery 复选框获取文本输入值

    shell - 如何在 Emacs 24 shell 模式中禁用文件名自动完成的区分大小写?

    javascript - 使用谷歌地图 API 填充经度和纬度

    r - 评估时在错误的环境中调用match.call

    javascript - Angular 2 和被动听众

    javascript - 如何在codeigniter中分离具有php标签的javascript文件

    javascript - 为什么 Html 表单不显示在图像上