JavaScript的getComputedStyle过滤无用样式
爬别人的网站想要获取指定元素的css样式,但是从css文件里找或者浏览器f12复制,几千行的css,太麻烦了。然后getComputedStyle()会获取一堆默认样式,我就过滤了一下,虽然还有重复的,但是比之前的好很多了,至于优先级,暂时不知道怎么确定。下面贴代码,有大佬有别的思路可以戳我
/**驼峰转标准 */
function toLowerLine(str) {
var temp = str.replace(/[A-Z]/g, function (match) {
return "-" + match.toLowerCase();
});
if(temp.slice(0,6) === 'webkit'){
temp = '-'+temp;
}
return temp;
}
function filterObj(currObj,initObj,style){
let currEleArr = Object.keys(currObj)
let newObj = {}
let temp
for(let i = 1;i<currEleArr.length;i++){
if(currObj[currEleArr[i]] !== initObj[currEleArr[i]]){
/**大写转小写 */
temp = toLowerLine(currEleArr[i])
Object.defineProperty(newObj,temp,{value: currObj[currEleArr[i]],configurable: true})
}
}
/**包装行内标签 */
let i = 0
while(true){
if(!style[i] || i>99999)break
delete newObj[style[i]]
i++
}
newObj.inlineStyle = style.cssText
return newObj
}
function getStyle(ele,pseudoEle) {
/**element不为空 */
if (!ele) return
/**jQuery对象转为DOM对象 */
if ((typeof jQuery != 'undefined') && (ele instanceof jQuery)) {
ele = ele[0]
}
/**获取伪类样式 */
if(pseudoEle){
console.log("伪类样式暂不支持");
return
}
/**创建空标签并渲染到页面 */
const initTag = document.createElement(ele.tagName)
document.body.appendChild(initTag)
/**获取两标签样式 */
const initTagStyle = getComputedStyle(initTag)
const currEleStyle = getComputedStyle(ele)
/**获取行内样式*/
const currEleInline = ele.style
/**过滤无用标签和行内标签并重新合并 */
const styles = filterObj(currEleStyle,initTagStyle,currEleInline)
return styles
}
直接调用:getStyle( DOM对象/jQuery对象 )