在Chrome document.styleSheets上,当我添加样式表时不会更新

佛朗哥

显然,Chrome浏览器中的document.styleSheets属性存在问题。添加新样式表后,该属性不会更新。要重现该问题,只需运行以下代码:

    // Create the link element
    var element = document.createElement("link");
    element.setAttribute("rel", "stylesheet");
    element.setAttribute("type", "text/css");
    element.setAttribute("href", "external.css");

    // Add the link element
    console.log('Before add: ' + document.styleSheets.length);
    document.getElementsByTagName("head")[0].appendChild(link);
    console.log('After add: ' + document.styleSheets.length);

在FireFox中运行时,控制台将显示以下内容:

    Before add: 4
    After add: 5

在Chrome中运行时,控制台将显示以下内容:

    Before add: 4
    After add: 4

有趣的是,下面的代码在两种浏览器上都能正常工作(返回相同的结果):

    console.log('Before add: ' + document.getElementsByTagName("head")[0].children);
    document.getElementsByTagName("head")[0].appendChild(link);
    console.log('After add: ' + document.getElementsByTagName("head")[0].children);

这是一个错误还是我做错了什么?

我在编写和测试以下功能以将CSS文件动态添加到网页时发现了此问题:

function requiresCSS( name ) { 
    var sheets = document.styleSheets; 
    for (var i = 0; i < sheets.length; i++) { 
        if (sheets[i].href && sheets[i].href.indexOf(name) !== -1) { 
            return; 
        } 
    }

    var link = document.createElement("link"); 
    link.rel = "stylesheet";
    link.type = "text/css"; 
    link.href = name; 
    document.getElementsByTagName("head")[0].appendChild(link); 
}    

尝试两次添加CSS时,该功能在Firefox上可以完美运行,但在Chrome上无法运行。

TJ人群

您正在添加一个外部文件,然后立即对其进行检查。您不会看到它也就不足为奇了,HTTP请求可能仍然未完成。如果您稍后再回来查看,则HTTP请求完成并且解析并应用了样式后,您将在中看到它document.styleSheets

根据HTML5规范,您可以使用loadlink元素上事件来获取有关何时加载资源的通知。所以:

element.addEventListener("load", function() {
    console.log('After add: ' + document.styleSheets.length);
}, false);
console.log('Before add: ' + document.styleSheets.length);
document.getElementsByTagName("head")[0].appendChild(link);

当然,加载和解析/应用可能不是同时进行的,因此,如果仍然看到差异,则可能需要setTimeout在其中输入:

element.addEventListener("load", function() {
    setTimeout(function() {
        console.log('After add: ' + document.styleSheets.length);
    }, 0);
}, false);
console.log('Before add: ' + document.styleSheets.length);
document.getElementsByTagName("head")[0].appendChild(link);

重新执行您的函数,尝试避免两次添加样式表,因为即使没有输入,元素也确实存在document.styleSheets,所以我只需要查找该元素:

