如何使用extendscript检查属性值是否为只读

How to check if a property value is readonly using extendscript?

本文关键字:是否 只读 属性 何使用 extendscript 检查      更新时间:2023-09-26

我正在为After Effects编写一个脚本,从一个图层中收集所有属性并将它们写入XML文件。当我从XML中检索值时,有些值是只读的,工具包抛出一个错误。

是否有任何方法来检查它,如文件对象的只读属性?即:layer.property()。(只读的| |只读的)

如果不是,有人可以告诉我,我可以采取哪种方法走在正确的方向?

考虑到项目中的第一个项目是一个包含固体的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)

我认为您无法从ESTK获得这些信息。

你可以使用'After Effects Scripting Guide Book'来检查和创建一个包含所有'readonly'属性的对象,然后检查该对象是否包含此属性。

这里是脚本指南的链接:After-Effects-CS6-Scripting-Guide

尝试覆盖它,然后恢复它,像这样:

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))