【问题标题】: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,我想检测用户是否点击了“喜欢”按钮。如何检测间隔内的元素点击并在检测到后关闭弹出窗口?

【问题讨论】:

标签: javascript jquery html popup intervals


【解决方案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 的这个问题
猜你喜欢
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多