当我将内联代码带入外部子例程中时,相关区域的图像地图突出显示将停止工作

问题描述

我有4个模块,可以动态生成PNG彩色图像图。所有这4种工作均按设计进行,其中包括突出显示其颜色/值度量数据组织为四分位数的颜色图区域(例如州县)集。

一个由所有4个共享的内联代码块。该块产生4个元素的数组(命名为“ rels”)。每个元素都可以包含一串用逗号分隔的区域名称。元素的区域名称对应于其值/比率度量数据落在范围四分位数结构的四分之一中的区域。

当我将共享的内联代码块放入外部子例程中时,上面提到的突出显示退出了4个模块中的3个模块的工作。使用要构建的1种浏览器的“检查元素”,我已验证内联代码和子例程在所有四个模块中产生的结果相同,并且使用了rels数组的4个元素的标记(rel ='rels [0]')在相应的rels元素中具有正确的内容

我使用mapper.js突出显示各个区域和区域集。它始终运行良好。当我将代码块放在子例程中时,单个区域突出显示在所有4个模块中继续起作用,但是如上所述,区域突出显示在4个模块中的3个中停止。我将放在子例程中的代码块重新内联,突出显示再次起作用。我将代码块放回外部子例程中,并且突出显示了这4组区域,再次退出工作。

就像使用rels数组的标记一样,即使从子例程返回该标记,也无法再看到它。实际上,我返回了一个指针,并使用该指针来获取数组,该指针可以按预期工作。在所有4个模块中,从子例程正确返回了颜色图区域的4个元素的数组,并且4个元素中的每个元素的区域与代码块内联时的区域相同。

我想更好地理解这一点。我不确定如何进行。我已经为此应用程序编写了很多外部子例程,这些子例程可以毫无问题地返回图像映射代码中使用的数组和哈希值。我现在有点被这个卡住了。任何建议表示赞赏。谢谢您的时间。

craigt

以下是其中一个模块,子例程调用,子例程以及使用rels数组的图像映射过程中的内联块。语言是Perl。

内联块:

@rels = ();
  $rels[0] = '';$rels[1] = '';$rels[2] = '';$rels[3] = '';
  $lowqtile = '';   
  foreach $key (@counties) {

    $keyhld = $key;
    $key = lc($key);
    $dval = $cdvals{$key};

    if (defined $cdvals{$key}) { # Has a value.

      if ($direct eq 'i') {        

        if ($dval <= $q1) {
          $rels[0] .= $key . ','; # List of areas in this quartile.
          $lowqtile .= $keyhld . ':';
          $ccolors{$key}=$colors2[3];
        } elsif ($dval > $q1 && $dval <= $q2) {
            $rels[1] .= $key . ',';
            $ccolors{$key}=$colors2[2];
          } elsif ($dval > $q2 && $dval <= $q3) {
              $rels[2] .= $key . ',';
              $ccolors{$key}=$colors2[1];
            } else {
                $rels[3] .= $key . ',';
                $ccolors{$key}=$colors2[0]; # > $q3 - best.
              }               

      } elsif ($direct eq 'd') {          

          if ($dval >= $q1) {
            $rels[0] .= $key . ',';
            $lowqtile .= $keyhld . ':';
            $ccolors{$key}=$colors2[3];
          } elsif ($dval >= $q2 && $dval < $q1) {
              $rels[1] .= $key . ',';
              $ccolors{$key}=$colors2[2];
            } elsif ($dval >= $q3 && $dval < $q2) {
                $rels[2] .= $key . ',';
                $ccolors{$key}=$colors2[1];
              } else {
                  $rels[3] .= $key . ',';
                  $ccolors{$key}=$colors2[0]; # < $q3 - best.
                }          

        } else {            
           
            if ($dval >= $q3 || $dval < -$q3) {
              $rels[0] .= $key . ',';
              $lowqtile .= $keyhld . ':';
              $ccolors{$key}=$colors2[3];
            } elsif (($dval>=$q2 && $dval<$q3)||($dval<=-$q2 && $dval>-$q3)) {
                $rels[1] .= $key . ',';
                $ccolors{$key}=$colors2[2];
              } elsif (($dval>=$q1 && $dval<$q2)||($dval<=-$q1 && $dval>-$q2)) {
                  $rels[2] .= $key . ',';
                  $ccolors{$key}=$colors2[1];
                } else {
                    $rels[3] .= $key . ',';
                    $ccolors{$key}=$colors2[0]; # < $q1 || > -$q1 - best.
                  }             

          } # Goal. 

    } else {
        $ccolors{$key} = 'white'; # NA.
      }

  } # foreach.

  $i = 0;
  foreach $key (@rels) {    
    if (index($key,',') > -1) {
      $rels[$i] = substr($rels[$i],length($rels[$i])-1);
    }     
    $i++;
  }

  $lowqtile = substr($lowqtile,length($lowqtile)-1); # Strip last colon.

