让 hashchange 事件在所有浏览器(包括 IE7)中工作

2024-05-08

我有一些代码(由另一位开发人员编写)在 WordPress 内部进行 AJAX 页面加载(例如,没有页面重新加载),当您单击导航项时,AJAX 会刷新主要内容区域。我的问题是它在 IE7 中被破坏了,我不知道从哪里开始调试。

最初的开场白是

var queue = 0;

$('document').ready(function() {
    window.addEventListener("hashchange", hashChange, false);

    // Define window location variables
    var windowHost = window.location.host,
        windowHash = window.location.hash,
        windowPath = window.location.pathname;

但我改变了它们以使addEventListener条件取决于该方法是否存在。一些研究告诉我,该方法在旧版本的 IE 中不可用(例如我的情况是 7)。此外,IE7 调试控制台将其识别为不可用的方法,因此这一点非常清楚。我按如下方式重写了这些行,但代码仍然无法正常工作:

var queue = 0;

$('document').ready(function() {
    if(window.addEventListener) {
        window.addEventListener("hashchange", hashChange, false);
    }
    else if (window.attachEvent) {
        window.attachEvent("hashchange", hashchange, false);    
    }
    // Define window location variables
    var windowHost = window.location.host,
        windowHash = window.location.hash,
        windowPath = window.location.pathname;

完整的原始脚本可以在这个pastebin中查看:http://pastebin.com/Jc9ySvrb http://pastebin.com/Jc9ySvrb


  • attachEvent http://msdn.microsoft.com/en-us/library/ms536343(v=vs.85).aspx要求事件前缀为on.
  • 该方法有不同的大小写。改变hashchange in attachEvent tohashChange使该事件在 IE8 中运行。
  • 使用建议的实现来支持hashchangeIE7 和其他旧浏览器的实现。

我创建了一个跨浏览器实现,其中添加了hashchange浏览器的功能,即使是那些这样做的人不支持 https://developer.mozilla.org/en/DOM/window.onhashchange#Browser_compatibility它。后备基于规格 http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#event-hashchange.

//function hashchange  is assumed to exist. This function will fire on hashchange
if (!('onhashchange' in window)) {
    var oldHref = location.href;
    setInterval(function() {
        var newHref = location.href;
        if (oldHref !== newHref) {
            var _oldHref = oldHref;
            oldHref = newHref;
            hashChange.call(window, {
                'type': 'hashchange',
                'newURL': newHref,
                'oldURL': _oldHref
            });
        }
    }, 100);
} else if (window.addEventListener) {
    window.addEventListener("hashchange", hashChange, false);
}
else if (window.attachEvent) {
    window.attachEvent("onhashchange", hashChange);    
}

注意:此代码适用于一个 hashchange 事件。如果您想添加多种的hashchange处理程序,使用以下方法。
它定义了两个函数,addHashChange and removeHashChange。两种方法都采用函数作为参数。

(function() {
    if ('onhashchange' in window) {
        if (window.addEventListener) {
            window.addHashChange = function(func, before) {
                window.addEventListener('hashchange', func, before);
            };
            window.removeHashChange = function(func) {
                window.removeEventListener('hashchange', func);
            };
            return;
        } else if (window.attachEvent) {
            window.addHashChange = function(func) {
                window.attachEvent('onhashchange', func);
            };
            window.removeHashChange = function(func) {
                window.detachEvent('onhashchange', func);
            };
            return;
        }
    }
    var hashChangeFuncs = [];
    var oldHref = location.href;
    window.addHashChange = function(func, before) {
        if (typeof func === 'function')
            hashChangeFuncs[before?'unshift':'push'](func);
    };
    window.removeHashChange = function(func) {
        for (var i=hashChangeFuncs.length-1; i>=0; i--)
            if (hashChangeFuncs[i] === func)
                hashChangeFuncs.splice(i, 1);
    };
    setInterval(function() {
        var newHref = location.href;
        if (oldHref !== newHref) {
            var _oldHref = oldHref;
            oldHref = newHref;
            for (var i=0; i<hashChangeFuncs.length; i++) {
                hashChangeFuncs[i].call(window, {
                    'type': 'hashchange',
                    'newURL': newHref,
                    'oldURL': _oldHref
                });
            }
        }
    }, 100);
})();
// Usage, infinitely many times:
addHashChange(function(e){alert(e.newURL||location.href);});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让 hashchange 事件在所有浏览器(包括 IE7)中工作 的相关文章

随机推荐

  • 如何在 PHP 中替换/转义 U+2028 或 U+2029 字符以阻止我的 JSONP API 崩溃

    好的 我正在运行一个公共 JSONP API 数据由我的 PHP 服务器提供 我刚刚读了这篇文章 JSON 不是的 JavaScript 子集 作者 Magnus Holm 2011 年 5 月 http timelessrepo com
  • 如何自动检索AJAX调用的URL?

    目的是对爬行蜘蛛进行编程 使其能够 1 检索此页面表格中链接的 URL http cordis europa eu fp7 security projects en html http cordis europa eu fp7 securi
  • Graphql - 获取完整的子对象,如果不存在则返回 null

    我有一个 graphql 查询 它得到一个Meeting对象与Client object type Meeting address String client Client type Client displayName String Th
  • 如何在 vue.js 中使用 SVG.js 插件?

    我在用svg js在我的 Laravel 项目中运行vue js 这就是我使用的方式svg js Step 1 安装svg js作为我的 vue 应用程序中的插件 import svgJs from svg js dist svg expo
  • 停止/终止按消耗计划运行实例的 Azure Functions

    如何在消耗计划 以前称为动态计划 上终止 azure 函数可运行实例 执行 我正在运行时版本 1 0 上运行 azure 函数 很少有 一些未显示在下面屏幕截图的日志中 运行时间超过了五分钟函数超时阈值 检查具有 DOTTED 状态的 然而
  • 如何使用 itext 在 pdf 页脚上添加页码,它应该照顾其宽度?

    我的代码示例如下 Override public void onEndPage PdfWriter writer Document document addFooter writer private void addFooter PdfWr
  • 在 Blazor 中以编程方式注册页面,而不是使用 LazyAssemblyLoader 使用 @page 指令

    目前我加载程序集OnNavigateAsync包含带有 page 指令的 Razor 页面的事件 例如 page extrapage 并且工作正常 例如 我想以编程方式声明路由页面 而不声明 page并且 代替这个 使用Dictionary
  • Django,无法分配 None,不允许空值

    我有这个模型 py import datetime from django db import models from tinymce import models as tinymce models from filebrowser fie
  • 如何将 MouseDown 事件放入样式中?

    这有效 XAML
  • 如何返回以列名作为第一行的 T-SQL 查询

    我正在编写一个 SSIS 包来将数据从 SQL Server 2012 数据库输出到 CSV为客户归档 要求是第一行是列名称 下面是我为数据流任务中的源编写的查询 问题是 它总是将列名返回为最后一行 而不是第一行 为什么 我该如何实现这一目
  • ByteBuddy 变基、合成类型和 OSGi

    我为 byte buddy 开发了以下拦截器 public class SecurityInterceptor RuntimeType public static Object intercept SuperCall Callable su
  • 带有 Angular2+ 的 dc.js 图表

    有人将 dc js 与 Angular2 应用程序一起使用过吗 任何帮助或指示将不胜感激 我能够使我的应用程序在正常的 html java 脚本上运行 现在我需要在 Angular 2 应用程序中实现相同的功能 Edit 几周后 我有了更好
  • 在同一项目上使用 Eclipse 和 NetBeans

    Eclipse 是一个非常棒的编辑器 我更喜欢使用它 但是缺少 Eclipse 的 GUI 设计工具 另一方面 NetBeans 非常适合 GUI 设计 在同一项目中使用 NetBeans 进行 GUI 设计和 Eclipse 进行其他所有
  • 使用 JSON.NET 反序列化一些 JSON

    我对 JSON 非常陌生 我需要解析 API 提供的一些内容 谷歌快速搜索出现了JSON NET http james newtonking com pages json net aspx 所以我现在尝试使用它将此 JSON 解析为列表对象
  • 处理带有两个片段的操作栏

    我有一个包含两个片段的布局 两个片段都有自己的操作栏 每个操作栏都有自己的操作项和菜单 当我的应用程序处于横向模式并且两个片段都显示在屏幕上时 看起来框架正在选择在 右侧 或第二个片段 显示操作栏 这意味着左侧的片段 第一个片段 缺少其操作
  • Rails 和 Mysql 的毫秒数

    使用 Rails Mysql 时存储时间 以毫秒为单位 的最佳方式是什么 我将使用小数和composed of 以便能够将该值作为Ruby 时间进行操作 有人有更好的主意吗 自从提出这个问题以来 已经过去了好几年了 这是更新的解决方案 ht
  • 如何:SQL 还是 NOSQL?

    我还没有遇到过这个问题 但这就是我的想法 非常肤浅和简单化恕我直言 如果您有键值类型的存储 并且所有访问都是键查找 请使用 NOSQL 解决方案 如果您想要基于值 和子值 进行查找或者有一些更复杂的东西 例如联接 您会选择关系解决方案 事务
  • 改造中的 SocketTimeoutException

    我在尝试着POST向服务器请求获取数据但有时会发生SocketTimeoutException I used Ok3Client解决它 但我面临同样的异常 我该如何解决它 我的代码如下 public void getNormalLogin
  • 如何将 rubocop 与 Rake 集成?

    rubocop https github com bbatsov rubocop是 Ruby 的代码风格检查器 与 rubocop 类似的工具 Cane 可以与 Rake 集成 https github com square cane in
  • 让 hashchange 事件在所有浏览器(包括 IE7)中工作

    我有一些代码 由另一位开发人员编写 在 WordPress 内部进行 AJAX 页面加载 例如 没有页面重新加载 当您单击导航项时 AJAX 会刷新主要内容区域 我的问题是它在 IE7 中被破坏了 我不知道从哪里开始调试 最初的开场白是 v