白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
阅读:1910回复:7

一个关于菜单命令可用性改变的疑问和求助

楼主#
更多 发布于:2015-10-15 17:17
原来一直用着fx 37b1,期间沉迷游戏中一直懒得更新
最近玩得累了,稍有闲暇,便顺手更新了一下,到42b3
更新之后大部分扩展脚本都没问题,小部分有问题的也花了点时间搞定,然而有一个变化让我很困扰


在之前的版本中,复制和剪切在焦点不在页面内,或未选中页面元素时为不可用状态;有选择元素后,复制命令才变为可用状态
而现在的版本,该两个选项总是可用状态

如图



以上截图来自纯净版的默认配置37b1及42b3,测试页面如下:(其中body下的空白为9行《br /》,不知道为什么会被转义)
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>Document</title>
</head>
<body>
             
             
             
             
             
             
             
             
    Text Content
</body>
</html>

因此导致某个脚本的判断代码失效
var controller = top.document.commandDispatcher.getControllerForCommand(aCommand);
if (controller && controller.isCommandEnabled(aCommand)){
    //do something
} else {
    //do something else
}

由于是业余用户,并不清楚浏览器对象的更多知识,现在的临时解决方案是判断用户是否有选择页面的东西……
var controller = top.document.commandDispatcher.getControllerForCommand('cmd_copy');
if (controller && !top.content.document.getSelection().isCollapsed){
    //do something
} else {
    //do something else
}
而剪切命令的判断,更是只能暂时直接跳过判断执行了,由此也导致许多情况下导致误判,比方说本论坛的帖子编辑页面,选择文本时用getSelection判断是没有用的

我想求助的问题是:
1. 为什么现在复制和剪切命令总是可用状态?在没有选择对象的情况下,这两个命令好像并没有实际作用
2. 有更可靠的办法实现原来脚本的功能吗?
-いたんですか? -ええ、ずっと
yfdyh000
千年狐狸
千年狐狸
  • UID29079
  • 注册日期2009-06-07
  • 最后登录2022-05-18
  • 发帖数2262
  • 经验1390枚
  • 威望0点
  • 贡献值52点
  • 好评度139点
  • 社区居民
  • 最爱沙发
  • 忠实会员
1楼#
发布于:2015-10-16 01:09
曾在 http://mozilla.com.cn/thread-344180-1-1.html 研究过:
根据 https://bugzilla.mozilla.org/show_bug.cgi?id=1162952 及相关的MDN和bug,这是一种有意的改变,从41开始,这两个命令是始终为可用。
目的似乎是 https://bugzilla.mozilla.org/show_bug.cgi?id=1012662 ,允许网页在用户或浏览器发起的情况下处理该事件。比如网站可以在你剪贴/复制空内容时,自动复制另一份东西给你。

虽然的确造成了一些误解和区别,但看起来还是有用的。


解决方法并未研究过。脚本是想要做什么?
白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
2楼#
发布于:2015-10-16 08:01
yfdyh000:曾在 http://mozilla.com.cn/thread-344180-1-1.html 研究过:
根据 https://bugzilla.mozilla.org/show_bug.cgi?id=1162952 及相关的MDN和bu...
回到原帖


原来如此. Mozilla想得真前...让我想起某些网站复制文本内容时, 会强行阻断并将剪切板的内容替换成“该信息引用自OOXX, 未经允许不得转载“之类的

这个脚本忘了是哪儿偷的了, 作用是当复制不可用时, 转而复制当前标签的URL;当剪切不可用时, 转而剪切当前标签(复制URL且关闭标签)
(其他的一些操作也有类似的扩展, 不过因为没有问题所以没有提及)
-いたんですか? -ええ、ずっと
yfdyh000
千年狐狸
千年狐狸
  • UID29079
  • 注册日期2009-06-07
  • 最后登录2022-05-18
  • 发帖数2262
  • 经验1390枚
  • 威望0点
  • 贡献值52点
  • 好评度139点
  • 社区居民
  • 最爱沙发
  • 忠实会员
3楼#
发布于:2015-10-16 08:14
白左:原来如此. Mozilla想得真前...让我想起某些网站复制文本内容时, 会强行阻断并将剪切板的内容替换成“该信息引用自OOXX, 未经允许不得转载“之类的

这个脚本忘了是哪儿偷的了, 作用是当复制不可用时, 转而复制当前标签的URL...
回到原帖
尝试剪切/复制,然后看内容是否为空,就可以了吧。
白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
4楼#
发布于:2015-10-16 09:46
yfdyh000:尝试剪切/复制,然后看内容是否为空,就可以了吧。回到原帖
好主意, 下班试试..
-いたんですか? -ええ、ずっと
fang5566
管理员
管理员
  • UID3719
  • 注册日期2005-03-07
  • 最后登录2024-04-25
  • 发帖数18483
  • 经验4837枚
  • 威望5点
  • 贡献值4316点
  • 好评度1116点
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 终身成就
5楼#
发布于:2015-10-16 14:07
你已经冷落这里好久了……
Firefox More than meets your experience
白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
6楼#
发布于:2015-10-18 10:39
nsIClipboard
fang5566:你已经冷落这里好久了……回到原帖
诶黑,因为不更新所以也就没遇到问题了……

yfdyh000:尝试剪切/复制,然后看内容是否为空,就可以了吧。回到原帖

测试之后发现,当Clipboard已经有内容的情况下,再次在页面上执行复制/剪切(也就是未选中状态,37版本中不可用时)不会对Clipboard产生任何影响,而且似乎也没有留下任何可查询的状态改变……似乎在用户端看来,这两种复制/剪切操作是无法区分的。所以靠这种方法大概是不行了

而检查getSelection的方法对本坛无效是因为编辑器实际上是在一个iframe里的,并不能从content.document里获知selection的内容_(:3 」∠)_
难道mozilla做这个变更时就没有留下什么标志位吗,比方说一个“虽然看起来是可用的但是实际上并没有什么卵用”的bool值什么的……
-いたんですか? -ええ、ずっと
yfdyh000
千年狐狸
千年狐狸
  • UID29079
  • 注册日期2009-06-07
  • 最后登录2022-05-18
  • 发帖数2262
  • 经验1390枚
  • 威望0点
  • 贡献值52点
  • 好评度139点
  • 社区居民
  • 最爱沙发
  • 忠实会员
7楼#
发布于:2015-10-18 17:49
白左:诶黑,因为不更新所以也就没遇到问题了……

 
测试之后发现,当Clipboard已经有内容的情况下,再次在页面上执行复制/剪切(也就是未选中状态,37版本中不可用时)不会对Clipboard产生任何影响,而且似乎也没有留下任何可查询...
回到原帖
大概有留吧,但在哪就不知道了……

true/false没有变化吗。那么获取当前内容,执行复制/粘贴,然后再比对是否改变,这样可以吗。如果是同步操作应该没问题吧,异步就麻烦了。
游客

返回顶部