Поддержка смайликов для textarea или div с contenteditable

попытка реализовать textarea компонент с поддержкой смайликов пока писать.

я хочу иметь возможность резервного копирования исходного текста (только символы ascii) при представлении отфильтрованного / сгенерированного результата html (с фильтр угловых смайликов) на div.

мое первоначальное решение-это

<textarea ng-model="text" ng-change="..." ng-focus="..."></textarea>
<div ng-bind-html="text | myEmoticonsFilter"></div>

но у меня возникли проблемы с получением части использования скрытого textarea. Кроме того, с этим я не смогу мышь-выберите текст и удалить или скопировать/вставить безопасно.

я также подумал об использовании <div contenteditable="true"> но ng-focus и ng-change не подлежат рассмотрению.

есть ли у кого-нибудь sugestion о том, как продолжить это?

изменить 1: вот jsfiddle с покушением на то, что я делаю. До сих пор способен заменить первое появление, но с тех пор поведение остается неустойчивым. Я использую

1 ответов


единственный способ сделать это последовательно кросс-браузерным способом-использовать поле WYSIWYG, которое преобразует emoji в изображения.

есть плагин jQuery jquery-emojiarea это делает то, что вам нужно, поэтому вам просто нужно создать директиву, которая обертывает этот плагин, и вы отправляетесь на гонки. Поскольку он вводит в скрытый textarea с синтаксисом emoji :smile: угловой не должен иметь никакой вязки затруднения.

вот рабочая директива, которую я собрал вместе. http://jsfiddle.net/dboskovic/g8x8xs2t/

var app = angular.module('app', []);
app.controller('BaseController', function ($scope) {
    $scope.text = 'This is pretty awesome. :smile: :laughing:';
});
app.directive('emojiInput', function ($timeout) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function ($scope, $el, $attr, ngModel) {
            $.emojiarea.path = 'https://s3-us-west-1.amazonaws.com/dboskovic/jquery-emojiarea-master/packs/basic';
            $.emojiarea.icons = {
                ':smile:': 'smile.png',
                ':angry:': 'angry.png',
                ':flushed:': 'flushed.png',
                ':neckbeard:': 'neckbeard.png',
                 ':laughing:': 'laughing.png'
            };
            var options = $scope.$eval($attr.emojiInput);
            var $wysiwyg = $($el[0]).emojiarea(options);
            $wysiwyg.on('change', function () {
                ngModel.$setViewValue($wysiwyg.val());
                $scope.$apply();
            });
            ngModel.$formatters.push(function (data) {
                // emojiarea doesn't have a proper destroy :( so we have to remove and rebuild
                $wysiwyg.siblings('.emoji-wysiwyg-editor, .emoji-button').remove();
                $timeout(function () {
                    $wysiwyg.emojiarea(options);
                }, 0);
                return data;
            });
        }
    };
});

и использование:

<textarea ng-model="text" emoji-input="{buttonLabel:'Insert Emoji',wysiwyg:true}"></textarea>

если вы хотите, чтобы редактируемое поле для преобразования текста типа :( как вы типа вам нужно будет развить этот плагин jquery и немного изменить его, чтобы анализировать входной текст при изменении, а также при init. (пару строк кода)