现在是我第四次尝试在Rails应用程序中实现history.js。我有一种方法运行得很好,但代码是如此丑陋。今天我再次查看代码并思考:如何让这更好,更容易,更干??
remote: true
设为我的链接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
上,新网址会被推送到history.js 但内部仍有一个问题。然后我有JavaScript代码:
$(document).on('ajax:success', 'a[data-remote="true"]', function() { ... });
问题是:ajax:success
如果我替换链接(应触发事件)所在的div
标记,则永远不会触发。
也许有人可以解决我的问题......
答案 0 :(得分:2)
答案 1 :(得分:0)
怎么样:
History.Adapter.bind(window, 'statechange', function() {
var state = History.getState();
...
});
答案 2 :(得分:0)
我正在使用 beforeSend 事件作为所有数据远程的全局侦听器来更改处理浏览器的历史记录。 我更喜欢beforeSend,因为我希望链接在点击后立即更改,无论ajax请求的结果如何......
$(document).bind('ajax:beforeSend', function(event,data){
history.pushState(null, '', event.target.href)
});
这解决了您的问题,因为在完成对DOM的任何修改之前触发了事件。
答案 3 :(得分:-2)
你试过turbolinks吗? 它将是Rails 4中的默认值。