确定是不是存在选择
Posted
技术标签:
【中文标题】确定是不是存在选择【英文标题】:Determine if selection is present确定是否存在选择 【发布时间】:2017-05-24 00:01:51 【问题描述】:有没有一种(更好的)方法来确定 Photoshop 中的图层中是否存在选择,而无需在 selection.bounds 上使用 try/catch?
try
var sel = app.activeDocument.selection.bounds;
catch(e)
var sel = undefined;
alert("No selection");
if (sel) alert(sel);
如果没有选择而不是返回(预期的)未定义边界,我只会收到错误 1302:没有这样的元素。因此需要 try/catch。
【问题讨论】:
你不能使用if(app.activeDocument.selection) var sel = app.activeDocument.selection.bounds;
之类的东西,如果选择是未定义/空的,那么它应该返回false。
@suvartheec 遗憾的是,没有。这就是您的代码刚刚提出的问题error 1302: No such element
这是一种鸡/蛋问题
【参考方案1】:
我也遇到了这个问题,虽然我没有找到使用 try..catch 的方法,但我只是在可以测试的 Selection 原型中添加了一个简单的 active() 函数。
Selection.prototype.active = function()
try return (selection.bounds) ? true : false;
catch(e) return false;
这样,您只需拨打app.activeDocument.selection.active()
即可查看是否选择了某些内容。
try 部分中的三元运算符存在,以防他们将来修复 Selection.bounds 以报告未定义。
【讨论】:
【参考方案2】:遗憾的是,原型不符合 Photoshop 的 EMCA 限制,所以我将它变成了一个函数:
var mySelection = is_selection_active();
alert(mySelection);
function is_selection_active()
var layerRef = app.activeDocument.selection;
try return (layerRef.bounds[0]) ? true : false;
catch(e) return false;
【讨论】:
【参考方案3】:不幸的是,上面的函数是错误的,因为如果选择的左 x 坐标为 0,它将返回 false。这可以通过仅检查引用来纠正(即从边界中删除 [0])或在两个测试用例中都返回 true的三元表达式。一般来说,当涉及到 javascript 时,我倾向于后一种解决方案,但在这种特定情况下,我更喜欢通过删除索引的第一种方法,因为这是一个未记录的特性测试,而且这个测试还将涵盖 API 的未来变化,这可能将 bounds 设置为 null 表示没有选择处于活动状态。
所以上面的函数就变成了:
function selection_active()
var layerRef = app.activeDocument.selection;
try return (layerRef.bounds) ? true : false;
catch(e) return false;
我个人已经调整了这个函数来接受一个可选的文档:
function selectionActive(doc)
if(doc==null) doc=app.activeDocument;
try return doc.selection.bounds ? true : true;
catch(e) return false;
【讨论】:
以上是关于确定是不是存在选择的主要内容,如果未能解决你的问题,请参考以下文章
如何确定 SQL Server 2012 中是不是存在序列?