【发布时间】:2014-06-24 12:46:52
【问题描述】:
我正在使用 history.js 来支持 IE。但是 History.pushState 在 URL 中附加了额外的#data。如何解决这个问题?
Chrome 网址
http://localhost/shop/contracts-and-deals/mobile-phones?&_dyncharset=ISO-8859-1&_dynSessConf=8052455241245685514&planItemSkuId=&device=phones&contractType=onAccount&_D%3AcontractType=+&manufactureFilter=800005&_D%3AmanufactureFilter=+&_DARGS=%2Fshop%2FmobilePhones%2Fphones%2Ffilters%2FphonesLeftPanel.jsp&_dyncharset=ISO-8859-1&_dynSessConf=8052455241245685514&_D%3AsortFilter=+&sortFilter=most_popular&sort-view=grid&_DARGS=%2Fshop%2FmobilePhones%2Fphones%2Ffilters%2FdeviceTopFilter.jsp
Internet Explorer 网址
http://localhost/shop/contracts-and-deals/mobile-phones#mobile-phones?&_dyncharset=ISO-8859-1&_dynSessConf=8052455241245685514&planItemSkuId=&device=phones&contractType=onAccount&_D%3AcontractType=+&manufactureFilter=800005&_D%3AmanufactureFilter=+&_DARGS=/shop/mobilePhones/phones/filters/phonesLeftPanel.jsp&_dyncharset=ISO-8859-1&_dynSessConf=8052455241245685514&_D%3AsortFilter=+&sortFilter=most_popular&sort-view=grid&_DARGS=/shop/mobilePhones/phones/filters/deviceTopFilter.jsp
在 Internet Explorer 中使用 History.pushState 后附加了额外的 #mobile-phones。
我试过下面的代码。
var url = window.location.pathname;
var urlparts = url.split('/');
var currentState = urlparts[urlparts.length-1];
if(f && f != 'undefined' && f.hasClass('filterParams')) {
var atgPrefix = "_D%3A";
var totalParams = b.data;
var arrayOfParams = totalParams.split("&");
var paramSize = arrayOfParams.length;
for(var i = 0; i < paramSize;i++){
if(arrayOfParams[i].indexOf(atgPrefix) != -1) {
var inputField = arrayOfParams[i].substring(arrayOfParams[i].indexOf(atgPrefix)+atgPrefix.length).split("=")[0];
if(totalParams.indexOf("&"+inputField) == -1) {
totalParams = totalParams.replace(arrayOfParams[i]+"&",'');
} else {
var atgHiddenFields = totalParams.match(new RegExp(arrayOfParams[i], 'g'));
var size = atgHiddenFields.length-1;
for(var j = 0;j < size;j++) {
totalParams = totalParams.replace(arrayOfParams[i]+"&",'');
}
}
}
}
b.data = totalParams;
}
if(!($(a).closest('form').is('#colorPicker'))){
if ( document.location.protocol === 'file:' ) {
alert('The HTML5 History API (and thus History.js) do not work on files, please upload it to a server.');
}
var History = window.History, // Note: We are using a capital H instead of a lower h
State = History.getState(),
$log = $('#log');
// Log Initial State
History.log('initial:', State.data, State.title, State.url);
// Bind to State Change
History.Adapter.bind(window,'statechange',function(){ // Note: We are using statechange instead of popstate
// Log the State
var State = History.getState(); // Note: We are using History.getState() instead of event.state
History.log('statechange:', State.data, State.title, State.url);
});
History.pushState(b.data, document.title, currentState+"?"+b.data);
}
我也尝试过Using history.pushstate in IE9,但没有成功。
【问题讨论】:
-
我不认为你可以。 IE9 不支持历史 API。这就是图书馆使用 hashchange 事件来模拟它的原因。
-
我知道 IE9 不支持 history API,这就是我尝试使用 history.js 的原因
-
这又使用 hashchange 事件来模拟历史 API,从而不可避免地更改 location.hash。
-
这里有同样的问题。我也在寻找解决方案。
-
您的 URL 已经如此庞大 - 为什么还要额外添加标签?
标签: javascript jquery internet-explorer history.js