Поддержка смайликов для 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. (пару строк кода)