`

jquery -> hash 插件

 
阅读更多
/**
 * jQuery hashchange 1.0.0
 * 
 * (based on jquery.history)
 *
 * modified by net.itcast.cn,make it easy to use
 *
 * Copyright (c) 2008 Chris Leishman (chrisleishman.com)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 */
(function($) {

    $.fn.extend({
        hashchange: function(callback) {
            this.bind('hashchange', callback);

            if (location.hash)//if location.hash is not empty,fire the event when load,make ajax easy
            {
                callback();
            }
        },
        openOnClick: function(href) {
            if (href === undefined || href.length == 0)
                href = '#';
            return this.click(function(ev) {
                if (href && href.charAt(0) == '#') {
                    // execute load in separate call stack
                    window.setTimeout(function() { $.locationHash(href) }, 0);
                } else {
                    window.location(href);
                }
                ev.stopPropagation();
                return false;
            });
        }
    });

    // IE 8 introduces the hashchange event natively - so nothing more to do
	/*
    if ($.browser.msie && document.documentMode && document.documentMode >= 8) {
        $.extend({
            locationHash: function(hash) {
                if (!hash)//get hash value
                {
                    if (location.hash.charAt(0) == '#') {
                        return location.hash.substr(1, location.hash.length-1);
                    }
                    return location.hash;
                }
                if (!hash) hash = '#';
                else if (hash.charAt(0) != '#') hash = '#' + hash;
                location.hash = hash;
            }
        });
        return;
    }*/

    var curHash;
    // hidden iframe for IE (earlier than 8)
    var iframe;

    $.extend({
        locationHash: function(hash) {
            if (!hash)//get hash value
            {
                if (location.hash.charAt(0) == '#') {
                    return location.hash.substr(1, location.hash.length - 1);
                }
                return location.hash;
            }
            if (curHash === undefined) return;

            if (!hash) hash = '#';
            else if (hash.charAt(0) != '#') hash = '#' + hash;

            location.hash = hash;

            if (curHash == hash) return;
            curHash = hash;

            if ($.browser.msie) updateIEFrame(hash);
            $.event.trigger('hashchange');
        }
    });

    $(document).ready(function() {
        curHash = location.hash;
		/*
        if ($.browser.msie) {
            // stop the callback firing twice during init if no hash present
            if (curHash == '') curHash = '#';
            // add hidden iframe for IE
            iframe = $('<iframe />').hide().get(0);
            $('body').prepend(iframe);
            updateIEFrame(location.hash);
            setInterval(checkHashIE, 100);
        } else {
            setInterval(checkHash, 100);
        }*/
    });
    $(window).unload(function() { iframe = null });

    function checkHash() {
        var hash = location.hash;
        if (hash != curHash) {
            curHash = hash;
            $.event.trigger('hashchange');
        }
    }
	/*
    if ($.browser.msie) {
        // Attach a live handler for any anchor links
        $('a[href^=#]').live('click', function() {
            var hash = $(this).attr('href');
            // Don't intercept the click if there is an existing anchor on the page
            // that matches this hash
            if ($(hash).length == 0 && $('a[name=' + hash.slice(1) + ']').length == 0) {
                $.locationHash(hash);
                return false;
            }
        });
    }*/

    function checkHashIE() {
        // On IE, check for location.hash of iframe
        var idoc = iframe.contentDocument || iframe.contentWindow.document;
        var hash = idoc.location.hash;
        if (hash == '') hash = '#';

        if (hash != curHash) {
            if (location.hash != hash) location.hash = hash;
            curHash = hash;
            $.event.trigger('hashchange');
        }
    }

    function updateIEFrame(hash) {
        if (hash == '#') hash = '';
        var idoc = iframe.contentWindow.document;
        idoc.open();
        idoc.close();
        if (idoc.location.hash != hash) idoc.location.hash = hash;
    }

})(jQuery);

  

JQuery HashChange插件修改

 

在做AJAX的时候前进、后退按钮的处理是比较重要的,可以使用location.hash来解决这个问题。原理这里不再重复,为了方便,我使用了JQuery的HashChange插件,不过这个插件用起来不好:$.locationHash()方法只能设置hash,不能读取hash,不符合JQuery的风格;hashchange事件在用户通过地址栏直接敲“a.htm?#a”这种方式的时候不会触发,必须在ready的时候做处理。
我对这个插件做了修改代码如下:

(function($) {

    $.fn.extend({
        hashchange: function(callback) {
            this.bind('hashchange', callback);

            if (location.hash)//if location.hash is not empty,fire the event when load,make ajax easy
            {
                callback();
            }
        },
        openOnClick: function(href) {
            if (href === undefined || href.length == 0)
                href = '#';
            return this.click(function(ev) {
                if (href && href.charAt(0) == '#') {
                    // execute load in separate call stack
                    window.setTimeout(function() { $.locationHash(href) }, 0);
                } else {
                    window.location(href);
                }
                ev.stopPropagation();
                return false;
            });
        }
    });

    // IE 8 introduces the hashchange event natively - so nothing more to do
    if ($.browser.msie && document.documentMode && document.documentMode >= 8) {
        $.extend({
            locationHash: function(hash) {
                if (!hash)//get hash value
                {
                    if (location.hash.charAt(0) == '#') {
                        return location.hash.substr(1, location.hash.length-1);
                    }
                    return location.hash;
                }
                if (!hash) hash = '#';
                else if (hash.charAt(0) != '#') hash = '#' + hash;
                location.hash = hash;
            }
        });
        return;
    }

    var curHash;
    // hidden iframe for IE (earlier than 8)
    var iframe;

    $.extend({
        locationHash: function(hash) {
            if (!hash)//get hash value
            {
                if (location.hash.charAt(0) == '#') {
                    return location.hash.substr(1, location.hash.length - 1);
                }
                return location.hash;
            }
            if (curHash === undefined) return;

            if (!hash) hash = '#';
            else if (hash.charAt(0) != '#') hash = '#' + hash;

            location.hash = hash;

            if (curHash == hash) return;
            curHash = hash;

            if ($.browser.msie) updateIEFrame(hash);
            $.event.trigger('hashchange');
        }
    });

    $(document).ready(function() {
        curHash = location.hash;
        if ($.browser.msie) {
            // stop the callback firing twice during init if no hash present
            if (curHash == '') curHash = '#';
            // add hidden iframe for IE
            iframe = $('<iframe />').hide().get(0);
            $('body').prepend(iframe);
            updateIEFrame(location.hash);
            setInterval(checkHashIE, 100);
        } else {
            setInterval(checkHash, 100);
        }
    });
    $(window).unload(function() { iframe = null });

    function checkHash() {
        var hash = location.hash;
        if (hash != curHash) {
            curHash = hash;
            $.event.trigger('hashchange');
        }
    }

    if ($.browser.msie) {
        // Attach a live handler for any anchor links
        $('a[href^=#]').live('click', function() {
            var hash = $(this).attr('href');
            // Don't intercept the click if there is an existing anchor on the page
            // that matches this hash
            if ($(hash).length == 0 && $('a[name=' + hash.slice(1) + ']').length == 0) {
                $.locationHash(hash);
                return false;
            }
        });
    }

    function checkHashIE() {
        // On IE, check for location.hash of iframe
        var idoc = iframe.contentDocument || iframe.contentWindow.document;
        var hash = idoc.location.hash;
        if (hash == '') hash = '#';

        if (hash != curHash) {
            if (location.hash != hash) location.hash = hash;
            curHash = hash;
            $.event.trigger('hashchange');
        }
    }

    function updateIEFrame(hash) {
        if (hash == '#') hash = '';
        var idoc = iframe.contentWindow.document;
        idoc.open();
        idoc.close();
        if (idoc.location.hash != hash) idoc.location.hash = hash;
    }

})(jQuery);


$.locationHash()是读取当前页面的hash,$.locationHash("a")是设置当前页面的hash,$(window).hashchange()监听hash改变事件(在第一次绑定事件的时候如果页面有hash值,则立即触发一次事件)。
例子:
            $(window).hashchange(function() {
                alert($.locationHash());
            });
            $("input").click(function() {
                $.locationHash($(this).val());
            });


完整的例子,一个在服务器端进行数字加倍运算:
    <script type="text/javascript">
        var calcFinish = function(data) {
            $("#msg").text(data);
        }
        $(function() {
            $("#btn1").click(function() {
                //改变hash
                $.locationHash($("#txt1").val());
            });
            $(window).hashchange(function() {
                var i = $.locationHash();//获得hash
                if (i) {//发出计算请求
                    $.post("CalcService.ashx", {"i":i},calcFinish);
                }
            });
        });
    </script>

<input type="text" id="txt1" /><span id="msg"></span>
<input type="button" id="btn1" value="calc" />

使用的时候注意前进、后退按钮和地址栏的变化。

 

 

分享到:
评论

相关推荐

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

    而 `jquery.hash.min.js` 和 `jquery.ba-hashchange.min.js` 这两个文件则是在 jQuery 基础上扩展了对浏览器 URL hash 变化的处理,从而实现单页面应用(Single Page Application, SPA)中后退和前进按钮的刷新功能...

    jquery插件库-jquery左侧导航滑动网页定位效果.zip

    -- 引入插件文件 --&gt; &lt;script src="path/to/plugin.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;nav id="sidebar"&gt; &lt;!-- 导航项 --&gt; &lt;/nav&gt; &lt;div id="content"&gt; &lt;!-- 页面内容 --&gt; &lt;/div&gt; &lt;script&gt; $(document).ready...

    jquery-hash-tag-input:用于编写哈希标签的 jquery 插件

    **jQuery Hash Tag Input 插件详解** 在网页开发中,哈希标签(#tags)已经成为了数据分类和用户互动的重要工具,特别是在社交媒体、博客和论坛等应用中。jQuery 是一个广泛使用的 JavaScript 库,它提供了丰富的...

    jQuery-MD5-master-官方.zip

    在HTML文件中,通过`&lt;script&gt;`标签引入jQuery库和`md5.js`插件文件。如果项目已经使用了CDN,可以直接链接到jQuery库,然后将"jQuery-MD5-master"目录下的"md5.js"文件链接到页面。 此外,值得注意的是,虽然MD5在...

    jquery.hash:jQuery DOM元素哈希插件

    jQuery DOM元素哈希插件 支持的哈希方法 base64 md5 sha1 自己编译 如果要编译自己的版本或jquery.hash的修改 npm install node compile 抓取out/jquery.hash.min.js文件并将其插入! 例子 DOM元素 $elem = $ ...

    jQuery的单页面滚动插件

    **jQuery的单页面滚动插件**是Web开发中一种常用的技术,它允许用户在单一页面内通过滚动浏览多个“分页”内容,提供流畅且直观的用户体验。这种插件通常结合了JavaScript库jQuery,利用其强大的DOM操作和事件处理...

    jQuery md5加密插件jQuery.md5.js用法示例

    本文实例讲述了jQuery md5加密插件jQuery.md5.js用法。分享给大家供大家参考,具体如下: 使用方法: $.(md5("你想要加密的字符串")); jquery.md5.js插件代码: /** * jQuery MD5 hash algorithm function * *...

    idTabs v3.0 简单易用的jQuery的Tab插件

    idTabs是一款基于jQuery库的轻量级Tab切换插件,其设计目标是提供一个简单、易用且功能齐全的解决方案,用于在网页中创建Tab式布局。这个插件以其直观的API和良好的浏览器兼容性而受到开发者的青睐。在本文中,我们...

    华西网源码

    门户最热门搜索词、论坛热门搜索这个都是后台控制添加的,后台-&gt;全局-&gt;搜索设置-&gt;热门关键词,添加即可 这里需要注意一个特殊情况,如果开启了纵横搜索,可能无法添加关键词,那么只能在模板里面直接添加 打开...

    jquery.serialize-hash:jQuery插件,该插件从表单的序列化返回哈希值。 支持输入名称的小写

    #jQuery序列化哈希插件 在麻省理工学院(MIT)许可下由托管。 jQuery插件,该插件从表单或任何DOM元素的序列化返回哈希值。 它在嵌套哈希的输入名称上支持方括号。 如果要从表单获取值并将其与另一个哈希合并,...

    jquery-pjaxr:Pushstate aJAX 扩展替换

    jquery-pjaxr 是一个插件,它使用 ajax 和 pushState 来提供快速浏览体验。 它能够用完整的后退功能替换多个容器和不同的头部标签。 对于 pjaxr 的完全降级。 终于发布了 1.2 版,但还有很多工作要做,目前我没有...

    使用Yii整合的pjax(pushstate+ajax)实现无刷新加载页面

    ()-&gt;clientScript-&gt;registerCoreScript('jquery'); ?&gt; ()-&gt;clientScript-&gt;registerScriptFile(Yii::app()-&gt;baseUrl . '/js/jquery-pjax/jquery.pjax.js'); ?&gt; ``` 2. 在HTML结构中,定义需要通过Pjax加载的链接和...

    jQuery密码输入体验Chroma-Hash.zip

    Chroma-Hash是一个能够为用户提供更好密码输入体验的jQuery插件。它能够将输入的值转换成某种颜色组合。用户只要记住正确密码的颜色,就能够判断自己输入的密码是否正确,而不需要等到提交服务器才知道是否正确。 ...

    jQuery类级别插件--返回顶部,底部,去到任何部位

    **jQuery 类级别插件——实现页面滚动导航** 在网页设计中,随着页面内容的增多,用户需要滚动页面来查看所有信息。为了提供更好的用户体验,开发者经常会在页面边缘添加“返回顶部”、“返回底部”这样的功能按钮...

    jquery平滑滚动插件

    **jQuery平滑滚动插件详解** 在Web开发中,用户界面的流畅性和用户体验是至关重要的。jQuery平滑滚动插件正是为了实现这一点而设计的,它使得网页元素的滚动过程更加平滑、自然,尤其在处理长页面和焦点图切换时...

    jquery.scrollTo.js网页滚动插件下载.rar

    《jQuery.scrollTo.js网页滚动插件深度解析》 在网页设计中,流畅的用户交互体验是提升网站品质的关键因素之一。jQuery.scrollTo.js插件正是这样一款工具,它为开发者提供了强大的网页滚动控制功能,使得网页的整体...

    1000多个jquery常用插件.pdf

    - **导航到页内指定位置**:使用jQuery自动根据URL中的hash值定位到页面中的指定位置。 - **Automatically generate table of contents using jQuery**:利用jQuery自动生成目录。 - **“OutsidetheBox” Navigation...

    jquery分页插件jpages

    **jQuery分页插件jPages详解** 在网页开发中,数据分页是一种常见的优化加载速度和提高用户体验的方法。尤其在处理大量数据时,分页可以让用户更流畅地浏览信息,而不是一次性加载所有内容。`jQuery`是JavaScript的...

    jquery树形目录

    本篇文章将深入探讨如何使用jQuery实现树形目录,特别是基于jQuery UI库中的`treeview`插件。 ### 1. jQuery简介 jQuery是一个轻量级的JavaScript库,简化了HTML文档遍历、事件处理、动画和Ajax交互。它的API设计...

    jquery生成cookie

    然而,jQuery本身并不直接支持Cookie操作,但可以通过一些插件来实现,如`jquery-cookie`插件。 **一、jQuery-cookie插件的使用** `jquery-cookie`是专门为jQuery设计的一个轻量级插件,它可以方便地读取、设置和...

Global site tag (gtag.js) - Google Analytics