我正在向我的 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/