Ace admin 如何实现类似于freamset加载页面

如上标题所述,ace admin做后台页面的时候,可以实现类似于用freamset的功能,但是ace admin做的比freamset更好,他可以用异步加载的形式展示,而加载的页面的内容可以尽可能的少(或者说按需加载)。

这个主要是使用了pjax的功能,pjax的实现原理如下:

history API中有几个新特性,分别是history.pushState和history.replaceState,我们把pushState+AJAX进行封装,合起来简单点叫,就是PJAX~ 虽说实现技术上没什么新东西,但是概念上还是有所不同的。

PJAX的基本思路是,用户点击一个链接,通过ajax更新页面变化的部分,然后使用HTML5的pushState修改浏览器的URL地址,这样有效地避免了整个页面的重新加载。如果浏览器不支持history的两个新API或者JS被禁用了,那这个链接就只能跳转并重新刷新整个页面了。和传统的ajax设计稍微不同,ajax通常是从后台获取JSON数据,然后由前端解析渲染,而PJAX请求的是一个在服务器上生成好的HTML碎片

引用至:http://www.cnblogs.com/hustskyking/p/history-api-in-html5.html

因为有pjax的支持,我们可以异步加载页面的时候,页面的标题、历史信息都可以更新,当我们再次刷新页面的时候回出现在当前页面,直接点击浏览器上的后退按钮可以回到上一个界面。

话题扯得有点远,回到ace admin。

还是按照项目来说吧,我最近的接收的项目,是一个统计项目,相当于后台管理,而每一个很多现实在浏览器的url,都是这样的:http://localhost:8080/analytics/main#bizReport?type=L&functionId=140101,我一下子又一点懵逼,url里带“#”,好吧,百度一下就知道了,10年9月,twitter改版。开始正式使用这样的url,然后就变成的流行。详情请见http://www.cnblogs.com/kaituorensheng/p/3776527.html

当然使用#号,也没有打不了,我们写js的时候,经常写回到顶部的时候,会用这个“#”+一个页面顶部的元素的id,实现定位跳转。但是我的项目是使用springmvc,url restful编码的啊,加“#”是几个意思?而且项目还能够正常的跳转和使用,最糟糕的是,我竟然在百度上没有找到详细所以说明原理的地方,公司的前辈说自己要独立思考(不是一般要学会问问题么?)负责我这个项目的人在我入职之前离职了,等于说我现在能够解惑的人都找不到,坑死爹了。

在百度上说这个页面使用了pajx,jquery有一个插件,专门写pajx的,叫jquery.pjax.js,我在想我的项目里是不是也有这个文件,然后去找,没有找到啊,有木有!

我的项目前端是使用的ace admin框架,所以就可能出现在这里,在我的模板页里找到了如下代码:

<script type="text/javascript">

    jQuery(function($) { //Load content via ajax

       if (‘enable_ajax_content‘ in ace) {

           var options = {

              content_url : function(url) {

                  return url;

              },

              default_url : ‘dashboard‘ //default url

           };

           ace.enable_ajax_content($, options);

       }

    });

</script>

So,我的代码在点击目录的时候,调用了ace.enable_ajax_content($, options);这一个函数,函数是在刷新是加载的,而点击的时候后点击事件。Ok,找到了函数,在我的ace. ajax_content.js里刚好有这个函数:

