EasyUI Tabs + Yii2.0实现iframe方式打开页面(解决共用静态文件引入加载的问题)

  在项目实际开发中,有将打开的各个链接页面隔离的需求(防止静态资源起冲突),这个时候常规思路就是使用iframe来实现!但遇到一个比较棘手的问题,当用easyui Tabs打开一个iframe页面时,怎么解决原有共用静态资源引入的问题。有人建议可以考虑将共用静态资源文件放到一个php文件中,然后每次渲染页面时加载即可,这个时候很多朋友会想到PHP的include()方式,但是每个iframe页面都要include一次,岂不是很麻烦。而且项目的要求是iframe打开和easyui tabs href打开方式要能够自由切换,这就难倒众多小伙伴了!现将实际项目解决该问题的思路和步骤整理如下:

1、在Yii2.0 layouts下新建iframe.php共用视图文件,代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<?php
use yii\helpers\Html;
use yii\bootstrap\Nav;
use yii\bootstrap\NavBar;
use yii\widgets\Breadcrumbs;
use yii\helpers\Url;use frontend\assets\AppAsset;
use frontend\widgets\Alert;
/* @var $this \yii\web\View */
/* @var $content string */

//AppAsset::register($this);

$js[‘jquery.min.js‘]  = ‘js/jquery.min.js‘;
$js[‘easyui.min.js‘]  = ‘easyui1.4.1/jquery.easyui.min.js‘;
$js[‘easyui.ext.js‘]  = ‘easyui1.4.1/jquery.easyui.ext.js‘;
$js[‘easyui-lang.js‘] = ‘easyui1.4.1/locale/easyui-lang-zh_CN.js‘;
$js[‘global.js‘]  = ‘js/global.js‘;

foreach ($js as $f){
    if (is_file($root.‘/web/‘.$f)) {
        $t = date(‘ymdHi‘, filemtime($root.‘/web/‘.$f));
        echo "\r\n<script type=\"text/javascript\" src=\"{$f}?_t=$t\" ></script>";
    }
}
?>

<html lang="<?= Yii::$app->language ?>">
<head>
<meta charset="<?= Yii::$app->charset ?>"/>
<meta http-equiv="X-UA-Compatible" content="IE=8" />
<link rel="stylesheet" type="text/css" href="easyui1.4.1/themes/insdep/easyui.css" />
<link rel="stylesheet" type="text/css" href="easyui1.4.1/themes/insdep/easyui_animation.css" />
<link rel="stylesheet" type="text/css" href="css/icon.css" />
<link rel="stylesheet" type="text/css" href="css/css.css" />

<script type="text/javascript" src="easyui1.4.1/jquery.edatagrid.js"></script>
<script type="text/javascript" src="easyui1.4.1/jquery.easyui.extend.validate.js"></script>
<?= Html::csrfMetaTags() ?>
</head>

