我想出了这个巧妙的解决方案。您首先在全局范围内为您的活页夹创建一个命名空间:
// Binder for PJAX init functions
$.fn.bindPJAX = {}; // Create namespace
function bindPJAX(functionName) {
// Check function existence, then call it
return $().bindPJAX[functionName] && $().bindPJAX[functionName]();
}
然后将回调绑定到 PJAX 点击:
$(document).ready(function(){
if ($.support.pjax) {
$('a[data-pjax]').on('click', function(event) {
var container = '#main';
var emptyRoute = 'feed'; // The function that will be called on domain's root
// Store current href without domain
var link = event.currentTarget.href.replace(/^.*\/\/[^\/]+\//, '');
var target = link === "" ? emptyRoute : link;
// Bind href-specific asynchronous initialization
$(document).on('ready pjax:success', container, function() {
bindPJAX(target); // Call initializers
$(document).off('ready pjax:success', container); // Unbind initialization
});
// PJAX-load the new content
$.pjax.click(event, {container: $(container)});
})
}
});
设置完成后,您可以继续扩展$.fn.bindPJAX
对象以添加与您的路由名称匹配的功能。例如,在http://www.yourdomain.com/admin
通过 PJAX 访问时,将在全局范围内调用 this:
$.extend($.fn.bindPJAX, {
admin: function(){
// Initialization script for /admin route
}
});
当 PJAX 失败或不受支持时,您还应该考虑可行的 DRY 回退,例如通过签window.location
入 javascript 在第一个页面加载时启动正确的 init 函数,或者在应用程序的视图中对其进行硬编码。