【问题标题】:How to prevent rendering css when loading stylesheet from local storage?从本地存储加载样式表时如何防止呈现css?
【发布时间】: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


【解决方案1】:

很抱歉在这里写,因为我没有足够的代表发表评论我在这里写下来。

我只是想知道您为什么要从本地存储中加载样式表。我们已经有一个浏览器缓存。那么使用本地存储的好处/目的是什么?

我只是好奇。

【讨论】:

  • 好问题!老实说,我没有给你一个好的答案。浏览器缓存是有限的(~12MB),如果用户频繁使用浏览器,缓存将被覆盖。也有很多人经常清除缓存。我猜本地存储会持续更长时间。对我来说,这只是一个性能实验。因为它涉及一个很少更改但可能会经常调用的大型 javascript 文件和大型 css 文件(嵌入 base64 图像)。
  • 哦...我明白了..如果它嵌入 base64 图像,使用本地存储是首选方法。好的,谢谢。!!
【解决方案2】:

你叫这个

$('<style>').attr('id', 'my_style').text(res).prependTo('#my_div');   

在存储之前。因此,一旦您通过 ajax 获取它,它就在文档上,然后在其他代码上您只需再次放置它。

【讨论】:

  • 谢谢!但不是。很抱歉对于这个误会。但我把支票忘了。只有当文件不在本地存储中时才会调用 load_css。从本地存储中检索 css 时,永远不会触发 load css 函数。不是这个,我已经查过了。 CSS 在调用 JSON.parse() 时渲染,另外一次在创建样式标签时渲染。
  • 我认为问题出在另一个地方。如果我对此进行一些简化版本,则解析 json 不会应用 css。无论如何,为什么要使用 JSON?字符串只是css代码对吗?如果它是一个对象,这是行不通的。
  • 是的,同时我也尝试将其存储为未字符串化。它可以工作,但仍然渲染 CSS 两次...
  • css 什么时候先渲染?把中断点放在地方,看看它什么时候发生。如果不stringify就代表不调用Json.parse,那么文档中第一个css插入到哪里了?
  • 非常感谢您的提示。问题解决了。最后,这真是一件愚蠢的事情。我使用了旧版本的模板,因为合并出错并且没有看到在 jsp 模板中存在旧的内联资源嵌入。 jsp 行创建了一个内联样式标签,我负责监督它。没有断点,我看不到它......嗯,有时它就是这么愚蠢:D
猜你喜欢
  • 2011-09-10
  • 2018-04-18
  • 2014-10-15
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多