当用户选择不同来源的iframe中的文本时,由于跨源安全策略,在包含文档中运行的JavaScript调用window.getSelection()将返回一个None选择对象。由于用户没有选择整个文档中的任何内容,而不是返回None,因为用户选择了不同的内容中的某些内容,起源iframe,但它是禁止我的代码。选择对象和跨源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的消息。我的用户更少的错误消息:太棒了。
我非常怀疑你可以。但是,嘿,值得问。 –