<style>
    * {margin:0px; padding:0px;}
    html, body {margin:0px; padding:0px; width:100%; height:100%}
    .test_page_loading{position:absolute; z-index:1000; top:0px; left:0px; margin:0px auto; padding:0px; width:100%; height:100%; filter:alpha(opacity=80); opacity:1.0; background:#F8F8F8; text-align:center}
</style>

<body>
    <!--首页遮罩-->
    <div class="test_page_loading"><div style="margin:20% auto"><image src="css/icons/loading.gif"/><font color="#15428B">页面正在加载中,请稍后···</font></div></div>
    <?=$content?>
</body>
</html>

2、因为要兼顾easyui href打开方式与iframe打开方式并存,而又不能影响原来的业务流程,故在视图文件main.php中打开的href加上一个是否是iframe的识别标记,如下所示:

     // 添加tabs
        addTab: function(node) {
            href = node.href;
            if (href==‘‘ || href==undefined) {
                return;
            }
            if (node.reload == undefined){
                reload = 0;
            }else{
                reload = parseInt(node.reload);
            }

            // 根据text查tab是否存在,如果存在则判断id是否一致,一致则直接选中,不一致则新建一个tab
            mark = node.mark;
            text = node.text;
            href = node.href;
            icon = node.icon != ‘null‘ ? node.icon : ‘‘;
            outer= parseInt(node.outer);

            var loadingHtml = ‘<div class="test_page_loading"><image src="css/icons/loading.gif"/><font color="#15428B">页面正在加载中,请稍后···</font></div>‘;
            var tabsPanel = $(‘#test-main-tabs‘);
            var tabsLength = tabsPanel.tabs(‘tabs‘).length; // 获取选项卡的长度(数量)
            var tabsMaxLength = 10; // 定义选项卡的最大长度
            var tab = $(‘#test-main-tabs‘).tabs(‘getTab‘, text );
            var tabId =  ‘user_menu_‘+mark;
            if (tab && $(tab).attr(‘id‘) == tabId){
                tabsPanel.tabs(‘select‘, text);
                if (reload){
                    if (outer){
                        var tab = tabsPanel.tabs(‘getSelected‘);
                        /*if (tab){
                            var index = tabsPanel.tabs(‘getTabIndex‘, tab);
                            tabsPanel.tabs(‘close‘, index);
                        }*/
                        // 包含?的url链接加上额外参数,解决打开外部链接404问题
                        if (/\?/g.test(href)) {
                            href = href + "&isFrame=true"; // 加上iframe打开方式标记
                        }
                        var content = ‘<iframe scrolling="auto" frameborder="0"  src="‘+ href +‘" style="width:100%;height:100%;"></iframe>‘;
                        if(tabsLength > tabsMaxLength){
                            $.messager.alert(‘提示信息‘, ‘为了您的浏览器性能,您最多允许打开‘+tabsMaxLength+‘个tabs窗口,请先关闭无用的窗口!‘, ‘error‘);
                            return false;
                        }
                        tabsPanel.tabs(‘update‘,{
                            tab: tab,
                            options: {
                                id: tabId,
                                title: text,
                                iconCls: icon,
                                content: content,
                                fit:true,
                                closable:true
                            }
                        });
                    }else{
                        // 注意,tab中如果有dialog之类的,多次刷新tab会导致内存中有多个同样的dialog
                        tabsPanel.tabs(‘getSelected‘).panel(‘refresh‘, href);
                    }
                }else{

                }
            }else{
                if (outer){
                    // 包含?的url链接加上额外参数,解决打开外部链接404问题
                    if (/\?/g.test(href)) {
                        href = href + "&isFrame=true";
                    }
                    var content = ‘<iframe scrolling="auto" frameborder="0"  src="‘+ href +‘" style="width:100%;height:100%;"></iframe>‘;
                    if(tabsLength > tabsMaxLength){
                        $.messager.alert(‘提示信息‘, ‘为了您的浏览器性能,您最多允许打开‘+tabsMaxLength+‘个tabs窗口,请先关闭无用的窗口!‘, ‘error‘);
                        return false;
                    }
                    tabsPanel.tabs(‘add‘,{
                        id: tabId,
                        title: text,
                        iconCls: icon,
                        content: content,
                        fit:true,
                        closable:true
                    });
                }else{
                    if(tabsLength > tabsMaxLength){
                        $.messager.alert(‘提示信息‘, ‘为了您的浏览器性能,您最多允许打开‘+tabsMaxLength+‘个tabs窗口,请先关闭无用的窗口!‘, ‘error‘);
                        return false;
                    }
                    tabsPanel.tabs(‘add‘,{
                        id: tabId,
                        title: text,
                        iconCls: icon,
                        href: href,
                        closable:true,
                        onBeforeLoad: function() {
                            $(‘#test-main-tabs‘).find(‘.tabs-panels‘).append(loadingHtml);
                        }
                    });
                }
            }
        }

3、因为根据之前的业务tabs都是通过href直接打开的,现要支持iframe打开而不能影响之前的打开方式,也就是两种方式能够随时切换,那么后台渲染视图也要做相应的调整,如下所示:

    // BaseController.php
    /**
     * 控制器动作执行前事件处理,解决iframe方式打开使用iframe公共视图
     * @author testMe
     * @date 2016-12-04
     */
    public function beforeAction($action)
    {
        // 用iframe方式打开则改变默认的视图布局文件
        $isFrame = Yii::$app->request->get(‘isFrame‘, ‘‘);
        if ($isFrame == ‘true‘) {
            $this->layout = ‘@app/views/layouts/iframe‘;
            self::$_isFrame = true;
        } else {
            self::$_isFrame = false;
        }

        return parent::beforeAction($action);
    }

    /**
     * 实现页面iframe方式打开时强制渲染公共视图(因为之前的逻辑都是通过renderPartial局部方式渲染的,而通过iframe要启用新的共用视图文件,所以这里强制使用render包含共用视图的渲染方式)
     * @author testMe
     * @date 2016-12-04
     */
    public function renderPartial($view, $params = [])
    {
        if (self::$_isFrame) {
            return parent::render($view, $params);
        } else {
            return parent::renderPartial($view, $params);
        }
    }

原文地址:https://www.cnblogs.com/itsharehome/p/8003853.html

时间: 2024-12-29 23:57:13

EasyUI Tabs + Yii2.0实现iframe方式打开页面(解决共用静态文件引入加载的问题)的相关文章

fopen()函数以&quot;a+&quot;方式打开一个不存在的文件后读写出现问题

问题:在完成课后习题的时候,使用fopen()函数以"a+"方式打开一个不存在的文件时,写入.读取出现错误: 1 //添加用户输入单词后,在单词头加入编号,确保编号跟着前面的开始排序 2 #include "stdio.h" 3 #include "stdlib.h" 4 #define MAX 40 5 6 int main(void){ 7 FILE *fp; 8 char words[MAX]; 9 int count = 1, 10 te

(转)连接带有密码的ACCESS数据库时出现“无法启动应用程序。工作组信息文件丢失,或是已被其它用户以独占方式打开”的解决方法

原文:http://www.cnblogs.com/chiname/articles/582539.html 连接带有密码的ACCESS数据库时出现“无法启动应用程序.工作组信息文件丢失,或是已被其它用户以独占方式打开”的解决方法:此问题是由数据库的连接串引起的,可用下面的串连接即可 Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=true;Data Source=<YourPath>;Jet OLEDB:Database Pass

1.引入必要的文件 2.加载 UI 组件的方式 4.Parser 解析器

1 //引入 jQuery 核心库,这里采用的是 2.0 <scripttype="text/javascript"src="easyui/jquery.min.js"></script> //引入 jQuery EasyUI 核心库,这里采用的是 1.3.6 <scripttype="text/javascript"src="easyui/jquery.easyui.min.js"><

打开Visual Studio 2010,左下角显示加载工具箱内容

打开Visual Studio 2010,左下角显示加载工具箱内容 不知何时起,每次打开Visual Studio2010时在左下角显示加载工具箱内容,这个过程简直就是煎熬. 于是开始在网上查找解决办法.大多解决办法都是用Visual Studio2010命令提示符执行以下两个命令: 1,输入:devenv /ResetSkipPkgs,然后回车 2,输入:devenv /ResetSettings,然后回车 在经过n变尝试之后发现并无卵用.  最后好不容易找到以下这篇文章: http://mi

linux函数深入探索——open函数打开文件是否将文件内容加载到内存空间

转自:https://blog.csdn.net/qq_17019203/article/details/85051627 问题:open(2)函数打开文件是否将文件内容加载到内存空间 首先,文件打开后都会产生一个文件描述符fd,这个文件描述符其实是记录在PCB的文件描述符表中,而这个文件描述符实质上是一个结构体,用来存放跟打开文件相关的信息,基于此前提,我产生了两种假设 1.文件描述符结构体中只存储了文件在硬盘中的相应地址信息,并不将文件内容加载到内存中,这样做的好处是减少内存空间的占用,但大

Cocos2d-x3.0游戏实例之《别救我》第九篇——从tmx文件中加载关卡怪物

上一篇我们已经制作好tg1.tmx文件了,现在就要使用它了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/944 文章来源:笨木头与游戏开发 很抱歉,我们又要新建2个类了,我已经尽力少新建类了,毕竟是教程,类越多越容易混乱. 我们要新建一个Monster类,以及一个MonsterLayer类,专门添加Monster对象. Monster类 来看看Monster.h文件: #ifndef Monste

关于win7系统中所有exe文件都被以word方式打开的解决方法

手残一刻,电脑桌面所有的软件快捷方式都变成了word的打开方式,鼠标右键选中某exe文件也没打开方式那个选项, 第一次尝试: 在控制面板——默认程序中修改默认打开方式,但是没有找到解决方法 第二次尝试: 万能的重启,你会发现,并没有卵用的…… 第三次尝试: 使用ctrl+alt+delete调出任务管理器,不要妄图使用在任务栏——右键——打开任务管理器,也同样只会是word方式打开,不停的报错,你想要关都关不掉,所以不用理会他,只管使用任务管理器,看到帖子上有人说:“结束掉explorer这个任

jQ禁止右键点击、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器、预加载图片、页面样式切换、所有列等高、动态控制页面字体大小、获得鼠标指针的X值Y值、验证元素是否为空、替换元素、延迟加载、验证元素是否存在于Jquery集合中、使DIV可点击、克隆对象、使元素居中、计算元素个数、使用Google主机上的Jquery类库、禁用Jquery效果、解决Jquery类库与其他Javascript类库冲突

1. 禁止右键点击 代码如下: $(document).ready(function(){ $(document).bind("contextmenu",function(e){ return false; }); }); 2. 隐藏搜索文本框文字 代码如下: $(document).ready(function() { $("input.text1").val("Enter your search text here"); textFill($

[转]IE9.0或者360下js(JavaScript、jQuery)不能正确执行(加载),按F12后执行正常;Firefox下ajax的success返回数据data(json、string)无法获取

兼容问题1: 页面的分享等插件加载不全,并无法点击. 兼容问题2: IE下页面选择器(#id..class.etc.)绑定click事件无法访问到,后台springmvc方法,也无法获取ajax的success方法返回值data. 兼容问题3: 在IE和Google下能够获取,ajax的success返回的数据data,但firefox下获取不到. 兼容问题4: 页面跳转,或url进入,js代码不能正确执行,如果按了F12后(开启F12),JavaScript(加载)事件可以正常响应,一切都正常