问题由来
在历史中,用户经常被各种广告框弹出无穷的新页面,为了解决这个问题,现代浏览器们都增加安全判断机制,防止用户被异常程序绑架。
浏览器判断依据
浏览器会判断是用户点击新开窗口,还是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);
}
})
});
