Идеи для разноцветного текстового поля? - PullRequest
3 голосов
/ 31 марта 2009

На моем сайте я хотел бы реализовать текстовое поле, в котором люди могут вводить набор строк, разделенных символом-разделителем.
Например, текстовое поле тегов внизу этой страницы: теги (строки), разделенные пробелом (разделитель).
Чтобы сделать его более понятным для пользователя, было бы разумно придать каждой строке свой цвет фона или другую визуальную подсказку.
Я не думаю, что это возможно при обычном контроле ввода текста.

Считаете ли вы возможным создать что-то подобное с помощью JavaScript? Кто-то уже делал это до меня? У вас есть другие предложения?

Ответы [ 4 ]

5 голосов
/ 31 марта 2009

Основные шаги

  1. Поместите текстовое поле в div и сделайте так, чтобы оно тоже скрывало.
  2. Сделайте div похожим на текстовое поле.
  3. В обработчике div элемента onClick установите фокус ввода на скрытое текстовое поле.
  4. Обработка события onKeyUp скрытого текстового поля для захвата текста, форматирования по мере необходимости и изменения innerHtml элемента div.

Это довольно просто. Я оставлю вас, чтобы написать ваш форматтер, но в основном вы просто разделите String на разделитель в соответствии с Semi-Working-Example.

Простой контур

<html>
    <head>
    <script language="javascript" type="text/javascript">
    function focusHiddenInput()
    {
        var txt = document.getElementById("txtHidden");
        txt.focus();
    }

    function formatInputAndDumpToDiv()
    {
        alert('Up to you how to format');
    }
    </script>
    </head>

    <body>
    <div onclick="focusHiddenInput();">
    Some label here followed by a divved textbox:
    <input id="txtHidden" style="width:0px;" onKeyPress="formatInputAndDumpToDiv()" type="text">
    </div>
    </body>
    </html>

Пример полуобработки

Вам все еще нужно расширить обработчики кликов для учета удаления / редактирования тегов / возврата / и т. Д. С помощью клавиатуры .... или вы можете просто использовать событие щелчка для вызова другого div контекстного меню. Но с тегами и идентификаторами пробелов, указанными в приведенном ниже коде, это должно быть довольно просто:

<html>
    <head>
    <script language="javascript" type="text/javascript">

    var myTags=null;

    function init()
    {
        document.getElementById("txtHidden").onkeyup= runFormatter;
    }

    function focusHiddenInput()
    {
        document.getElementById("txtHidden").focus();
    }

    function runFormatter()
    {
        var txt = document.getElementById("txtHidden");
        var txtdiv = document.getElementById("txtBoxDiv");
        txtdiv.innerHTML = "";
        formatText(txt.value, txtdiv);
    }

    function formatText(tagText, divTextBox)
    {
        var tagString="";
        var newTag;
        var newSpace;
        myTags = tagText.split(' ');
        for(i=0;i<myTags.length;i++) {
            newTag = document.createElement("span");
            newTag.setAttribute("id", "tagId_" + i);
            newTag.setAttribute("title", myTags[i]);
            newTag.setAttribute("innerText", myTags[i]);

            if ((i % 2)==0) {
           newTag.style.backgroundColor='#eee999';  
        }
        else
        {
           newTag.style.backgroundColor='#ccceee'; 
        }
            divTextBox.appendChild(newTag);
            newTag.onclick = function(){tagClickedHandler(this);}

            newSpace = document.createElement("span");
            newSpace.setAttribute("id", "spId_" + i);
            newSpace.setAttribute("innerText", " ");
            divTextBox.appendChild(newSpace);

            newSpace.onclick = function(){spaceClickedHandler(this);}
       }
    }

    function tagClickedHandler(tag)
    {
      alert('You clicked a tag:' + tag.title);  
    }   

    function spaceClickedHandler(spacer)
    {
      alert('You clicked a spacer');    
    }   

    window.onload=init;
    </script>
    </head>

    <body>
    <div id="txtBoxDivContainer">
    Enter tags below (Click and Type):<div id="txtBoxDiv" style="border: solid 1px #cccccc; height:20px;width:400px;" onclick="focusHiddenInput();"></div>
    <input id="txtHidden" style="width:0px;" type="text">
    </div>
    </body>
    </html>

Курсор

Вы можете CSS курсор, используя мигание (проверьте поддержку) или иным образом просто продвинуться и при необходимости скрыть анимированный GIF.

1 голос
/ 31 марта 2009

Это довольно интересно. Краткий ответ на ваш вопрос - нет. Не с базовым элементом ввода.

Реальный ответ: может быть, с какой-то хитростью с JavaScript.

Видимо, Facebook делает что-то близкое к этому. Когда вы пишете новое сообщение нескольким людям в Facebook, вы можете вводить их имена таким способом. Каждое распознанное новое имя добавляется немного как тег, и рядом с ним есть небольшой крестик для его удаления.

То, что они, похоже, делают - это подделывает размер области ввода, рисуя окно, похожее на ввод, и удаляя все стили из фактического ввода с помощью css. Затем у них есть много логики с javascript, так что если вы добавите друга в качестве тега и начнете возвращаться, он удалит сразу все имя друга. и т.д.

Так что, да, это выполнимо, но требует больших усилий и добавляет проблем с доступностью.

0 голосов
/ 31 марта 2009

Вы можете использовать несколько текстовых полей

textbox1 <space> textbox2 <space> textbox3 ....

и т. Д. Затем можно применить стиль цвета фона к каждому текстовому полю.

0 голосов
/ 31 марта 2009

Вы можете посмотреть, как они это делают, в таких скриптах, как TinyMCE, которые добавляют такие функции в текстовые области. В текстовых областях вы можете использовать HTML для раскрашивания текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...