backbone.js 如何动态设置base标签?

hec6srdp  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(151)

我们使用的是 Backbone.js 路由,mod_rewrite,requirejs。应用程序在一个文件夹中,而不是在web根目录中,因此需要对图像、css和js文件使用相对文件夹引用(如果我们可以使用绝对文件夹,那么这些文件将被加载)。
当访问一个带有斜杠的路由时,js和css文件都不能正确加载,除非在头文件中设置了一个合适的基本标记。

<base href="//localhost/myapp/" />

这个解决方案是可行的。问题是我们需要变量化base标签,这样我们就可以有开发和生产版本的代码。但是如果没有base标签,用变量加载一个js文件是行不通的。
为了确保我对 Backbone.js 做了标准的修复。修复可选的斜杠(/):

routes: {
  'faq(/)':'jumpToText',
  'register(/)':'jumpToForm',
},

并在历史上扎下根

Backbone.history.start({pushState: true, root: "//localhost/myapp/");

这个问题似乎是一个无法解决的mod_rewrite问题。所以最后的想法是动态地设置base标记。

hivapdat

hivapdat1#

我们最终使用JavaScript来解析location.href中的值。将此代码 Package 在头部的script标记中:

document.write("<base href="+'//'+document.location.host +'/'+ location.href.split('/')[3]+'/'+" />");

并在routes.js中执行相同的操作(解析出URI)

Backbone.history.start({pushState: true, root: "/"+location.href.split('/')[3]});
h43kikqp

h43kikqp2#

我必须考虑协议/主机/端口的一个有效解决方案如下

var base = document.createElement('base');
base.href = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');
document.getElementsByTagName('head')[0].appendChild(base);

这目前在包括IE11在内的所有主流浏览器中都能正常工作(IE11不支持window.location.origin)
我已经用它制作了一个npm包,如果有人感兴趣的话,它也支持在这个基本href的末尾添加后缀
https://www.npmjs.com/package/dynamic-base
https://github.com/codymikol/dynamic-base

相关问题