【问题标题】:javascript getElementsByClassName and setAttribute not workingjavascript getElementsByClassName 和 setAttribute 不起作用
【发布时间】:2013-07-27 08:25:57
【问题描述】:

我添加了 4 个“范围”类型输入,并使用它们的值来设置另一个元素的 RGBA 值,但它不起作用。

window.onload = init;

function init(){
document.getElementById("colorR").onchange() = setColors;
document.getElementById("colorG").onchange() = setColors;
document.getElementById("colorB").onchange() = setColors;
document.getElementById("Opacity").onchange() = setColors;  
}
function setColors(){
var r = document.getElementById("colorR").value;
var g = document.getElementById("colorG").value;
var b = document.getElementById("colorB").value;
var a = document.getElementById("Opacity").value;

    //alert(r+", "+g+", "+b+", "+a);

document.getElementsByClassName("previewAreaBox")[0].style.setAttribute(
"background-color", "rgba(",r+", "+g+", "+b+", "+a/100+");");

}

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 打开浏览器的开发者控制台,你会看到错误。这应该是您在出现问题时首先查看的位置。
  • 当您调用document.getElementById("...").onchange() = setColors 时,您正在执行任何附加的函数。去掉括号,看起来像这样:document.getElementById("...").onchange = setColors。这样你就可以设置变量,新值(一个函数)将在以后被调用。
  • 感谢 Crazy Train 和 smakateer
  • mtd +1 给您,因为当大多数新用户接受答案并消失时,您表示感谢。欢迎使用 Stack Overflow!
  • 感谢你的好意,亲爱的约瑟夫

标签: javascript styles getelementsbyclassname


【解决方案1】:
style.setAttribute(

setAttribute 适用于元素,而不是样式。

background-color 是样式属性,而不是属性。

document.getElementsByClassName("previewAreaBox")[0].style.backgroundColor = ".."

【讨论】:

    【解决方案2】:

    至少,

    document.getElementById("colorR").onchange() = setColors;
    

    应该改为

    document.getElementById("colorR").onchange = setColors;
    

    如果不进行更改,其余代码将根本无法运行,因为onchange() 调用事件处理程序,而不带括号的onchange 用于分配事件处理程序。

    正如康纳的有用评论所述,安迪的回答包含部分解决方案,我还注意到您的代码中还有一个错误:

    "rgba(",r+", "+g+", "+b+", "+a/100+");"
    

    需要是这样的(加上现在逗号所在的位置,以及算术周围的括号以防止其左操作数过早转换为字符串):

    "rgba(" +r+ ", " +g+ ", " +b+ ", " + (a/100) +");"
    

    因此,将其插入安迪的答案中,setColors 函数的最后一行应该是这样的:

    document.getElementsByClassName("previewAreaBox")[0].style.backgroundColor = "rgba(" +r+ ", " +g+ ", " +b+ ", " + (a/100) +");";
    

    【讨论】:

      【解决方案3】:

      好的,这里有几个问题

      1.您需要将函数分配给更改事件,而不是调用更改事件。

      2。您不要在样式上使用 setAttribute,而是使用它在元素上设置属性。

      3。你应该缓存你的元素。

      window.onload = init;
      
      
      var elementR, elementG, elementB, opacityElement;
      
      function init(){
         elementR = document.getElementById("colorR");
         elementG = document.getElementById("colorG");
         elementB = document.getElementById("colorB");
         opacityElement = document.getElementById("Opacity");
      
         // Set change events
         elementR.onchange = 
         elementG.onchange = 
         elementB.onchange = 
         opacityElement.onchange = setColors;
      }
      function setColors(){
          var r = elementR.value,
              g = elementG.value,
              b = elementB.value,
              a = opacityElement.value,
              preview = document.getElementsByClassName("previewAreaBox")[0];
              preview.style.backgroundColor =  'rgba(' + r + ',' + g + ',' + b + ',' + a / 100 + ')';
      }
      

      Element.onchange() = something; 
      

      不起作用,因为onchange(); 实际上触发了事件并且没有将函数分配给它。

      你也可以像这样使用Array.join 来表示 rgba

      var rgba = [elementR.value, elementG.value, elementB.value, 
                  opacityElement.value / 100];
      preview.style.backgroundColor =  'rgba(' + rgba.join(',') + ')';
      

      【讨论】:

      • 同意,谁支持和否决我们的答案??也许这是我们讨论的回答方式。有些人认为回答者应该简单地告诉答案并完成。有一次有人这么告诉我。 (他们在我没有讨论的情况下重复了我的相同答案,然后获得了六倍的选票,并因正确答案而受到赞誉。但我获得的教训是,他们告诉我为什么会发生这种情况。但是,我仍然相信解释.)
      • Aww,我期待着获得一个徽章来获得一个接受的答案,但我没有......
      • 我同意你的观点,更深入的解释可以为更多从初学者到高级的人服务
      • 其实你已经有了顽强的徽章!由于它不会影响您是否获得徽章,因此我将为您的答案 +1,因为您的答案为 -1 是不公平的。
      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      相关资源
      最近更新 更多