2012-04-10 50 views
5

大家好,

现在我第四次尝试在Rails应用中实现history.js。我有一种方法运行得很好,但代码太难看了。今天我又看了一遍代码并思考:我怎样才能让这个更好,更容易,更干??如何以正确的方式在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处理程序
  • ajax:success新的URL被推送到history.js

但内部仍然存在一个问题。然后,我有JavaScript代码:

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

的问题是:ajax:success永远不会触发如果我更换div -tag其中链路(即应触发事件)是

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

或者还有更好的方法吗?

+0

你见过jquery.pjax? – 2012-04-10 21:33:54

+0

我已经看了很多次histoy.js页面,但从未尝试过尝试实际尝试它。我很想看到这个问题以一种明确的方式回答。 – Ashitaka 2012-04-10 21:48:30

+0

PJAX仅适用于HTML5。 HTML4浏览器只是得到正常的链接...随着history.js我们也得到AJAX的HTML4浏览器 – 2012-04-11 05:07:48

回答

0

默认什么:

History.Adapter.bind(window, 'statechange', function() { 
    var state = History.getState(); 
    ... 
}); 
0

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

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

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

相关问题