?

Log in

No account? Create an account

Javascript Color Picker

« previous entry | next entry »
авг. 11, 2005 | 05:25 pm

С трудом, но нашел контрол для выбора цвета.

Нашел тут.

Решение достаточно удобное. Встретился ровно с одним недостатком: в IE слой с выбором цвета при перекрытии с комбо оказывается под комбо. Это известная проблема ИЕ. Я ее решил при помощи кода из календаря (об интеграции которого с асп.нет я писал чуть раньше).

В общем, идея такая:
при разворачивании дива с цветами, пробегаемся по всем элементам формы (в календаре это было оптимизированно, но я оптимизацию убрал, т.к. она была довольно специфической) и те select`ы, границы которых пересекаются с наши дивом, делаем невидимыми (hidden). При закрытии дива, снова бегаем и делаем их обратно видимыми.

что интересно, только сейчас, когда запостил код, обратил внимание, что высота "var CalBottomY = CalTopY + (CellHeight * 9);" считается неверно - это код, оставшийся после календаря, к выбору цвета отношения не имеет. Работает и фиг с ним =)


function FixSelectListsForCP(Over) {
   if (navigator.appName == 'Microsoft Internet Explorer') {
      var CalDiv = getObj('colorpicker');
      var CalLeftX = CalDiv.offsetLeft;
      var CalRightX = CalLeftX + CalDiv.offsetWidth;
      var CalTopY = CalDiv.offsetTop;
      var CalBottomY = CalTopY + (CellHeight * 9);
      formLoop :
      for (var j=0;j<document.forms.length;j++) {
         for (var i=0;i<document.forms[j].elements.length;i++) {
                  if (document.forms[j].elements[i].type.substr(0,6) == 'select') {                     
                     ListTopY = GetTagPixels(document.forms[j].elements[i], 'TOP');
                     if (ListTopY < CalBottomY) {
                        if (BehindCal(document.forms[j].elements[i], CalLeftX, CalRightX, CalTopY, CalBottomY, ListTopY)) {
                           document.forms[j].elements[i].style.visibility = (Over) ? 'hidden' : 'visible';
                        }
                     }
                     else break formLoop;
                  }
         }
      }
   }
}

function BehindCal(SelectList, CalLeftX, CalRightX, CalTopY, CalBottomY, ListTopY) {
   var ListLeftX = GetTagPixels(SelectList, 'LEFT');
   var ListRightX = ListLeftX + SelectList.offsetWidth;
   var ListBottomY = ListTopY + SelectList.offsetHeight;
   return (((ListTopY < CalBottomY) && (ListBottomY > CalTopY)) && ((ListLeftX < CalRightX) && (ListRightX > CalLeftX)));
}

Ссылка | Оставить комментарий | Поделиться

Comments {0}