Facebook / Youtube Нравится несколько элементов - PullRequest
2 голосов
/ 10 мая 2010

Прежде чем мы продолжим: это не может быть предопределенный список.

Мне нужно что-то вроде этого: http://loopj.com/tokeninput/demo.html ... Плагин jQuery, который позволяет пользователю вводить строку слов, нажимать клавишу ввода, и это делает его блоком текста, откуда они могут нажмите X, чтобы избавиться от него, или введите больше ключевых слов в область ввода. Я нашел много вещей, которые делают это, но все извлекают информацию из предопределенного списка вариантов.

Ответы [ 4 ]

3 голосов
/ 10 мая 2010

Вот, пожалуйста, http://www.spookandpuff.com/examples/tagEntry.html

Общая суть ...

  1. Разрешить пользователю вводить что-либо в текстовом поле
  2. Когда они нажимают ввод, проверьте, является ли тег новым, и если это так, добавьте значение в качестве элемента в список.
  3. Добавьте ссылку «удалить», чтобы тег можно было удалить из списка.
  4. Разрешить равномерную отправку списка тегов на сервер.

Вот код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

    <title>Free Tag Entry</title>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
  <script type="text/javascript">
    $(function() {
      //The event handler for the input:
      $('#tagEntry').keypress(function(event){

        if (event.keyCode == '13') { //If Enter is pressed

          var newTagName = $(this).attr('value');

          //Clear the helper message:
          $('#tagEntryHelper').text('');

          //Check if the tag exists already:
          if (
            !$('#addedTags > li > .tagName').filter(function(){
              return $(this).text() == newTagName;
            }).length
          ) {
            //If not, add the value to the list of tags:
            $('#addedTags').prepend('<li><input type="checkbox" name="tagName" value="' + newTagName + '" checked="checked"/><span class="tagName">' + newTagName + '</span> <a href="#" class="remove">Remove</a></li>');
          } else {
            //Tell the user they messed up:
            $('#tagEntryHelper').text('You already added that tag.');
          };

          //Clear the input ready for the next tag
          $(this).attr('value', '');

        }
      });

      //The event handler for removing tags via a 'remove' link/icon (live is used so it works on newly added tags):
      $('#addedTags .remove').live('click', function(){
        $(this).closest('li').remove();
        return false;
      });

      //An event handler for removing tags via unchecking a box
      $('#addedTags :checkbox').live('change', function(){
          if ($(this).not(':checked')) {
            $(this).closest('li').remove();
            return false;
          }
      })
    });
  </script>

</head>

<body>
  <input id="tagEntry" type="text"/> <span id="tagEntryHelper"></span>
  <ul id="addedTags">
  </ul>
</body>
</html>

Это работает, хотя я использовал некоторые соглашения jQuery, которые облегчают чтение кода, но, вероятно, не являются лучшими в плане производительности. Если вы не ожидаете, что пользователи будут работать с тысячами тегов, я бы не стал беспокоиться - все должно быть в порядке.

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

Взгляните на демонстрацию - это то, что вы хотите?

0 голосов
/ 10 мая 2010

Хорошо, насколько я понимаю, у вас есть код для этого, однако вам не нужен предварительно определенный список.

Самый простой способ - отобразить список как часть ответа сервера. Таким образом, ваш клиентский код может ссылаться на этот список, отображаемый с сервера. Недостатком этого является то, что он является статичным и не очень гибким. Однако это проще всего, так как список может отображаться при каждой перезагрузке страницы.

Возможно, лучший способ - сделать запрос веб-службы для этого списка и определить его на клиенте. Таким образом, вы можете динамически загружать несколько типов контента без перезагрузки страницы. Вы должны сделать запрос Ajax для элементов, а затем загрузить свой список на основе ответа Ajax.

0 голосов
/ 10 мая 2010

Что ж, я решил использовать плагин Token Input от LoopJ и немного изменить код, чтобы он возвращал то, что было набрано. Мне было бы интересно узнать, есть ли у кого-нибудь еще плагин, который будет изначально поддерживать его.

0 голосов
/ 10 мая 2010

Сайт, на который вы ссылались, отправляет запрос на страницу PHP, которая возвращает результаты запроса. Что мешает вам делать то же самое? Страница PHP / ASP / независимо от того, на какую страницу вы отправляете запрос, может сделать все, что вам нужно, чтобы получить список (из БД, с внешнего сайта - кэшированный - или любой другой) и затем вернуть результаты.

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