确定是不是存在选择

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 中是不是存在序列?

确定记录是不是存在的最快方法

如何确定 JMS 连接是不是存在?

如何确定 VB.Net DataRow 中是不是存在列

什么是 GraphQL 查询以确定组织中是不是存在 GitHub 包?

在尝试使用 GSettings 架构之前,如何确定它是不是存在?