我想用js / jquery获得:hover多个元素的css,我已经有了工作功能,但是我得到了这个错误:

SecurityError: The operation is insecure.
ruleList = sheetList[i].cssRules;


功能:

function getStyleBySelector(selector){
    var sheetList = document.styleSheets;
    var ruleList;
    var i, j;
    for (i=sheetList.length-1; i >= 0; i--){
        ruleList = sheetList[i].cssRules;
        for (j=0; j<ruleList.length; j++){
            if (ruleList[j].type == CSSRule.STYLE_RULE && ruleList[j].selectorText == selector){
                return ruleList[j].style;
            }
        }
    }
    return null;
}
getStyleBySelector('#desc a:hover').background


我知道这是一个CORS问题,因为我是从另一个域+ Google字体导入CSS的,但是我在.htaccess中有此问题

Access-Control-Allow-Origin "*"


这更多是一个Firefox错误。请帮忙吗?

最佳答案

有三种方法可以解决此问题:

1)不要使用原始的CSS规则,而是查询DOM:

var $selector = document.querySelector('#desc a:hover');
var computedStyle;
var background = [];

// Read value of background and write into background array
for (var i = 0; i < $selector.length; i++) {
    computedStyle = window.getComputedStyle($selector[i], null);
    background.push(computedStyle.getPropertyValue('background'));
}


2)排除外部样式表:
这不包括外部样式表,因此您不会遇到安全问题(但随后会错过外部样式表的匹配选择器)

var getCSSHost = function (href) {
    var fakeLinkOfSheet = document.createElement('a');

    fakeLinkOfSheet.href = href;
    return fakeLinkOfSheet.host;
};

var sheetHost = getCSSHost(stylesheet.href);

if ((sheetHost !== window.location.host)) {
    return; //exit early, i.e. return false
}
// else go on


3)代理外部资源
正如John在他的答案中建议的那样,您还可以将外部资源代理到同一服务器和端口以使其正常工作。这是一项巨大的工作,如果只有其他方法无效,您应该考虑一下。

关于javascript - 如何使用javascript和CORS获取element:hover背景,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29076242/

10-13 03:39