ace.enable_ajax_content = function($, options) {

    //var has_history = ‘history‘ in window && typeof window.history.pushState === ‘function‘;

     var content_url = options.content_url || false

     var default_url = options.default_url || false;

    var loading_icon = options.loading_icon || ‘fa-spinner fa-2x orange‘;

    var loading_text = options.loading_text || ‘‘;

    var update_breadcrumbs = options.update_breadcrumbs || typeof options.update_breadcrumbs === ‘undefined‘;

    var update_title = options.update_title || typeof options.update_title === ‘undefined‘;

    var update_active = options.update_active || typeof options.update_active === ‘undefined‘;

    var close_active = options.close_active || typeof options.close_active === ‘undefined‘;

    $(window)

    .off(‘hashchange.ajax‘)

    .on(‘hashchange.ajax‘, function(e, manual_trigger) {

       var hash = $.trim(window.location.hash);

       if(!hash || hash.length == 0) return;

       hash = hash.replace(/^(\#\!)?\#/, ‘‘);

       var url = false;

       if(typeof content_url === ‘function‘) url = content_url(hash);

       if(typeof url === ‘string‘) getUrl(url, hash, manual_trigger || false);

    }).trigger(‘hashchange.ajax‘, [true]);

    /**

    if(has_history) {

       window.onpopstate = function(event) {

         JSON.stringify(event.state);

         //getUrl(event.state.url, event.state.hash, true);

       }

    }

    */

    if(default_url && window.location.hash == ‘‘) window.location.hash = default_url;

    function getUrl(url, hash, manual_trigger) {

       var event

       $(document).trigger(event = $.Event(‘ajaxloadstart‘), {url: url, hash: hash})

       if (event.isDefaultPrevented()) return;

       var contentArea = $(‘.page-content-area‘);

       contentArea

       .css(‘opacity‘, 0.25)

       var loader = $(‘<div style="position: fixed; z-index: 2000;" class="ajax-loading-overlay"><i class="ajax-loading-icon fa fa-spin ‘+loading_icon+‘"></i> ‘+loading_text+‘</div>‘).insertBefore(contentArea);

       var offset = contentArea.offset();

       loader.css({top: offset.top, left: offset.left})

       $.ajax({

           ‘url‘: url

       })

       .complete(function() {

           contentArea.css(‘opacity‘, 0.8)

           $(document).on(‘ajaxscriptsloaded‘, function() {

              contentArea.css(‘opacity‘, 1)

              contentArea.prevAll(‘.ajax-loading-overlay‘).remove();

           });

       })

       .error(function() {

           $(document).trigger(‘ajaxloaderror‘, {url: url, hash: hash});

       })

       .done(function(result) {

           $(document).trigger(‘ajaxloaddone‘, {url: url, hash: hash});

           var link_element = $(‘a[data-url="‘+hash+‘"]‘);

           var link_text = ‘‘;

           if(link_element.length > 0) {

              var nav = link_element.closest(‘.nav‘);

              if(nav.length > 0) {

                  if(update_active) {

                     nav.find(‘.active‘).each(function(){

                         var $class = ‘active‘;

                         if( $(this).hasClass(‘hover‘) || close_active ) $class += ‘ open‘;

                         $(this).removeClass($class);                        

                         if(close_active) {

                            $(this).find(‘ > .submenu‘).css(‘display‘, ‘‘);

                            //var sub = $(this).find(‘ > .submenu‘).get(0);

                            //if(sub) ace.submenu.hide(sub, 200)

                         }

                     })

                     link_element.closest(‘li‘).addClass(‘active‘).parents(‘.nav li‘).addClass(‘active open‘);

                     if(‘sidebar_scroll‘ in ace.helper) {

                         ace.helper.sidebar_scroll.reset();

                         //first time only

                         if(manual_trigger) ace.helper.sidebar_scroll.scroll_to_active();

                     }

                  }

                  if(update_breadcrumbs) {

                     link_text = updateBreadcrumbs(link_element);

                  }

              }

           }

           //convert "title" and "link" tags to "div" tags for later processing

           result = String(result)

              .replace(/<(title|link)([\s\>])/gi,‘<div class="hidden ajax-append-$1"$2‘)

              .replace(/<\/(title|link)\>/gi,‘</div>‘)

           contentArea.empty().html(result);

           contentArea.css(‘opacity‘, 0.6);

           //remove previous stylesheets inserted via ajax

           setTimeout(function() {

              $(‘head‘).find(‘link.ajax-stylesheet‘).remove();

              var ace_style = $(‘head‘).find(‘link#main-ace-style‘);

              contentArea.find(‘.ajax-append-link‘).each(function(e) {

                  var $link = $(this);

                  if ( $link.attr(‘href‘) ) {

                     var new_link = jQuery(‘<link />‘, {type : ‘text/css‘, rel: ‘stylesheet‘, ‘class‘: ‘ajax-stylesheet‘})

                     if( ace_style.length > 0 ) new_link.insertBefore(ace_style);

                     else new_link.appendTo(‘head‘);

                     new_link.attr(‘href‘, $link.attr(‘href‘));//we set "href" after insertion, for IE to work

                  }

                  $link.remove();

              })

           }, 10);

           //////////////////////

           if(update_title) updateTitle(link_text, contentArea);

           if( !manual_trigger ) {

              $(‘html,body‘).animate({scrollTop: 0}, 250);

           }

           //////////////////////

           $(document).trigger(‘ajaxloadcomplete‘, {url: url, hash: hash});

       })

     }

}

  

var contentArea = $(‘.page-content-area‘);

contentArea

.css(‘opacity‘, 0.25)

var loader = $(‘<div style="position: fixed; z-index: 2000;" class="ajax-loading-overlay"><i class="ajax-loading-icon fa fa-spin ‘+loading_icon+‘"></i> ‘+loading_text+‘</div>‘).insertBefore(contentArea);

var offset = contentArea.offset();

loader.css({top: offset.top, left: offset.left})

这一处代码,实现在原始的页面上加一个层,并显示一个旋转的加载按钮。

$.ajax({

‘url‘: url

})

之后的代码就是异步加载你想要加载的页面。

contentArea.empty().html(result);

这一行,就是替换之前的页面里的内容。

var contentArea = $(‘.page-content-area‘);就是你的页面的主体部分,也就是需要异步更新的部分。

其实我并不是做前端的,只是有一点兴趣,如果这篇文章有什么漏洞和缺陷,欢迎批评指正,谢谢!!!

时间: 2024-10-04 00:04:21

Ace admin 如何实现类似于freamset加载页面的相关文章

屏蔽电信流氓广告造成的诡异的问题--Android WebView 长时间不能加载页面

发现在家里的时候用Android App里的WebView打开网站很慢,会有十几秒甚至更长时间的卡住. 但是在电脑上打开同样的网页却很快. 查找这个问题的过程比较曲折,记录下来. 抓取Android网络数据 为了调试这个问题,首先要抓取Android的网络包数据.开始时,是想用Wireshark来抓包的,但是很麻烦,tcpdump在手机要root权限. 于是转换思路,能不能在Android上设置代理,来抓包? 但是fiddler没有linux版本,于是转用BurpSuite了. 设置Androi

爬虫再探实战(三)———爬取动态加载页面——selenium

自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的知识.目标——抓取页面所有的高考录取分数信息. 对于动态加载,开始的时候是看到Selenium+Phantomjs的强大,直接就学的这个.打开网页查看网页源码(注意不是检查元素)会发现要爬取的信息并不在源码里面.也就是说,从网页源码无法通过解析得到数据.Selenium+Phantomjs的强大一方

artdialog 异步加载页面 生成验证码

artdialog  异步加载一个页面 需求:例如现在好多网站的登录或注册 都是点击弹出一个层出来 然后在上面登录.注册 这个登录可能在网站的每个页面都会有,但是我们又不能在每个页面都这一段html加载出来不显示,到需要用的时候,在给shou出来,这样做于情于理都说!不!!过!!!去!!!!!! 恰好以前接触过artdialog  不多说上代码,(注意思维,代码是死的方法是活,解决需求不一定非要这个方法 ) 1.页面html代码 1 <head runat="server">

动态加载页面数据的小工具 javascript + jQuery (持续更新)

使用该控件,可以根据url,参数,加载html记录模板(包含json参数对应,以及具体记录位置Index根据参数描述加载对应的属性,并可以根据简单的判断分支加载对应html或者控件)至列表容器内(JQuery选择器字符串)注: 该控件在使用前需引入JQuery框架支持,使用该控件,可极大的减少Ajax列表数据动态加载开发工作的实际工作量. 使用方式: 首先,添加控件引用,并加入Jquery支持 <script src="js/jquery.js"></script&g

在meta标签添加代码实现每次请求都要求重新加载页面而不是读取缓存

<!-- 禁止浏览器从本地缓存中调阅页面.--> <meta http-equiv="pragram" content="no-cache"> <!--网页不保存在缓存中,每次访问都刷新页面.--> <meta http-equiv="cache-control" content="no-cache, must-revalidate"> <!--同上面意思差不多,必须重新加

js加载页面使用execute_script选定加载位置

#由于js逐步加载页面,存在未显示的网页无法加载源码 from selenium import webdriver driver = webdriver.Firefox() init_element = driver.find_element_by_xpath('//a[@href="#" and @title="展开"]') driver.execute_script("return arguments[0].scrollIntoView();"

jquery加载页面的方法(页面加载完成就执行)

jquery加载页面的方法(页面加载完成就执行) jquery加载页面的方法(页面加载完成就执行),建议大家看下windows.onload与$(document).ready之间的区别. 1.$(function(){  $("#a").click(function(){  //adding your code here  }); }); 2.$(document).ready(function(){  $("#a").click(function(){  //a

easyui的tab加载页面中的form重复提交

http://blog.csdn.net/fxz1982/article/details/8987769 Easyui中的tabs组件以href方式加载目标页面,如果目标页面中有dialog或者window这类的easyui组件中放了form.那么在关闭这个tab再次打开.如果进行form提交操作,后台就会收到两次提交请求,再次重复以上操作会收到3次提交请求,如果将表单serialize()后以jquery的post提交服务器将收到值全是数组方式组织的. 经分析发现,Easyui的tab加载页面

加载页面遮挡耗时操作任务页面--第三方开源--AndroidProgressLayout

在Android的开发中,往往有这种需求,比如一个耗时的操作,联网获取网络图片.内容,数据库耗时读写等等,在此耗时操作过程中,开发者也许不希望用户再进行其他操作(其他操作可能会引起逻辑混乱),而此时需要给用户一个额外的加载页面遮挡住主逻辑代码的运行,待主页面的耗时操作完成后,自动消失这样加载过度页面,恢复出正常应该显示的页面. 举个实际的例子,如代码使用Android WebView打开一个网页链接试图加载某个网站,但网络质量不佳,需要耗时很久,那么在这个过程中,较好的用户体验做法是:给用户一个