【问题标题】:Selection objects and cross-origin iframes?选择对象和跨域 iframe?
【发布时间】: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


【解决方案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 之外的某个地方。

【讨论】:

  • 是的,这确实有效!哇,我在想这真的无法解决;做得很好(并被接受)!
猜你喜欢
  • 2012-10-17
  • 1970-01-01
  • 2012-01-15
  • 2011-08-28
  • 2014-04-09
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多