检测用户是不是点击了弹出窗口中的元素

Posted

技术标签:

【中文标题】检测用户是不是点击了弹出窗口中的元素【英文标题】:Detect if user has clicked element inside popup检测用户是否点击了弹出窗口中的元素 【发布时间】:2016-12-12 01:57:57 【问题描述】:

是否可以检查用户是否点击了弹出窗口中的元素?我目前使用此 javascript 打开一个弹出窗口并检测它是否已关闭。

var win = window.open(url,'','height=500,width=800');
var winTimer = window.setInterval(function()

    if (win.closed == true) 
        clearInterval(winTimer);
    
, 2000);

例如,我在弹出窗口中打开 YouTube,我想检测用户是否点击了“喜欢”按钮。如何检测间隔内的元素点击并在检测到后关闭弹出窗口?

【问题讨论】:

Is it possible to detect the user click event in the popup window?的可能重复 【参考方案1】:

不幸的是,除非该域与您的站点托管在同一个域中,否则您将遇到cross-domain security 问题。你试图完成的事情(通过 youtube)在这种情况下将无法工作,除非他们有一个允许这样做的隐式 api(参见Window.postMessage())。

来自wikipedia page for the Same-origin_policy:

有这个限制的主要原因是因为没有同源策略会有安全风险。假设用户正在访问银行网站并且没有注销。然后他随机访问任何其他站点,该站点在后台运行一些恶意 JavaScript 代码,该代码从银行站点请求数据。由于用户仍在银行网站上登录,该恶意代码可以在银行网站上做任何事情。例如,获取您上次交易的列表、创建新交易等。这是因为浏览器可以根据银行网站的域向银行网站发送和接收会话 cookie。访问该恶意站点的用户会期望他正在访问的站点无法访问银行会话 cookie。虽然这是真的,但 JavaScript 无法直接访问银行会话 cookie,但它仍然可以使用银行站点的会话 cookie 向银行站点发送和接收请求,基本上充当银行站点的普通用户。关于新交易的发送,即使是银行网站的 CSRF 保护也没有效果,因为脚本可以简单地做与用户一样的事情。因此,对于您使用会话和/或需要登录的所有站点来说,这是一个问题。如果示例中的银行站点(或任何其他站点)仅提供公共数据并且您无法触发任何内容,那么通常没有同源政策可以防范的危险。另外,如果这两个站点在同一方的控制下或完全信任对方,那么也可能没有危险。

【讨论】:

感谢您的信息!好吧,我想我可以使用 iframe 而不是弹出窗口正确吗? iframe 也使用相同的来源策略。你可以看一下here,但是正如你从第二条评论中看到的那样,你也会遇到 iframe 的这个问题

以上是关于检测用户是不是点击了弹出窗口中的元素的主要内容,如果未能解决你的问题,请参考以下文章

打开新标签时检查是不是启用了弹出窗口阻止程序

如何禁用弹出窗口阻止程序?

如何切换到模态弹出窗口并使用Telerik中的编码步骤识别其中的元素

QML Popup弹窗置于最顶层,实现点击位置该弹出窗口下方的任何其他层组件,Popup弹窗都不会关闭

访问 kivy 弹出父级

模态弹出窗口中的溢出