17

我有一些代码(由另一位开发人员编写)在 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

4

2 回答 2

31
  • attachEvent要求事件以 . 为前缀on
  • 您对该方法有不同的大小写。更改hashchangeattachEventhashChange事件在 IE8 中工作。
  • 使用建议的实现来支持hashchangeIE7 和其他旧浏览器的实现。

我已经创建了一个跨浏览器的实现,它将这个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处理程序,请使用以下方法。
它定义了两个函数,addHashChangeremoveHashChange。两种方法都将函数作为参数。

(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);});
于 2012-02-18T09:06:11.130 回答
3

attachEvent有两个参数:

bSuccess = object.attachEvent(sEvent, fpNotify)

[并且是 IE9 以下的所有 IE 版本都需要的!:( 见MDN 参考 ]

这可以工作:

if(window.addEventListener) {
    window.addEventListener("hashchange", hashChange, false);
}
else if (window.attachEvent) {
    window.attachEvent("onhashchange", hashchange);//SEE HERE...
    //missed the on. Fixed thanks to @Robs answer.
}

当然,如果可能的话,您应该只使用 JQuery,因为它为您封装了所有这些。

和往常一样有一个插件:http: //benalman.com/projects/jquery-hashchange-plugin/

于 2012-02-18T09:01:07.520 回答