这个问题与之前的帖子有关:检查用户是否使用位于中国的浏览器
我正在加载一个外部 js 库来评估我想在我的标题中加载哪个 css。按照上述帖子的接受答案,我在我的 HTML 头中加载了 userinfo.io API,然后对接收到的数据进行评估。这是我所做的:
<head>
...
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/userinfo/1.0.0/userinfo.min.js"></script>
<script type="text/javascript">
UserInfo.getInfo(function(data) {
// the "data" object contains the info
if (data.country.code == 'CN') {
// Load fallback fonts
document.write('<link href="http://fonts.useso.com/css?family=Source+Sans+Pro:200,400,700|Dancing+Script:400,700|PT+Serif|Open+Sans:400,300,700" rel="stylesheet" type="text/css">');
} else {
// Load google fonts
document.write('<link href="http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400,700|Dancing+Script:400,700|PT+Serif|Open+Sans:400,300,700" rel="stylesheet" type="text/css">');
}
}, function(err) {
// the "err" object contains useful information in case of an error
});
</script>
</head>
在Firefox中调试js,可以看到库被成功加载。首先发生的是,我收到一条错误消息“参考错误:未定义用户信息”。我在我的 html 头中对行的顺序进行了一些操作(当然还有一些 css 包含,一些元标记和标题)。放好后
<head>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/userinfo/1.0.0/userinfo.min.js"></script>
...
<script type="text/javascript">
UserInfo.getInfo(function(data) {
// the "data" object contains the info
if (data.country.code == 'CN') {
// Load fallback fonts
document.write('<link href="http://fonts.useso.com/css?family=Source+Sans+Pro:200,400,700|Dancing+Script:400,700|PT+Serif|Open+Sans:400,300,700" rel="stylesheet" type="text/css">');
} else {
// Load google fonts
document.write('<link href="http://fonts.googleapis.com/css?family=Source+Sans+Pro:200,400,700|Dancing+Script:400,700|PT+Serif|Open+Sans:400,300,700" rel="stylesheet" type="text/css">');
}
}, function(err) {
// the "err" object contains useful information in case of an error
});
</script>
</head>
作为 head 标签内的第一行,它开始真正识别对象UserInfo
及其方法getInfo()
。同时,当我将行放回其原始位置时(例如在第一个代码片段中),它也可以识别该功能。这种行为不知何故让我想知道在加载 html 页面时如何在 head 标记中执行 javascript。是否有可能在加载库之前偶尔调用该方法?
无论如何,现在当它成功导入 userinfo.io 库时,该站点不再正确加载。看看我看到的浏览器控制台:
查看我页面的源代码,我只看到正确加载的链接标签,但页面的其余部分丢失了。
所以这就是我的假设:
我不能document.write()
在 head 标签中使用,因为它会干扰页面加载。getElementById()
更有可能我应该在页面成功加载后访问和修改链接标签。所以我实际上会用 jQuery 的ready()
函数来触发它,以确保库已成功加载?我将不胜感激对这些想法的任何评论。