文章

odoo的act_url打开新窗口被谷歌浏览器拦截的问题

问题由来

在历史中,用户经常被各种广告框弹出无穷的新页面,为了解决这个问题,现代浏览器们都增加安全判断机制,防止用户被异常程序绑架。

浏览器判断依据

浏览器会判断是用户点击新开窗口,还是JS程序比如window.open,那浏览器怎么判断呢?就是用户点击按钮后新开窗口的时间,所以这一步时间很重要,很多程序写了ajax异步操作,比如odoo,在获取act事件时候都是使用异步方式,如果等服务器返回ir.actions.act_url时候,浏览器早就判断为不是用户自主判断打开新的界面。

代码实现及思路

我们的场景,我们和原生的odoo有个区别在于我们安装一套主题,在这套主题中首页的按钮事件是被统一处理的,所以我们想要我们的运用在点击时候跳转到新的链接,需要继承于这个模块,所以代码中需要继承于这个模块,拦截其点击事件,并判断是不是我们想要的模块点击。

odoo.define('fresh_email.widgets', function (require) {
    'use strict';

    var Widget = require('web.Widget');
    var core = require('web.core');
    var UserMenu = require('web.UserMenu');
    var AppSwitcher = require('web_enterprise.AppSwitcher');
    var Model = require('web.Model');
    var FreshEmailModel = new Model('fresh.email.user');
    var mobile = require('web_mobile.rpc')
  
    core.action_registry.add('fresh_email.openmail', homePage);
    AppSwitcher.include({
        //拦截点击事件
        on_menuitem_click:function(e){
            if (!mobilecheck()){
                var menu_text = $(e.currentTarget).text();
                if (menu_text.indexOf("公司邮箱")!=-1){
                     var self = this;
                     var new_window=window.open('about:blank');
                     //先新开窗口
                        callFreshEmailModel(function (res) {
                        if (res) {
                            console.log(res);
                            //在rpc调用返回再返回url
                            new_window.location.href = res.url
        //                    self.do_action(res);
                        }
                     })
                }
                }
                this._super.apply(this, arguments);
        }
    })
   
});