gpt4 book ai didi

javascript - 通过注释掉 CSS 属性,使用 JavaScript 切换样式属性

转载 作者:行者123 更新时间:2023-12-04 01:50:34 25 4
gpt4 key购买 nike

我想将属性列表发送到一个函数,该函数将暂时禁用(通过注释)这些属性。其目的类似于 Chrome 开发工具在检查元素样式时所完成的工作,不同之处在于用户不会选中/取消选中框,相反,该操作将由 JavaScript 执行。

function disableProperties(el, properties) {
var property; // property value pair
var cssStr = el.style.cssText.replace(/; /g, ";");

for (let i = 0; i < properties.length; i++) {
property = properties[i] + ": " + eval("el.style." + properties[i]) + ";";
cssStr = cssStr.replace(property, "/* " + property + " */");
}

el.setAttribute("style", cssStr);
}

function restoreProperties(el, properties) {
var outHtml = el.outerHTML;
var key = 'style="';
var idx1 = outHtml.indexOf(key) + key.length;
var idx2 = outHtml.indexOf('"', idx1);
var style = outHtml.substring(idx1, idx2);

for (let i = 0; i < properties.length; i++) {
str = "/* " + properties[i];
let a = style.indexOf(str);
let b = style.indexOf(" */", a + a.length) + 3;
let comment = style.substring(a, b);
let property = (comment).replace("/*", "").replace("*/", "");

style = style.replace(comment, property);
}

el.style.cssText = style;
}

当元素被创建时,它们的样式被嵌入到 HTML 而不是外部 CSS 文件中。重要的是这些属性只是暂时禁用;必须保留它们早期的值。

更新:我认为我的评论代码不起作用,因为我试图通过请求 el.style.cssText 来检索评论;然而,评论只能通过 outerHTML 获得。

下面的代码是有效的,但我确信它可以被清理。如果您对我如何改进此代码有任何建议,请提出建议。这是一个fiddle演示我如何使用代码的一个示例。

最佳答案

扩展 Volts 删除的答案,使用数据属性来存储元素的初始状态。然后您可以使用该信息来重置值。一个问题是 style 属性是 read only ,所以如果我们想重置所有样式属性,我们必须循环所有属性。

这比黑进黑出评论要干净得多。这适用于内联样式集和类。

const disableProperties = (el, properties) => {
//store the style so we can restore it

el.dataset.styles = JSON.stringify(el.style);
console.log(JSON.parse(el.dataset.styles));
properties.forEach(property => {
el.style[property] = "unset";
})
}

const enableProperties = (el, properties) => {
//Get our saved initial state
let styles = JSON.parse(el.dataset.styles);
console.log(styles);
properties.forEach(property => {
el.style[property] = styles[property];
})
}

const restoreAll = (el) => {
let styles = JSON.parse(el.dataset.styles);
console.log(styles);
/*You might think the following line should work, but the styles property is read only*/
/*el.style = styles;*/
/*So loop our properties instead*/
for(prop in styles){
if(styles.hasOwnProperty(prop)){
el.style[prop] = styles[prop];
}
}
}

document.querySelector('.child').addEventListener("click", function() {
disableProperties(this.parentNode, ["top", "left"])
})

let enableButtons = document.querySelectorAll(".enable");

for (var i = 0; i < enableButtons.length; i++) {
enableButtons[i].addEventListener("click", function(event) {
let property = this.dataset.restore;
let target = document.querySelector(this.dataset.target);
enableProperties(target, property.split(","));
});
}

document.getElementById("restoreAll").addEventListener("click", function() {
restoreAll(document.querySelector(".parent"));
});
.parent {
/*top: 50px;*/
left: 50px;
position: absolute;
}

.child {
background: red;
width: 50px;
height: 50px;
}

.container {position:relative; height:200px;}
Click the square before restoring

<div class="container">
<div class="parent" style="top:50px;">
<div class="child">
</div>
</div>
</div>
<button id="restoreLeft" class="enable" data-restore="left" data-target=".parent">Restore Left</button>
<button id="restoreTop" class="enable" data-restore="top" data-target=".parent">Restore top</button>
<button id="restoreAll">RestoreAll</button>

关于javascript - 通过注释掉 CSS 属性,使用 JavaScript 切换样式属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60232107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com