我有一些代码(由另一位开发人员编写)正在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
attachEvent
要求事件以on
为前缀- 该方法有不同的大写字母。将
attachEvent
中的hashchange
更改为hashChange
以使事件在IE8中工作 - 使用建议的实现来支持IE7-和其他旧浏览器的
hashchange
实现
我创建了一个跨浏览器实现,它将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
和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);});
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/