我正在编写一个针对 After Effects 的脚本,可以从图层中收集所有属性并将它们写入 XML 文件。但当我从 XML 中检索值时,某些值是只读的,这时工具包会抛出错误。
有没有办法像 File 对象的 readonly 属性一样进行检查呢?比如:layer.property().(readonly||readOnly)
如果没有,有人能告诉我应该采取哪种方法才能朝正确的方向前进吗?
我正在编写一个针对 After Effects 的脚本,可以从图层中收集所有属性并将它们写入 XML 文件。但当我从 XML 中检索值时,某些值是只读的,这时工具包会抛出错误。
有没有办法像 File 对象的 readonly 属性一样进行检查呢?比如:layer.property().(readonly||readOnly)
如果没有,有人能告诉我应该采取哪种方法才能朝正确的方向前进吗?
考虑到项目中的第一个元素是带有固体模块的 comp
,该方法可以实现,但可能不太优雅。您需要能够按顺序构建每个字符串,但也许您已经设置好了这样做的环境:
var r;
r = testForReadability("app.project.items[1].layers[1].enabled");
alert(r);
r = testForReadability("app.project.items[1].layers[1].width");//a solid's width is NOT writable
alert(r);
function testForReadability(thisProperty) {
var x;
try {
x = eval(thisProperty);
eval(thisProperty + " = x;");
return true;
} catch(e) {
return false;
}
}
然而,这里有一个小问题,在设置"启用脚本调试器"的选项后,"false"就不能起作用了。因此,您需要通过一些变通方法来检查此设置并临时重置它(请参见http://aenhancers.com/viewtopic.php?f=8&t=189&p=554&hilit=debugger#p554)。
try{ thisProperty = xmlProperty; return true; } catch(e) { return false; }
谢谢! - Miguel尝试覆盖它,然后将其恢复,就像这样:
function isReadOnly(value, container) {
var tmp = container[value];
var tmp2;
var coolString = "cool";
try {
container[value] = "cool";
} catch (e) {
return true
}
tmp2 = container[value];
container[value] = tmp;
return coolString != tmp2;
}
// true, navigator.platform is read only
console.log(isReadOnly("platform", navigator))
// false, window.parent is not read only
console.log(isReadOnly("parent", window))
reflect
之外的所有内容似乎都被标记为读/写 - 即使在对象属性中明确标记为只读的属性! - Jongware