2012-08-06 27 views
0

我有一个只能使用一次的函数。我敢肯定这是因为它说“返回”,我没有任何循环,等等任何人都可以帮我解开这个功能? (这一切都在jQuery容器中,尽管我不认为jQuery可能与这个问题有很大关系。)从多次使用的函数返回不同的值

从Farbtastic返回的HSL颜色格式为(色调,饱和度,亮度)。我正在调整第三个值,轻量级,并且这部分工作。所有的重复都不起作用。它使所有新色板成为第一块色板的颜色。

function onColorChange(color) { 

     // retrieve HSL color value 
     var hslcolor = $.farbtastic('#main_color_picker').hsl; 

     // create 4 new colors of varying brightness, and variable names to save them to db. 
       var newcolor1 = hslcolor; 
       var newcolor2 = hslcolor; 
       var newcolor3 = hslcolor; 
       var newcolor4 = hslcolor; 
        newcolor1[2] = 0.10 * (Math.round(hslcolor[2]*10000)/10000); 
        newcolor2[2] = 0.85 * (Math.round(hslcolor[2]*10000)/10000); 
        newcolor3[2] = 1.15 * (Math.round(hslcolor[2]*10000)/10000); 
        newcolor4[2] = 1.50 * (Math.round(hslcolor[2]*10000)/10000); 
       var rgb1 = hsl2rgb(newcolor1); 
       var rgb2 = hsl2rgb(newcolor2); 
       var rgb3 = hsl2rgb(newcolor3); 
       var rgb4 = hsl2rgb(newcolor4); 

     //apply the color to swatches and show original swatch in the middle. 
     var firstSwatch = $('#section-main_color').find('.square1'); 
     firstSwatch.css('background-color', 'rgb('+rgb1.r+','+rgb1.g+','+rgb1.b+')'); 
     var secondSwatch = $('#section-main_color').find('.square2'); 
     secondSwatch.css('background-color', 'rgb('+rgb2.r+','+rgb2.g+','+rgb2.b+')'); 
        // original color is in square 3 
     var fourthSwatch = $('#section-main_color').find('.square4'); 
     fourthSwatch.css('background-color', 'rgb('+rgb3.r+','+rgb3.g+','+rgb3.b+')'); 
     var fifthSwatch = $('#section-main_color').find('.square5'); 
     fifthSwatch.css('background-color', 'rgb('+rgb4.r+','+rgb4.g+','+rgb4.b+')'); 

    } 

function hsl2rgb(hsl) { 
    var h = hsl[0], s = hsl[1], l = hsl[2]; 
    var m1, m2, hue; 
    var r, g, b 
    h = (Math.round(360*h)/1); 
    if (s == 0) 
     r = g = b = (l * 255); 
    else { 
     if (l <= 0.5) 
      m2 = l * (s + 1); 
     else 
      m2 = l + s - l * s; 
     m1 = l * 2 - m2; 
     hue = h/360; 
     r = Math.round(HueToRgb(m1, m2, hue + 1/3)); 
     g = Math.round(HueToRgb(m1, m2, hue)); 
     b = Math.round(HueToRgb(m1, m2, hue - 1/3)); 
    } 
    return {r: r, g: g, b: b}; 
} 

对于这个问题的第一部分,关于主题选项面板中使用Farbtastic HSL,请参阅:Farbtastic convert HSL back to RGB or Hex

跟帖: 如果你需要一个数组的实际拷贝,我发现这bit:

 var newcolor = hslcolor.slice(0); 

在大多数情况下避免使用这可能是一个好主意。我发现我需要保留原来的阵列,用于另一组计算,所以我在副本上做了我的亮度。

+1

您可以尝试重现http://jsfiddle.net/中的错误吗? – NicoSantangelo 2012-08-06 00:25:13

+0

这与使用'return'或不使用循环无关。大多数函数为不同的输入返回不同的值,我相信这个函数也可以。该错误必须在其他地方。正如已经说过的,请创建一个jsfiddle演示,它会帮助我们帮助你。 – 2012-08-06 00:33:27

+0

不工作:http://jsfiddle.net/uttqX/5/ 这里是工作的例子,但只有我只做一种颜色:http://jsfiddle.net/MdN7X/ – 2012-08-06 00:59:06

回答

0

这是你在找什么:http://jsfiddle.net/uttqX/6/ 为什么没有工作的原因,是因为你多次更新相同的变量再次,因为您分配的所有变量在乞讨相同的初始变量。因此,对这些变量中的任何一个的任何更新都会传播到初始变量(hslcolor),然后返回到所有其他变量。

+1

更好的解释是,一个作业像'newcolor1 = hslcolor'不会创建数组的新副本。这两个变量都指向同一个数组,因此一个元素[2]的改变会影响另一个。请参阅http://my.opera.com/GreyWyvern/blog/show.dml/1725165。 – Barmar 2012-08-06 02:25:09

+0

同意来自Barmar的评论。正试图找出如何在短段内更好地解释ByRef与ByVal,但失败。 – 2012-08-06 02:26:57

+0

我看到它正在工作,而且我也认为我理解了解释,但是......您在代码中更改了哪些内容以使其有效?它看起来和我完全一样。 – 2012-08-06 02:58:07