`
mutongwu
  • 浏览: 448411 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

hashchange 插件

阅读更多


(function($){

    var hashchange = 'hashchange',  DOC = document,  documentMode = DOC.documentMode,
    supportHashChange = ('on' + hashchange in window) && ( documentMode === undefined || documentMode > 7 );
   
    $.fn[ hashchange ] = function(callback){
        return callback?  this.bind(hashchange, callback ) : this.trigger( hashchange);
    };
    $.fn[ hashchange ].delay = 50;
    if(!supportHashChange){
        //$.log("不支持hashchange,使用iframe加定时器模拟")
        var iframe, timeoutID, html = '<!doctype html><html><body>{0}</body></html>';
        
        if( $.fn[ hashchange ].domain){
            html = html.replace("<body>","<script>document.domain ="+ 
                $.fn[ hashchange ].domain +"</script><body>" )
        }

        function format(html,hash){
            return html.replace('{0}', hash);
        }
        function getHash ( url) {//用于取得当前窗口或iframe窗口的hash值
            url = url || DOC.URL;
            return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
        }
        function getHistory(){
            return getHash(iframe.location);
        }
        function setHistory(hash, history_hash){
            var doc = iframe.document;
            if (  hash !== history_hash ) {//只有当新hash不等于iframe中的hash才重写
                //用于产生历史
                    doc.open();
                    doc.write(format(html, hash));
                    doc.close();
            }
        }
        var last_hash = getHash(), history_hash, hash = "";

        $.event.special[ hashchange ] = {
            setup: function() {
                $(function(){
                    if (!iframe) {
                        var el = $('<iframe tabindex="-1" style="display:none" width="0" height="0" />').appendTo( document.body );
                        el.one("load",function(){
                            iframe = this.contentWindow;
                            var doc = iframe.document;
                            doc.open();
                            doc.write(format(html, last_hash));
                            doc.close();
                            timeoutID = setInterval(poll,  $.fn[ hashchange ].delay);
                        });

                        function poll() {
                            var hash = getHash(),//取得主窗口中的hash
                            	history_hash = iframe.document.body.innerText;//取得现在iframe中的hash
                            if(hash !== last_hash){//如果是主窗口的hash发生变化
                                setHistory(last_hash = hash, history_hash );
                                $(window).trigger(hashchange,[hash] );
                            }else if(history_hash !== last_hash){//如果按下回退键,
                                location.href = location.href.replace( /#.*/, '' ) +  history_hash;
                            }
                        }
                    }
                });
                
            },
            teardown: function(){
                if(!iframe){
                    clearTimeout(timeoutID);
                    $(iframe).remove();
                    iframe = null;
                }
            }
        };
    }
})(jQuery);



<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="../jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="hashchange.js"></script>

</head>
<body>
	<a href="#a?id=10">aaaa</a>
	<a href="#b?id=11&bb=11">bbbb</a>
	<a href="#c?id=12&cc=11">cccc</a>
	<div id="log" width="300px;" height="200px" style="border:1px solid #ccc;"></div>
	<script>
		$(function(){
			$(window).hashchange(function(e,hash){
				$('#log').append('<div>' + document.location + '【<strong>'+hash+ '</strong>】</div>');
			});
			$(window).hashchange();
		});
	</script>
</body>
</html>
分享到:
评论

相关推荐

    JQuery HashChange插件修改.rar

    《jQuery HashChange插件修改详解》 在Web开发中,jQuery是一个广泛使用的JavaScript库,它极大地简化了DOM操作、事件处理以及Ajax交互等任务。而HashChange事件是HTML5引入的一个新特性,允许开发者监听浏览器URL...

    前端项目-jquery-hashchange.zip

    本文将深入探讨jQuery HashChange插件的工作原理、使用方法以及实际应用。 一、哈希change事件的由来 在HTML5中,浏览器原生支持了`window.onhashchange`事件,当URL的哈希部分发生变化时,这个事件会被触发。然而...

    jquery.hash.min.js 和 jquery.ba-hashchange.min.js

    在某些浏览器中,如 IE6、7、8,原生并不支持 hashchange 事件,因此这个插件通过定时检查 URL hash 来模拟这一事件,确保在这些浏览器中也能正常监听 hash 的变化。这使得开发者无需担心兼容性问题,可以在各种...

    h5滑动页面插件

    9. SEO友好:虽然滑动页面可能会影响爬虫抓取内容,但优秀的插件会提供解决方案,如使用`hashchange`事件实现SEO友好的锚点链接,或提供静态版本供搜索引擎抓取。 10. 兼容性测试:在实际应用中,必须对插件进行...

    自用jQuery插件,基于html5的history.pushState方法.zip

    4. **兼容性处理**:考虑到非HTML5兼容的浏览器,插件可能包含了一套备选方案,如使用hashchange事件或传统页面跳转,确保在旧版本浏览器中也能正常工作。 5. **事件绑定**:为了方便开发者在状态变化时执行特定...

    mootools-history:通过popstate或hashchange进行历史记录管理

    通过popstate或hashchange进行历史记录管理。 在不重新加载的情况下替换页面的URL,并在较旧的浏览器上回退到Hashchange。 该插件是MooTools 一部分 。 建造 通过构建,需要和已注册到Packager packager ...

    基于jQuery的history历史记录插件

    对于不支持`hashchange`事件的老版本浏览器,如Safari 4和IE6、7,插件会自动切换到备用机制,如使用`setInterval`监测`location.hash`或使用`iframe`。 3. **初始化和事件处理**: 开发者可以通过调用`$.history....

    HTML5单页面全屏滚动特效

    8. **滚动事件**:fullPage插件触发多种滚动相关的事件,如`scroll`、`resize`和`hashChange`,你可以监听这些事件并作出相应处理,比如更新页面内容或状态。 9. **API方法**:除了初始化配置,fullPage还提供了...

    前端项目-urlive.zip

    此外,为了实现URL预览,项目可能利用了浏览器的`window.location`对象来获取和设置当前URL,以及监听`hashchange`或`popstate`事件来实现URL的实时更新。如果涉及到路由管理,可能还会用到`history.pushState`和`...

    对ajax前进后退的处理

    在实际项目中,还可以考虑使用jQuery的插件,如`History.js`或`jQuery BBQ`,它们提供了更完善的`hash`管理和历史记录支持,简化了开发过程。在提供的`cyzshenzhen-jquery_history_demo-master`压缩包中,可能包含了...

    自定义jQuery选项卡插件实例

    ### 自定义jQuery选项卡插件实例详解 #### 一、引言 在Web开发中,选项卡组件是一种常见的用户界面元素,它可以帮助用户在有限的空间内管理多个内容区块。使用jQuery这样的JavaScript库来创建选项卡插件,可以极大...

    jQuery UI Multiselect (jQuery UI 多选框)

    - **主题支持**:继承自jQuery UI,该插件能够无缝地与各种jQuery UI主题搭配,确保与页面其他组件的视觉一致性。 - **事件处理**:提供了丰富的事件接口,如`select`、`deselect`等,方便开发者根据用户操作进行...

    前端项目-html5-history-api.zip

    这通常涉及到使用条件语句检测浏览器是否支持History API,如果不支持,则可能使用hashchange事件或其他的回退策略来模拟类似的行为。 **Hashchange事件**:在老版本的浏览器中,可以利用URL的哈希部分(#后面的...

    JS 获取链接(url)参数以及锚链接(anchor)结合富ajax的应用(ajax前进/后退的问题)

    window.dispatchEvent(new HashChangeEvent('hashchange')); ``` 现在,我们来看如何解决Ajax前进/后退问题。当使用Ajax加载新内容时,浏览器的历史记录不会自动更新,导致前进/后退功能失效。为此,可以使用`push...

    jquery 常用工具集合 jcarousellite_1.0.1.js jquery.lazyload.js

    个人把常用的一些jquery插件做了一个demo,里面有jquery.dropkick-1.0.0.js、slider.js、fullcalendar-1.5.2、jquery.grumble.js、jcarousellite_1.0.1.js(已修改)、jquery.jqzoom.js、jquery.thickbox.js、jquery...

    01_vue全家桶 & 原理1

    安装vue add router核步骤:步骤一:使用vue-router插件,router.js步骤二:创建Router实例,router.js步骤三:在根组件上添加该实例,main.js步骤四:添加路由视图,App.vue 在安装Vue Router时,我们需要使用vue ...

    SinglePage:更改 url 参数以强制网站加载单个页面

    当哈希值改变时,浏览器会触发hashchange事件,插件可以通过监听这个事件来处理页面的跳转。 3. **推送给服务器的数据**:可能使用了`fetch`或`XMLHttpRequest`发送HTTP请求,与服务器进行数据交互,更新页面内容。...

    Webapp Architecture

    - **Ben Alman 的BBQ & hashchange**:提供的工具集,支持URL哈希变化的监听。 #### 测试与优化工具 - **Unit Testing**:单元测试是软件开发过程中不可或缺的一环。 - **QUnit**:简洁易用的JavaScript单元测试...

    jquery-scroll-to:平滑滚动到当前页面上的哈希位置

    `jQuery Scroll To` 是一个流行的 JavaScript 插件,它允许开发者实现平滑、流畅的页面滚动效果。当用户点击带有哈希值(如 `#section1`)的链接时,页面会优雅地滚动到对应的位置,而不是立即跳转。这种效果在现代...

Global site tag (gtag.js) - Google Analytics