草庐IT

javascript - Backbone.js 路由器和 Internet Explorer 重定向问题

coder 2024-05-11 原文

有点奇怪,我有点困惑......

我有一个页面,该页面上有以下内容(好吧,有一些名称更改):

$(document).ready(function() {
  var router = new App.Routers.ExampleRouter();
  Backbone.history.start({pushState: true});
})

路由器继续实例化一些集合、 View 等。在 Chrome、Safari、Firefox 和 Opera 中一切正常。但不是在 IE 8 或 9(也可能是 10,我还没有测试过)。

在 IE8 或 9 中,当第一次请求页面时,它开始加载,但是一旦文档准备好(因此路由器实例化并启动历史记录),页面就会重定向到站点根目录。

在重定向之前,我在控制台中看不到任何内容。其他任何地方都没有任何代码可以以某种方式做到这一点 - 我的意思是,我们有一个庞大的代码库,所以它总是有可能的,但是没有任何处理路由或历史 API 的东西可能会发生冲突。

奇怪的部分是,如果 pushState: true 选项被删除,页面不会重定向,它应该完全加载 - 路由器不会继续做任何事情,因为它现在期待 hashbang 风格的路由,但它至少没有不要把你踢回网站的根。重新添加该选项,它再次中断...

所以,我的第一个想法显然是“嗯……IE8 或 9 不支持历史 API……一定是这样”但是 Backbone.js 应该恢复到那些旧浏览器的 hashbang 样式的 URL,所以不可能是那样。

在处理 Backbone.js 路由器时,到底是什么导致 IE 重定向回主页?

编辑

(现在可能可以忽略以下内容,因为 EDIT 2 证明它什么也没做,尽管删除尾随逗号是可以的)

好的,经过一些调试并真正捕获稻草,我发现路由器实际上并没有被实例化 - 没有调用初始化方法,没有能力在路由器上调用自定义方法(我刚刚对 alert 做了一个愚蠢的方法和 console.log ) 并在 var router = new App.Routers.ExampleRouter(); 之后调用它。

调用该方法会返回如下错误:“对象不支持该属性或方法”(所有这些都只是 IE,在其他浏览器中也可以)。但这并不是路由器独有的,我也调用了一个新模型并做了同样的事情,同样的事情......只是没有被“看到”。对象错误的 Google 建议使用尾随逗号。代码库中确实有一些,我删除了所有这些,看起来事情进展顺利。突然之间,路由器(和模型)非常多 - 调用了初始化方法,调用了自定义方法等。我认为逗号可能已经停止了所有正在解析的 JS(我们连接了多个文件)。

我显然是在删除 pushState 选项的情况下完成所有这些操作的。然后我重新添加了 pushState: true 真正地认为可以解决上面发生的事情。我当时想“啊,路由器实际上从未‘存在’,所以也许 Backbone.History.Start({pushState: true}) 被调用发送它寻找路由,由于路由器没有被实例化,所以不存在,并且回扣到主页只是某种副作用”但唉,不,完全相同的事情仍在发生。添加 pushState: true 选项,页面不会加载,并将您踢回主页。

编辑 2

好的,所以我尝试了一些进一步的事情,但无济于事。我制作了一个完全独立的空白页面,它通过 CDN 引入 jQuery、Backbone.js 和 Underscore.js,并包含一些用于创建路由器、实例化它并调用 Backbone.History.Start() 的准系统 JavaScript。该页面的完整代码是:
<!DOCTYPE html>
<html>
  <head>
    <title>Test IE</title>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.0/jquery-1.8.0.min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js"></script>
    <script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js"></script>
    <script>
      $(document).ready(function(){

        App = {
          Routers: {

          }
        };

        App.Routers.RouterTest = Backbone.Router.extend({
          routes: {
            "ietest.html" : "helloWorld"
          },

          initialize: function() {
            console.log("router init");
          },

          helloWorld: function() {
            alert("helloWorld!")
          }
        });
        router = new App.Routers.RouterTest();
        Backbone.history.start({pushState: true});
      });
    </script>

  </head>
  <body>

  </body>
</html>

就是这样,完全准系统,不受任何其他站点 Assets 等的影响。完全相同的事情仍然发生。所有浏览器都按预期执行,除了 IE(在 8 和 9 上测试),它再次开始加载页面,然后执行路由并突然重定向回主页。如果我关闭 pushState 并使用 hashbangs,一切都会按预期工作 - 所以路由在 IE 中对我来说“有效”,只是在 pushState 设置为 true 时不行。

我看不出这是一个前端的东西,因为我已经尽可能地剥离了一切?有没有办法这是与服务器相关的事情?后端是 Ruby on Rails,问题出现在本地和临时/实时服务器上。还是我严重误解了 Backbone.js 使用 IE 将 pushState 降级为 hashbangs 的方式?

编辑 3

我有 uploaded a video of the problem

最佳答案

Internet Explorer 直到 IE 10 才支持 pushState,请参阅

http://caniuse.com/#search=pushState

编辑:

要使用可选的 pushState 启动 History,您可以使用以下命令:

Backbone.history.start({pushState: "pushState" in window.history});

关于javascript - Backbone.js 路由器和 Internet Explorer 重定向问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12062056/

有关javascript - Backbone.js 路由器和 Internet Explorer 重定向问题的更多相关文章

  1. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  2. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  3. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  4. ruby - 将 spawn() 的标准输出/标准错误重定向到 Ruby 中的字符串 - 2

    我想使用spawn(针对多个并发子进程)在Ruby中执行一个外部进程,并将标准输出或标准错误收集到一个字符串中,其方式类似于使用Python的子进程Popen.communicate()可以完成的操作。我尝试将:out/:err重定向到一个新的StringIO对象,但这会生成一个ArgumentError,并且临时重新定义$stdxxx会混淆子进程的输出。 最佳答案 如果你不喜欢popen,这是我的方法:r,w=IO.pipepid=Process.spawn(command,:out=>w,:err=>[:child,:out])

  5. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  6. ruby-on-rails - 如何在 Rails 中设置路由的默认格式? - 2

    路由有如下代码:resources:orders,only:[:create],defaults:{format:'json'}resources:users,only:[:create,:update],defaults:{format:'json'}resources:delivery_types,only:[:index],defaults:{format:'json'}resources:time_corrections,only:[:index],defaults:{format:'json'}是否可以使用1个字符串为所有资源设置默认格式,每行不带“默认值”散列?谢谢。

  7. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

  8. ruby - cucumber 的路由问题 - 2

    我正在使用rails3和cucumber,除了这个小问题,一切都很顺利GivenIamonthe"editautomobile"pageNoroutematches{:controller=>"automobiles",:action=>"edit"}(ActionController::RoutingError)现在路径在paths.rb中设置为edit_automobile_path在routes.rb中我有汽车作为资源,我搭建了它所以请告诉我我遗漏了什么,清楚地定义了路线并且匹配,因为我运行了rake路线并看到了路线。请指出正确的方向 最佳答案

  9. ruby - Rails 路由 : Giving default values for path helpers - 2

    有什么方法可以为url/path助手提供默认值吗?我有一个可选范围环绕我的所有路线:#config/routes.rbFoo::Application.routes.drawdoscope"(:current_brand)",:constraints=>{:current_brand=>/(foo)|(bar)/}do#...allotherroutesgohereendend我希望用户能够使用这些URL访问网站:/foo/some-place/bar/some-place/some-place为了方便起见,我在我的ApplicationController中设置了一个@current

  10. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

随机推荐