d3.hsl 在 Safari 上失败

d3.hsl fails on Safari

我整理了一个简单的HTML页面:

$(document).ready(function() {  
  var canvas = document.getElementById("myCanvas");
  var ctx = canvas.getContext("2d");

  canvas.width  = window.innerWidth;
  canvas.height = window.innerHeight;
 
  //ctx.fillStyle = "gray";
  ctx.fillStyle = d3.hsl(120, 0.5, 0.5);
  
  ctx.fillRect(0,0, canvas.width, canvas.height);  
});
html, body {
  width:  100%;
  height: 100%;
  margin: 0px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script>

<canvas id="myCanvas"> </canvas>

在 Chrome 上它正确地给出了绿色背景。 在 Safari(8.0.6——撰写本文时为最新版本)上,它提供黑色背景。

怎么了?

看起来问题与字符串强制转换有关。基本上,获得 d3.hsl 到 return 颜色字符串(在您的情况下为 "#40bf40" )的正确方法是在 HSL 对象上调用 .toString() (请参阅 here ).所以在你的情况下,它将是

ctx.fillStyle = d3.hsl(120, 0.5, 0.5).toString()

这将解决 Safari 问题。

它在没有 .toString() 的情况下在 Chrome 中工作的原因是因为 Chrome 的 JS 引擎选择为您将其转换为字符串 - 就像 JS 将数字转换为像这样的字符串:5 + "2" // "52"。在内部它实际上是在调用 (5).toString() + "2"。 Safari 碰巧没有决定 .toString() 它,这就是它不起作用的原因。