5

大家好,

现在是我第四次尝试在 Rails 应用程序中实现 history.js。我有一种方法运行得很好,但是代码太丑了。今天我再次查看代码并想:我怎样才能使它更好,更容易,更干?!

到目前为止我所做的(并且工作得很好,并不完美):

  • 设置remote: true为我的链接
  • jquery-ujs 获取js.erb

我的 HTML 看起来像:

<body>
  <div id="content">
    some content with buttons, etc.
  </div>
</body>

js.erb包含:

History.pushState(
  {
    func: '$(\'#content\').html(data);',
    data: '<%= j(render template: "news/index", formats: [:html]) %>'
  },
  'test title',
  '<%= request.url %>'
);

然后 history.js 获取该函数并为其提供数据。所以它将content-div 替换为新生成的代码。它还会更新 URL。这段代码我必须放在每个(!)js.erb文件中。

我最后想让它不那么难看的想法是:

  • 设置remote: true为我的链接
  • 当一个链接被点击时,它会获取一些js.erb替换content-div
  • 所有链接data-remote="true"都将获得一个ajax:success-handler
  • ajax:success新 URL 上被推送到 history.js

但是里面还有一个问题。然后我有 JavaScript 代码:

$(document).on('ajax:success', 'a[data-remote="true"]', function() { ... });

问题是:ajax:success如果我替换div链接(应该触发事件)所在的 -tag,则永远不会触发。

也许有人可以解决我的问题...

或者,还有更好的方法?

4

4 回答 4

2

我只用jquery-ujs和pushState,popState。

在这里查看我的答案:

https://stackoverflow.com/a/27532946/345996

于 2014-12-17T19:08:44.400 回答
0

关于什么:

History.Adapter.bind(window, 'statechange', function() {
    var state = History.getState();
    ...
});
于 2013-08-07T14:25:50.393 回答
0

我使用beforeSend事件作为所有数据远程的全局侦听器来更改浏览器的历史记录。我更喜欢 beforeSend 因为我希望链接在单击后立即更改,而不管 ajax 请求的结果如何...

$(document).bind('ajax:beforeSend', function(event,data){
    history.pushState(null, '', event.target.href)
});

这解决了您的问题,因为在对 DOM 进行任何修改之前触发了该事件。

于 2013-09-10T22:40:00.380 回答
-2

你试过涡轮链接吗?这将是 Rails 4 中的默认设置。

于 2013-06-16T10:27:56.067 回答