【发布时间】:2017-03-11 06:17:28
【问题描述】:
以下问题 - 我在本地存储中存储了一个样式表。但是当我尝试从那里加载它时,我使用JSON.parse() 并且似乎浏览器已经呈现了 CSS。但我更希望浏览器将解析后的 CSS 视为文本,然后将文本附加到样式标签。
守则:
从服务器加载样式表并将其存储在本地存储中
function load_css(url){
$.ajax({
url: url,
cache: false,
dataType: 'text',
success: function(res){
$('<style>').attr('id', 'my_style').text(res).prependTo('#my_div');
if (typeof(Storage) !== "undefined" && typeof localStorage !== "undefined" && localStorage !== null && typeof localStorage.setItem === 'function') {
localStorage.setItem("my_style", JSON.stringify(res));
}
},
error: function(err){
console.log(err);
}
});
}
在另一个函数中,如果设置了样式,则应从本地存储加载:
try{
if (typeof(Storage) !== "undefined" && typeof localStorage !== "undefined" && localStorage !== null && localStorage.getItem("my_style") !== null) {
var css = JSON.parse(localStorage.getItem('my_style'));
$('<style>').attr('id', 'my_style').text(css).prependTo('#my_div');
... //load style from server if local storage not available, item not found
即使我省略了创建样式标签的行,css 也会被渲染。通过这一行,我看到如果我检查一个元素,元素样式会在开发人员工具栏中出现两次。那么如何防止浏览器在使用JSON.parse() 时呈现样式。也许还有另一种方法可以将本地存储中的样式视为纯文本?
【问题讨论】:
-
样式在在文档之前不应该呈现。我怀疑
prependTo('#my_div')可能会在 HTML 中插入样式标签?在那种情况下,这就是使它们呈现的原因。或者,它可能是来自 jQuery 的一些幕后魔法,在这种情况下,您将不得不在没有它的情况下处理您的样式。也许使用documentFragment? -
感谢您的评论。但正如我所说 - 即使删除了创建样式标签的行,CSS 也会被渲染。我认为在 JSON.parse 之后浏览器会识别出它是 CSS 并呈现它。但我需要使用 JSON.parse 否则它只是字符串化的废话,我无法在任何地方添加;)
-
你能显示组成“my_style”的文本吗?
-
你的意思是CSS文件的内容吗?写在这里太长了。但是,如果您的意思是创建样式标记的行,它是上面的行: $('
标签: javascript jquery css json local-storage