function requiresCSS( name ) { 
    // If we already have an element for this stylesheet, return
    if (document.querySelector('link[rel=stylesheet][href="' + name + '"]') {
        return;
    }

    // Add it
    var link = document.createElement("link"); link.rel = "stylesheet";
    link.type = "text/css"; link.href = name; 
    document.getElementsByTagName("head")[0].appendChild(link); 
}    

(您也可以使用querySelector用于发现head,这将会是多一点简洁。querySelector/querySelectorAll都支持所有现代浏览器,也IE8)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Chrome用户样式表

来自分类Dev

$(document).on(“ input”,“。SomeClass”)在Chrome上有效,但在IE上不行

来自分类Dev

使用鼠标滚轮滚动时Chrome闪烁,将div重新定位到$(document).scrollTop()

来自分类Dev

调用 document.getSelection() 时,Microsoft Edge 返回的值与 Chrome 不同

来自分类Dev

如何将链接样式表添加到document.write

来自分类Dev

document.cookie可在Chrome中解决

来自分类Dev

Chrome 中奇怪的 document.cookie 行为

来自分类Dev

我的样式表CSS不在控制台Chrome中显示行

来自分类Dev

Mac上的网站是否经过ssl认证(Chrome)?样式表不起作用

来自分类Dev

为什么此setInterval / document.write代码在Chrome上有效,但在Firefox上无效?

来自分类Dev

备用样式表在Chrome中不起作用

来自分类Dev

隐藏打印样式表(chrome)中的输入边框

来自分类Dev

在Chrome中覆盖/禁用用户样式表

来自分类Dev

在Chrome中重新加载脚本/样式表

来自分类Dev

Chrome:关闭用户代理样式表以获取透明背景

来自分类Dev

Gmail Chrome扩展程序和document.readyState

来自分类Dev

如何取消与chrome扩展名的document.ondblclick的绑定

来自分类Dev

$ {document).click()在chrome扩展中不起作用

来自分类Dev

Javascript document.domain:Chrome和Firefox返回不同

来自分类Dev

使用document.write()调用的Chrome阻止脚本-如何测试

来自分类Dev

chrome 扩展修改 document_start 中的 CSS

来自分类Dev

chrome 中 document.registerElement 的替代代码

来自分类Dev

document.write样式表if语句将始终为false

来自分类Dev

document.body.style.backgroundColor不适用于外部CSS样式表

来自分类Dev

如何在我的WordPress上添加新的样式表

来自分类Dev

防止文档样式表影响chrome扩展注入元素样式

来自分类Dev

防止文档样式表影响chrome扩展注入元素的样式

来自分类Dev

每当我在chrome中加载网站时,总是在代码中添加广告软件javascript

来自分类Dev

单独的Epslatex不会添加\ end {document}

Related 相关文章

  1. 1

    Chrome用户样式表

  2. 2

    $(document).on(“ input”,“。SomeClass”)在Chrome上有效,但在IE上不行

  3. 3

    使用鼠标滚轮滚动时Chrome闪烁,将div重新定位到$(document).scrollTop()

  4. 4

    调用 document.getSelection() 时,Microsoft Edge 返回的值与 Chrome 不同

  5. 5

    如何将链接样式表添加到document.write

  6. 6

    document.cookie可在Chrome中解决

  7. 7

    Chrome 中奇怪的 document.cookie 行为

  8. 8

    我的样式表CSS不在控制台Chrome中显示行

  9. 9

    Mac上的网站是否经过ssl认证(Chrome)?样式表不起作用

  10. 10

    为什么此setInterval / document.write代码在Chrome上有效,但在Firefox上无效?

  11. 11

    备用样式表在Chrome中不起作用

  12. 12

    隐藏打印样式表(chrome)中的输入边框

  13. 13

    在Chrome中覆盖/禁用用户样式表

  14. 14

    在Chrome中重新加载脚本/样式表

  15. 15

    Chrome:关闭用户代理样式表以获取透明背景

  16. 16

    Gmail Chrome扩展程序和document.readyState

  17. 17

    如何取消与chrome扩展名的document.ondblclick的绑定

  18. 18

    $ {document).click()在chrome扩展中不起作用

  19. 19

    Javascript document.domain:Chrome和Firefox返回不同

  20. 20

    使用document.write()调用的Chrome阻止脚本-如何测试

  21. 21

    chrome 扩展修改 document_start 中的 CSS

  22. 22

    chrome 中 document.registerElement 的替代代码

  23. 23

    document.write样式表if语句将始终为false

  24. 24

    document.body.style.backgroundColor不适用于外部CSS样式表

  25. 25

    如何在我的WordPress上添加新的样式表

  26. 26

    防止文档样式表影响chrome扩展注入元素样式

  27. 27

    防止文档样式表影响chrome扩展注入元素的样式

  28. 28

    每当我在chrome中加载网站时,总是在代码中添加广告软件javascript

  29. 29

    单独的Epslatex不会添加\ end {document}

热门标签

归档