【问题标题】:Display appropriate message after function in popup window returns something and close popup在弹出窗口中的函数返回某些内容并关闭弹出窗口后显示适当的消息
【发布时间】:2019-07-30 20:22:14
【问题描述】:

我正在制作一个通过外部 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) 如何在 php 脚本完成后关闭弹出窗口。 2) 如何将该 php 脚本的响应传递给位于初始页面而非弹出页面上的 javascript。对我来说完全有意义。
  • StackOverflow 不是在寻找一般性问题,尤其是当它涉及您已经开发的特定逻辑时,我们不知道。一般问题适用于众所周知的事物,例如现有的公共图书馆或插件。不是广大开发人员不知道细节的自定义代码。您必须向我们提供详细信息。否则我们只能猜测。
  • 我在我的问题中添加了一些摘录,但我不知道它们有什么帮助。

标签: javascript php jquery


【解决方案1】:

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

在 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();
}

在 JavaScript 中(使用 jQuery 和 JS-Cookie),基于this solution

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 元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多