goldfish: ColorPicker ohne JAVA

Beitrag lesen

Hallo!

Ich habe einen ColorPicker mit PHP programmiert. Der funktioniert auch im IE einwandfrei, im Firefox dagegen hab ich noch Probleme. Hier erstmal der Quelltext:

css: #x {padding:0px; width:10px; height:10px}

<table style="border-collapse:collapse; float:left; margin-left:1em">
      <?php
//---------------------- roter Farbbalken -----------------------
        for ($rr = 255; $rr >= 0; $rr = $rr-15) {
          if (strtoupper(str_pad(dechex($rr),2,"0",STR_PAD_LEFT)) === "$r") {
            $contrast = 255-$rr;
            echo("<tr><a href="admin.php?c=$c&r=$r"><td id="x" style="border:2px solid #".str_pad(dechex($contrast),2,"0",STR_PAD_LEFT)."FFFF; width:6px; background-color:#".str_pad(dechex($rr),2,"0",STR_PAD_LEFT)."0000"></td></a></tr>\n");
          } else {
            echo("<tr><a href="admin.php?c=$c&r=".strtoupper(str_pad(dechex($rr),2,"0",STR_PAD_LEFT)).""><td id="x" style="background-color:#".str_pad(dechex($rr),2,"0",STR_PAD_LEFT)."0000"></td></a></tr>\n");
          }
        }
        echo("</table>\n");
//------------------- grüner Farbbalken -----------------------
        echo("<table style="border-collapse:collapse; float:left; margin-left:1em">\n");
        for ($gg = 255; $gg >= 0; $gg = $gg-15) {
          if (strtoupper(str_pad(dechex($gg),2,"0",STR_PAD_LEFT)) === "$g") {
            $contrast = 255-$gg;
            echo("<tr><a href="admin.php?c=$c&g=$g"><td id="x" style="border:2px solid #FF".str_pad(dechex($contrast),2,"0",STR_PAD_LEFT)."FF; width:6px; background-color:#00".str_pad(dechex($gg),2,"0",STR_PAD_LEFT)."00"></td></a></tr>\n");
          } else {
            echo("<tr><a href="admin.php?c=$c&g=".strtoupper(str_pad(dechex($gg),2,"0",STR_PAD_LEFT)).""><td id="x" style="background-color:#00".str_pad(dechex($gg),2,"0",STR_PAD_LEFT)."00"></td></a></tr>\n");
          }
        }
        echo("</table>\n");
//------------------- blauer Farbbalken -----------------------
        echo("<table style="border-collapse:collapse; float:left; margin-left:1em">\n");
        for ($bb = 255; $bb >= 0; $bb = $bb-15) {
          if (strtoupper(str_pad(dechex($bb),2,"0",STR_PAD_LEFT)) === "$b") {
            $contrast = 255-$bb;
            echo("<tr><a href="admin.php?c=$c&b=$b"><td id="x" style="border:2px solid #FFFF".str_pad(dechex($contrast),2,"0",STR_PAD_LEFT)."; width:6px; background-color:#0000".str_pad(dechex($bb),2,"0",STR_PAD_LEFT).""></td></a></tr>\n");
          } else {
            echo("<tr><a href="admin.php?c=$c&b=".strtoupper(str_pad(dechex($bb),2,"0",STR_PAD_LEFT)).""><td id="x" style="background-color:#0000".str_pad(dechex($bb),2,"0",STR_PAD_LEFT).""></td></a></tr>\n");
          }
        }
        echo("</table>\n");
//------------------- rote Farbtabelle -----------------------
        echo("<table style="border-collapse:collapse; float:left; margin-left:1em">\n");
        if ("$r" <> "") {
          $rr = "$r";
          for ($gg = 255; $gg >= 0; $gg = $gg-15) {
            echo("<tr>\n");
            for ($bb = 0; $bb < 256; $bb = $bb+15) {
              echo("<a href="admin.php?c=".strtoupper(str_pad($rr,2,"0",STR_PAD_LEFT).str_pad(dechex($gg),2,"0",STR_PAD_LEFT).str_pad(dechex($bb),2,"0",STR_PAD_LEFT))."&r=$r&g=$g&b=$b"><td id="x" style="background-color:#".str_pad($rr,2,"0",STR_PAD_LEFT).str_pad(dechex($gg),2,"0",STR_PAD_LEFT).str_pad(dechex($bb),2,"0",STR_PAD_LEFT).""></td></a>\n");
            }
            echo("</tr>\n");
          }
//------------------- grüne Farbtabelle -----------------------
        } elseif ("$g" <> "") {
          $gg = "$g";
          for ($rr = 255; $rr >= 0; $rr = $rr-15) {
            echo("<tr>\n");
            for ($bb = 0; $bb < 256; $bb = $bb+15) {
              echo("<a href="admin.php?c=".strtoupper(str_pad(dechex($rr),2,"0",STR_PAD_LEFT).str_pad($gg,2,"0",STR_PAD_LEFT).str_pad(dechex($bb),2,"0",STR_PAD_LEFT))."&r=$r&g=$g&b=$b"><td id="x" style="background-color:#".str_pad(dechex($rr),2,"0",STR_PAD_LEFT).str_pad($gg,2,"0",STR_PAD_LEFT).str_pad(dechex($bb),2,"0",STR_PAD_LEFT).""></td></a>\n");
            }
            echo("</tr>\n");
          }
//------------------- blaue Farbtabelle -----------------------
        } elseif ("$b" <> "") {
          $bb = "$b";
          for ($rr = 255; $rr >= 0; $rr = $rr-15) {
            echo("<tr>\n");
            for ($gg = 0; $gg < 256; $gg = $gg+15) {
              echo("<a href="admin.php?c=".strtoupper(str_pad(dechex($rr),2,"0",STR_PAD_LEFT).str_pad(dechex($gg),2,"0",STR_PAD_LEFT).str_pad($bb,2,"0",STR_PAD_LEFT))."&r=$r&g=$g&b=$b"><td id="x" style="background-color:#".str_pad(dechex($rr),2,"0",STR_PAD_LEFT).str_pad(dechex($gg),2,"0",STR_PAD_LEFT).str_pad($bb,2,"0",STR_PAD_LEFT).""></td></a>\n");
            }
            echo("</tr>\n");
          }
//--------------- ansonsten rote Farbtabelle ------------------
        } else {
          $rr = "00";
          for ($gg = 255; $gg >= 0; $gg = $gg-15) {
            echo("<tr>\n");
            for ($bb = 0; $bb < 256; $bb = $bb+15) {
              echo("<a href="admin.php?c=".strtoupper(str_pad($rr,2,"0",STR_PAD_LEFT).str_pad(dechex($gg),2,"0",STR_PAD_LEFT).str_pad(dechex($bb),2,"0",STR_PAD_LEFT))."&r=$r&g=$g&b=$b"><td id="x" style="background-color:#".str_pad($rr,2,"0",STR_PAD_LEFT).str_pad(dechex($gg),2,"0",STR_PAD_LEFT).str_pad(dechex($bb),2,"0",STR_PAD_LEFT).""></td></a>\n");
            }
            echo("</tr>\n");
          }
        }
      ?>
    </table>

Das erzeugt zwar einige KB HTML-Quellcode, aber es funktioniert clientunabhängig. Feinheiten werde ich auch noch einbauen (z.B. die Auswahlmarkierung in der Farbtabelle) Im Firefox gibt es noch ein Problem, das im IE nicht auftaucht: Die Farbzelle (das td-Element) wird nicht verweis-sensitiv, man kann sie nicht anklicken. Selbst wenn ich die Zelle mit Schrift fülle, wird sie nicht verweis-sensitiv. Dabei sind doch im a-Element ausdrücklich inline-Elemente erlaubt!?!?!
Wer weiß dafür ein Workaround?

Alternativ hab ich schon an die Möglicheit gedacht, dynamisch eine Grafik statt der Tabellen zu erzeugen und mit verweis-sensitiven Flächen (also mit shape und coords) zu arbeiten. Dann wird aber das Auswahlrechteck wahrscheinlich nicht ganz so einfach machbar, hab mich noch nicht näher mit der GD-Library beschäftigt.

P.S.: Sorry für den umfangreichen "Codeschnipsel", aber es wiederholt sich ja alles...