如何将样式 属性 作为路由存储在变量中?

How to store a style property in a variable as the route?

我无法将元素的样式存储在变量中并将其用作路由:

let store = element.style.height;

store = 100px;

我试图通过创建一个限制输入最大值的常量来减少我的代码,如下所示:

const limitMaxVal = (whatToLimit, whatToStyle) => {
    let maxVal = parseFloat(whatToLimit.max);
    let minVal = parseFloat(whatToLimit.min);

    if (whatToLimit.value >= maxVal) {
        whatToLimit.value = maxVal;
        whatToStyle = maxVal / 10 + "%";
    } else if (whatToLimit.value <= minVal) {
        whatToStyle = minVal / 10 + "%";
    } else {
        whatToStyle = whatToLimit.value / 10 + "%";
    }
}

常量有两个变量。 whatToLimit 是我限制的输入,whatToStyle 是输入的样式。在这种情况下,我正在设计 canvas 的高度,但我想对宽度、背景颜色使用相同的常量……这让我想到了我的问题:我找不到存储的方法元素的样式作为路由。如果我像下面这样存储它,我将获得高度值:

inputHeight.oninput = function() {
    limitMaxVal(this, canvas.style.height);
};

另一个使用相同常量的例子是:

inputWidth.oninput = function() {
    limitMaxVal(this, canvas.style.width);
};

我也试过使用 eval() 但它也不起作用:

const limitMaxVal = (whatToLimit, whatToStyle) => {
    let maxVal = parseFloat(whatToLimit.max);
    let minVal = parseFloat(whatToLimit.min);

    if (whatToLimit.value >= maxVal) {
        whatToLimit.value = maxVal;
        eval(whatToStyle) = maxVal / 10 + "%";
    } else if (whatToLimit.value <= minVal) {
        eval(whatToStyle) = minVal / 10 + "%";
    } else {
        eval(whatToStyle) = whatToLimit.value / 10 + "%";
    }
    
    this.focus();
}


inputHeight.oninput = function() {
    let store = "canvas.style.height";
    limitMaxVal(this, store);
};

使用您的代码,传递到 limitMaxVal 函数的是样式 属性 的 value,而不是 reference ,而函数需要知道 哪里 可以分配新值,而不是 what 当前值是什么。阅读 Pass variables by reference in JavaScript 中的答案以了解更多信息。

使用您自己的代码进行说明:

// This creates a variable with name `store` and value '200px',
// assuming that `element.style.height` is '200px'
let store = element.style.height;

// This changes the value of `store` to '100px',
// nothing happened to `element.style.height`
store = 100px;

// At the end, `store` is '100px',
// `element.style.height` remains '200px'

根据你在那里写的内容,我建议将样式对象和 属性 名称传递给函数,如下所示:

const limitMaxVal = (whatToLimit, styleObj,  propertyName) => {
    let maxVal = parseFloat(whatToLimit.max);
    let minVal = parseFloat(whatToLimit.min);

    if (whatToLimit.value >= maxVal) {
        whatToLimit.value = maxVal;
        styleObj[propertyName] = maxVal / 10 + "%";
    } else if (whatToLimit.value <= minVal) {
        styleObj[propertyName] = minVal / 10 + "%";
    } else {
        styleObj[propertyName] = whatToLimit.value / 10 + "%";
    }
}

下面是使用方法:

inputHeight.oninput = function() {
    limitMaxVal(this, canvas.style, 'height');
};

@Kelvin 已经成功了 - 荣誉!

不过,我试了一下,想出了这种替代方法。此处您将 ​​whatToStyle 对象和 属性 指定为字符串。但是,它要求目标对象在全局名称中 space (window).

请注意:最小和最大限制现在使用 Math.min()Math.max() 在单个表达式中完成。

const canvas=document.getElementById("canvas"),
      inp=   document.getElementById("inp");

function limitMaxVal(whatToStyle){
  return function(ev){
    let inp=ev.target
    let wts=whatToStyle.split('.'), ob=window[wts.shift()];
    while (wts.length>1) ob=ob[wts.shift()];
    ob[wts[0]]=Math.min(Math.max(inp.value,inp.min),inp.max)+'%'
  }
}

// this is how you apply it on an input element:
inp.oninput=limitMaxVal("canvas.style.height");
#main {height:150px; width:300px}
#canvas {height:15%; width:300px; background-color:blue}
<input id="inp" type="number" value="15" max="100" min="10"><br>
<div id="main"> <div id="canvas"></div> </div>