【发布时间】:2015-06-24 02:34:50
【问题描述】:
当用户在异源 iframe 中选择文本时,由于跨源安全策略,在包含文档中运行的 javascript 调用 window.getSelection() 会返回一个无选择对象。
因此,以编程方式,我无法区分因为用户没有在整个文档中选择任何内容而返回 None 选择对象与因为用户在不同来源中选择了某些内容而返回 None 之间的区别iframe,但它是我的代码的禁区。
我希望能够区分这些情况,以便向用户显示不同的错误消息。这可能吗?
var sel = window.getSelection();
if ( sel && sel.type == 'None' ) {
// Did the user not select anything in the entire document?
// Or did the user select something in a different origin
// iframe that I can't see?
// If I could tell the difference between these two cases,
// I could show my user a much better error message
alert('sel type = None, dunno what it means exactly, kthxbai');
}
完整的演示代码在这里:http://jsfiddle.net/t3bd6zy4/2/
注意:这需要与任意网站一起使用,因此更改原始策略或使用 postMessage() 对我来说不是可行的方法。此外,此代码只能在最近的 Chrome 浏览器中运行。
更新:我有一个解决这个问题的方法,尽管它只适用于 Chrome 扩展程序。
虽然我无法在不更改源策略的情况下从 DOM 获取异源 selectedText,但 Chrome API 将允许您获取选定文本,即使它确实来自异源 iframe。 (如果您想了解更多信息,请参阅 contextMenus API 的示例:https://developer.chrome.com/extensions/contextMenus。)
使用这种方法意味着我不需要为空选择显示特定于 iframe 的消息。为我的用户提供更少的错误消息:非常棒。
【问题讨论】:
-
我非常怀疑你能做到。但是,嘿,值得一问。
标签: javascript iframe