【问题标题】:Chrome Extension: popup.html closes and opens response in a new tab?Chrome 扩展程序:popup.html 关闭并在新选项卡中打开响应?
【发布时间】:2011-05-18 01:20:45
【问题描述】:

我的 popup.html 上有一个登录表单,它调用以下函数...

 chrome.extension.sendRequest({
        req: "login",
        user: username,
        pass: pass,
        remember: remember
    }, function(response) {
        console.log("RESPONSE RECIEVED HOOORAH!");
            });

这个函数依次转到我的 background.html 中的以下 switch 语句..

do_login(request.user, request.pass, request.remember, false, true, function(response){
                        if(response == true){
                            sendResponse("success");
                        }else{
                            sendResponse("badLogin");
                        }
                    })

以下是do_login的内容。在执行登录时,我的 popup.html 随机关闭并在新选项卡中重新打开,代码在那里完成并且我已登录。为什么会发生这种情况?

 var xhr = new XMLHttpRequest();
    xhr.open("GET",requrl,true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
    xhr.onreadystatechange = function(do_login){
        if(xhr.readyState == 4){
            if(xhr.status == 200){
                console.log(xhr.responseText);
                try{
                    //Incase they were just logged in as another user.
                    createContextMenu();
                    //users info.
                    var resp = JSON.parse(xhr.responseText);
                    if(resp.default === void(0)){
                        logOut();
                        callback(null);
                    }
                default = resp.default;

                for(var i=0;i<resp.s.length;i++){
                globalStaks[i] = resp.s[i];
                }
                st = global;
                bud = resp.bud;
                msg = resp.msg;
                stakid = resp.default;
                }catch(x){
                // This situation is where you have incorrect password
                console.log("something is wrong with logging in ")
                clearLoginInfo();
                console.log("Incorrect password");
                }
                if(resp.msg == "denied")
    {
        clearLoginInfo();
        callback(false);
    }
    else
    {
        loggedIn = true;
        user = username;
        userid = resp.userid;
        if(refresh){
            refreshpage();
        }
        if(notificationdisplay){
            notification.cancel();
        }
        if(remember)
        {
            clearLoginInfo();
            storeLogin(username,pass);
        }
        localStorage.setItem("pass",pass);
        md5 = pass;
        callback(true);
        }
        }else {
            callback(false);
        }
    }
}
        xhr.send(null);

编辑

它显示为收到的最后一个错误background.html throws.. Attempting to use a disconnected port object

完整的跟踪是...

 Uncaught Error: Attempting to use a disconnected port object
 chrome.Port.postMessagechrome/RendererExtensionBindings:147
 chromeHidden.Port.dispatchOnConnect.connectEventchrome/RendererExtensionBindings:89
 sendResponse.reply background.html:1266
 xhr.onreadystatechange

【问题讨论】:

    标签: javascript ajax google-chrome-extension


    【解决方案1】:

    弹出窗口中的代码和数据是短暂的,因为一旦弹出窗口关闭,相关代码就会随之关闭,因此从背景页面到弹出窗口的任何回调都将失败(没有什么可回调的) .

    您需要找到打开新页面的内容(并非您的所有代码都包含在问题中 - createContentMenu 的作用是什么?)。桌面通知可能会导致您失去焦点,从而可能关闭弹出窗口。

    还要确保在弹出窗口中捕获表单提交,然后通过 XMLHttpRequest 传递请求(或使用嵌入式框架来托管表单),因为弹出窗口中的表单提交并不像您想象的那样工作(您的页面不会在弹出窗口内更新)。

    【讨论】:

      猜你喜欢
      • 2011-01-25
      • 2012-02-13
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多