2015-06-20 51 views
2

当用户选择不同来源的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的消息。我的用户更少的错误消息:太棒了。

+0

我非常怀疑你可以。但是,嘿,值得问。 –

回答

1

此作品(jsfiddle):

var iframeClicked = false; 

document.body.addEventListener('mouseup', iframe(false)); 

function iframe(bool) { 
    return function(e) { 
     iframeClicked = bool; 
     //console.log(iframeClicked); 
    } 
} 

focus(); 
var listener = addEventListener('blur', function() { 
    if(document.activeElement === document.getElementsByTagName('iframe')[0]) { 
     iframe(true)(); 
    } 

    removeEventListener(listener); 
}); 

document.getElementById('selbutton').addEventListener('mousedown', function() { 
    var sel = window.getSelection(); 

    if (!iframeClicked) { 
     console.log("selection type of " + sel.type + " value is :" + sel + ":"); 
    } else { 
     console.log("did not get a selection object back from getSelection"); 
    } 
}); 

的解决方案,以检查是否iframe点击画面可以发现in this answer。我们正在寻找的是查看iframe是否是被点击的最后一件事(因为如您所知,如果您选择了某项内容,那么您点击的下一件事物将取消选择该选择......所以如果iframe是最后一件事点击,然后我们点击“获取选择”按钮,然后我们会知道我们试图在iframe中选择一些内容。)这很让人困惑。

反正iframeClicked === true意味着前的最后一件事点击“获取选择”按钮,用户点击确实是iframe。否则,它在以外的地方iframe

+1

是的,的确,这确实奏效!哇,我以为这真的无法解决;很好地完成(并接受)! – Polly

+0

@Polly,太棒了!很高兴它对你有效。 –