子例程调用

# Set the base level rels array (used in quartile area coloring),the low quartile string of keys in that quartile used to color colormap data,and color code by key.

($lowqtile,$relsPtr,$cclrPtr) = gtclrstf($direct,$q1,$q2,$q3,$q4,\@counties,\%cdvals,\@colors2); # Preferred behavior,quartile bounds,and county,data,quartile colors in.
@rels = @$relsPtr; # Get array/hash from references.
%ccolors = %$cclrPtr; # Color codes by area. 

子例程:

sub gtclrstf {

  my ($lowqtilex,$keyx,$keyhldx,$directx,$areasPtr,$avalsPtr,$qclrsPtr); # Scalars.

  my ($dvalx,$q1x,$q2x,$q3x,$q4x,$ix); # Numerics.

  my (@relsx,%aClrs,@areas,%avals,@qClrs); # Arrays/hashes.

  ($directx,$qclrsPtr) = @_;
  @areas = @$areasPtr; # Get arrays from references.
  %avals = %$avalsPtr; 
  @qClrs = @$qclrsPtr;
  

  @relsx = ();
  $relsx[0] = '';$relsx[1] = '';$relsx[2] = '';$relsx[3] = '';
  $lowqtilex = '';   
  foreach $keyx (@areas) {

    $keyhldx = $keyx;
    $keyx = lc($keyx);
    $dvalx = $avals{$keyx};

    if (defined $avals{$keyx}) { # Has a value.

      if ($directx eq 'i') {        

        if ($dvalx <= $q1x) {
          $relsx[0] .= $keyx . ','; # List of areas in this quartile - used in area grouping.  
          $lowqtilex .= $keyhldx . ':'; # Used in colormap data highlighting.
          $aClrs{$keyx}=$qClrs[3];
        } elsif ($dvalx > $q1x && $dvalx <= $q2x) {
            $relsx[1] .= $keyx . ',';
            $aClrs{$keyx}=$qClrs[2];
          } elsif ($dvalx > $q2x && $dvalx <= $q3x) {
              $relsx[2] .= $keyx . ',';
              $aClrs{$keyx}=$qClrs[1];
            } else {
                $relsx[3] .= $keyx . ',';
                $aClrs{$keyx}=$qClrs[0]; # > $q3x - best.
              }               

      } elsif ($directx eq 'd') {          

          if ($dvalx >= $q1x) {
            $relsx[0] .= $keyx . ',';
            $lowqtilex .= $keyhldx . ':';
            $aClrs{$keyx}=$qClrs[3];
          } elsif ($dvalx >= $q2x && $dvalx < $q1x) {
              $relsx[1] .= $keyx . ',';
              $aClrs{$keyx}=$qClrs[2];
            } elsif ($dvalx >= $q3x && $dvalx < $q2x) {
                $relsx[2] .= $keyx . ',';
                $aClrs{$keyx}=$qClrs[1];
              } else {
                  $relsx[3] .= $keyx . ',';
                  $aClrs{$keyx}=$qClrs[0]; # < $q3x - best.
                }          

        } else {            
           
            if ($dvalx >= $q3x || $dvalx < -$q3x) {
              $relsx[0] .= $keyx . ',';
              $lowqtilex .= $keyhldx . ':';
              $aClrs{$keyx}=$qClrs[3];
            } elsif (($dvalx >= $q2x && $dvalx < $q3x) || ($dvalx <= -$q2x && $dvalx > -$q3x)) {
                $relsx[1] .= $keyx . ',';
                $aClrs{$keyx}=$qClrs[2];
              } elsif (($dvalx >= $q1x && $dvalx < $q2x) || ($dvalx <= -$q1x && $dvalx > -$q2x)) {
                  $relsx[2] .= $keyx . ',';
                  $aClrs{$keyx}=$qClrs[1];
                } else {
                    $relsx[3] .= $keyx . ',';
                    $aClrs{$keyx}=$qClrs[0]; # < $q1 || > -$q1 - best.
                  }             

          } # Goal. 

    } else {
        $aClrs{$keyx} = 'white'; # NA.
      }

  } # foreach.

  $ix = 0;
  foreach $keyx (@relsx) { # Eliminate trailing comma if there.    
    if (index($keyx,') > -1) {
      $relsx[$ix] = substr($relsx[$ix],length($relsx[$ix])-1);
    }   
    $ix++;
  }  

  $lowqtilex = substr($lowqtilex,length($lowqtilex)-1); # Strip last colon.

  return $lowqtilex,\@relsx,\%aClrs; # Return array of keys in each quartile pointer,low quartile keys string,and colors array by area pointer.

}

使用rels数组(第1个4个区域标签)的图像映射过程。

print"<DIV STYLE='POSITION:absolute;LEFT:$rpos;'><IMG SRC='$filex' WIDTH='600' HEIGHT='265' USEMAP='#cmap' STYLE='POSITION:absolute;LEFT:$rpos;' CLASS='mapper $cmabrdr iopacity$colrmapcolr9 icolor$colrmapcolr8'></DIV>\n";
  print"<MAP NAME='cmap'>\n";

  if (!$simflg) {        
    print"<AREA shape='circle' CLASS='$cmabrdr iopacity$colrmapcolr9 icolor$colrmapcolr1' ID='q1' rel='$rels[3]' TITLE='quartile 1' HREF='#' coords='555,50,8'>
          <AREA shape='circle' CLASS='$cmabrdr iopacity$colrmapcolr9 icolor$colrmapcolr2' ID='q2' rel='$rels[2]' TITLE='quartile 2' HREF='#' coords='565,70,8'>
          <AREA shape='circle' CLASS='$cmabrdr iopacity$colrmapcolr9 icolor$colrmapcolr3' ID='q3' rel='$rels[1]' TITLE='quartile 3' HREF='#' coords='575,90,8'>
          <AREA shape='circle' CLASS='$cmabrdr iopacity$colrmapcolr9 icolor$colrmapcolr4' ID='q4' rel='$rels[0]' TITLE='quartile 4' HREF='#' coords='585,110,8'>
          \n";
  }  
  
  $gstr = '';
  foreach $key ( @counties ) {

    $keylc = lc($key);
    $surtok = 'x' . $keylc;
    $surtok =~ s/ +//g;
    $uckey = $key;
    $uckey =~ s/\b(\w)(\w*)/uc($1).lc($2)/ge; # Uppercase 1st word letters.   

    if (!$simflg) {
      if (defined $cdvals{$keylc}) { 
        print"<AREA ID='$key' HREF='$curls{$keylc}' SHAPE='poly' COORDS='$ccoords{$keylc}' TITLE='$keystr{$keylc} -\r\nClick For The $uckey $blev $dcname Trend' ONMOUSEOVER=\"showIt('$surtok');setStatus(' ');\" ONMOUSEOUT=\"hideIt('$surtok');setStatus(' ');\">\n";   
      } else {
          print"<AREA ID='$key' SHAPE='poly' COORDS='$ccoords{$keylc}' TITLE='$keystr{$keylc}' ONMOUSEOVER=\"setStatus(' ');\" ONMOUSEOUT=\"setStatus(' ');\">\n";
        }
    } else {
        print"<AREA ID='$key' SHAPE='poly' COORDS='$ccoords{$keylc}' TITLE='$keystr{$keylc}' ONMOUSEOVER=\"setStatus(' ');\" ONMOUSEOUT=\"setStatus(' ');\">\n";   
      }
    
    if (!$simflg && defined $cdvals{$keylc}) {    
      $j = allSame(1,$vlus{$surtok});        
      $k = allSame(2,$rts{$surtok});         
      
      if (exists($vlus{$surtok})) {
        $gstr .= "<DIV ID='$surtok'><A ONMOUSEOVER=\"setStatus('Value and Rate Trends');\" ONMOUSEOUT=\"setStatus('  ');\"><SPAN ID='slhdr$surtok' STYLE='POSITION:absolute;TOP:28.5%;LEFT:$lpos;FONT-SIZE:9px;BACKGROUND-COLOR:#$ltappbgcolr;FONT-FAMILY:arial;'>$uckey v/r Trends<BR></SPAN><SPAN ID='slx$surtok' STYLE='POSITION:absolute;TOP:$tpos;LEFT:$lpos;BACKGROUND-COLOR:#$ltappbgcolr;BORDER:1px dashed lightgray;PADDING-TOP:$tpads;'>&nbsp;<SPAN CLASS='inlinesparkline$j' TITLE='Value Trend' ONMOUSEOVER=\"setStatus('Value Trend');\" ONMOUSEOUT=\"setStatus(' ');\">$vlus{$surtok}</SPAN>&nbsp;&nbsp;<SPAN CLASS='inlinesparkline$k' TITLE='Rate Trend' ONMOUSEOVER=\"setStatus('Rate Trend');\" ONMOUSEOUT=\"setStatus(' ');\">$rts{$surtok}</SPAN>&nbsp;</SPAN></A></DIV><SCRIPT>hideIt('$surtok');</SCRIPT>";              
      }
    }     

  } 

  print"</MAP>\n";

如上所述,我已经验证了rels数组的内容在使用该数组的区域标签处是相同的,这些标签来自所有4个模块的内联代码块和子例程。内联块在所有4个模块中都突出显示区域集。我将内联块放入子例程中,并使用指针/引用将数组从例程中传递出去,突出显示区域集在4个模块中的3个中不再起作用。

以下是一个链接,该链接在我家的服务器上运行。这是与子例程中的代码一起使用的1个模块。将鼠标悬停在颜色图右侧的4个圆圈中,即可看到突出显示的区域集。

colormap example with subroutine where highlighting works

所有数据仅用于测试目的。

更新:我很沮丧。我已经尝试了很多事情,但还没有能够继续前进。我比较了当rels数组从外部子例程中出来时,区域设置突出显示的模块的工作原理,而该模块不在此配置中。我看了3个模块,其中rels数组从外部子例程中出来时,区域集突出显示退出工作,而在子例程被内联时起作用。我已经列出了我所知道的。

  1. 尽管所有4个模块在许多方面都是相似的,但仍存在显着差异。但是我不认为这些差异会影响在3个模块中突出显示该行为无效的区域集。

  2. 这三个不起作用的模块可能还有其他10个传递标量的子例程。数组,以及散列该工作的内容

  3. 对于区域集突出显示的3个模块,当rels数组从外部子例程中出来时退出工作,而当子例程被内联时起作用,这两种配置中所有三个模块的rels数组内容均相同。

  4. 在子例程(或内联代码)出现的位置与在图像映射的第1个4个区域标签集中使用的位置之间,不会触摸rels数组。

  5. 区域图图像和区域html在子例程配置中的所有4个模块中都完全相同,除了图像图的名称用户将鼠标悬停以查看区域的圆坐标设置为高亮显示以及rels数组元素中与彩色四分位数相对应的区域。

  6. 在子例程配置中,进行区域集突出显示的悬停链接(圆圈)都是所有3个模块中的活动链接,但是当我将鼠标悬停在区域上时,区域集不会出现突出显示

  7. 在子例程配置的所有3个模块中,单个区域的悬停行为仍然有效。

我想弄清楚这一点。我想至少可以说它在串联配置中有效,但这不是应该的方式。我没看到它,但是我还在看。关于此事的任何建议将不胜感激。

感谢您的宝贵时间。

解决方法

我还有其他一些优先事项,使我有一段时间无法解决此问题,并且已经采取了某些措施。我认为问题一定是在5个区域中突出显示的区域不起作用的情况下是不正确的,并且在确定有效的区域中一定是可以的。这里的问题是哈希键不匹配。在涉及此问题的六个模块中,每个模块都有9个哈希。所有关键字在1个模块中的散列上都匹配,该模块突出显示了该区域集。其他5个模块有1个散列,且密钥不匹配。我花了一段时间才看到它,而我的问题描述反映了我缺乏理解。现在所有6个模块都可以正常工作。感谢所有关注此事的人。该问题已解决。