在弹出窗口中的函数返回内容后显示适当的消息并关闭弹出窗口

时间:2019-03-08 18:56:39

标签: javascript php jquery

我正在制作一个通过外部API(VK)使用授权的系统。当用户单击“通过VK授权”时,他们会出现一个弹出窗口,可以在其中选择是授予权限还是取消权限。无论选择什么,API都将它们重定向到同一弹出窗口中的我的php脚本中,当该脚本完成后,它们最终将打开一个空的弹出窗口。

我需要做两件事:

1)脚本完成后,关闭弹出窗口。

2)根据脚本中函数返回的内容,向用户显示适当的消息,而不是在该弹出窗口中,而是在启动弹出窗口的初始窗口中(在已有文本的两行之间的某个位置),弹出窗口关闭后。

现在,我不知道该怎么做。我必须要有一些javascript(最好是jquery),它根据从已关闭的弹出窗口中调用的函数获得的响应,将消息插入到初始窗口。

以下是系统摘录:

http://example.com/vkcode?error=access_denied&error_reason=user_denied&error_description=User+denied+your+request&state=secret_state_code-如果用户选择“取消”,则将其重定向到该页面(在弹出窗口内)。并且他们一直停留在空白页中,地址栏中带有该字符串。

下面是一些处理VK API响应的PHP代码:

public function vkAuthHandler() {
    if (isset($_GET['error'])) {
        if ($_GET['error_reason'] == 'user_denied' {
            return 'user_denied';
        }
        else return 'error';
    }
    else {
       // ... haven't written other logic yet, it's irrelevant anyway
   }
    return new Response();
}

现在,如果我收到'user_denied'响应,则需要显示一条消息,告诉用户他们拒绝了权限。但是不是在调用该函数的弹出窗口中(应该已经在此时关闭了),而是在初始页面上,而无需重新加载它。

1 个答案:

答案 0 :(得分:0)

我以一种复杂的方式解决了它。不接受这个答案,因为也许有人提供了一个更简单的解决方案。

在PHP中:

public function vkAuthHandler() {
    if (isset($_GET['error'])) {
        if ($_GET['error_reason'] == 'user_denied' {
            header('Set-cookie: vkresp=user_denied');
        }
        else header('Set-cookie: vkresp=error');
    }
    else {
       // ...
   }
    echo "<script>window.close();</script>"; //closing the window here
    return new Response();
}

基于this solution的JavaScript(用于jQuery和JS-Cookie):

var cookieRegistry = [];

function listenCookieChange(cookieName, callback) {
    setInterval(function() {
        if (cookieRegistry[cookieName] || Cookies.get(cookieName) != null) {
            if (Cookies.get(cookieName) != cookieRegistry[cookieName]) { 
                cookieRegistry[cookieName] = Cookies.get(cookieName); 
                return callback();
            } 
        } else {
            cookieRegistry[cookieName] = Cookies.get(cookieName);
        }
    }, 100);
}

listenCookieChange('vkresp', function() {
    if (Cookies.get('vkresp') == 'user_denied') {
        console.log('VK response is user_denied');
        $("#VKauth").append('<div style="color: red;">You denied authorization! Comments are blocked!</div>');
    }
    else if (Cookies.get('vkresp') == 'error') {
        console.log('VK response is user_denied');
        $("#VKauth").append('<div style="color: red;">Unknown authorization error. Try again.</div>');
    }
    Cookies.remove('vkresp');
});

$("#VKauth")基本上是在我的页面上选择ID为VKauth的HTML元素。