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

时间:2014-12-20 22:25:12

标签: javascript autocomplete eval

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

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

document.|

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

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

因此,我想避免在调用函数时评估任何表达式,或者如果它们包含赋值运算符。

问题:

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

  • 1 个答案:

    答案 0 :(得分:2)

    创建建议列表的另一种方法是将对象模型作为字符串,按句点拆分,并循环遍历最后一个对象的属性。例如......

    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
    */
    

    您的最终代码会更复杂,但这是一般的想法。