iOS上的历史API是否被破坏?(位置栏不会在pushState上更新)

Ara*_*kan 34 html5 browser-history ios pushstate

在我不能相信没有人注意到此之前或者我必须要丢失某些类别的情况下提交这个:

看来如果你window.history.pushState在iOS上做一个简单的操作,位置栏就不会更新,除非它是对用户手势的响应.状态本身确实被推动(正如您可以通过按下后退按钮按钮看到的那样).

这是我可以想出的最小的测试用例重新创建问题:

http://thelink.is/history-api-ios-bug

在支持History API的桌面浏览器上,您应该会看到位置栏中的URL每秒更改为/ 0,/ 1等.在iOS上 - 使用iPhone(运行iOS 4.3)和iPad(运行iOS 4.3.3)进行测试 - 位置栏不会更新,但是按下后退按钮会显示正确的先前位置(自测试案例开始就是404)没有后端逻辑来处理这些URL).

思考?解决方法?一个哭泣和拥抱的肩膀?

更新:此问题已在iOS 5中修复.

Rem*_*arp 22

因此,底线是iOS在历史API中添加了自己的安全性,这意味着您无法使用脚本来更改URL.只有用户操作可以允许历史API更改网址 - 即点击 - 根据Aral的示例.

解决方法是在URL上使用散列(aka片段标识符).

而不是history.pushState我们只是改变位置:

var i = 0;
var locationUpdateInterval = setInterval(function(){
  window.location.hash = i;
  i++;
}, 1000);   
Run Code Online (Sandbox Code Playgroud)

要么在某些内容更改iOS应用中的该位置时,或者如果它们固定在应用中的特定页面/面板上,请捕获该事件:

// named function on purpose for later
function hashchange() {
  var pageId = location.hash.substr(1); // drop the # symbol
  // do something with pageId
}

window.onhashchange = hashchange;

// onload - if there's a hash on the url, try to do something with it
if (location.hash) hashchange();
Run Code Online (Sandbox Code Playgroud)

我们不能在iOS上使用pushState/ popState,这是非常差的,但它的安全性与无法触发全屏视频相同,除非用户启动操作,这与在iOS上下载视频或音频内容相同 - 你可以'编写脚本,用户必须以某种方式启动它(不知何故).

正如关于Android的说明 - 问题非常相似,所以这(应该)也可以作为Android的解决方法.

如果你想要桌面支持,大多数浏览器支持,onhashchange但是,你猜对了,IE缺乏 - 所以你可以填充那个坏男孩(虽然需要jQuery ......):http://benalman.com/projects/jquery- hashchange-插件/

希望有所帮助.

  • Remy,我没有得到的一件事:你_can_通过脚本将URL推送到历史堆栈(如果你点击后退按钮就在那里),它只是不更新​​位置栏中显示的地址.我仍然觉得这是一个错误,而不是一个功能. (3认同)