Подтвердить что ты не робот

Конвертировать абзац или новые элементы в флажок

У меня contenteditable div как текстовый редактор

Необходимая функциональность - это то, что пользователь записывает или копирует/вставляет в текстовый редактор, превращается в флажок

например,

Случай 1

Если пользователь записывает следующие

Test1 (введите клавишу нажата)

Test2 (введите клавишу нажата)

Test3 (введите клавишу нажата)

тогда необходимо установить три флажка для Test1, Test2, Test3 соответственно

И

Случай 2

когда пользователь пишет

Parent1 (введите клавишу нажата)

  • Test1 (введите клавишу нажата)

  • Test2 (введите клавишу нажата)

  • Test3 (введите клавишу нажата)

В приведенном выше случае будет установлен флажок parent1 и 3 li's

Вещи, которые я достиг, но я открыт, чтобы принять новый путь, если более точным.

$('#checkbox').click(function() {
var $p = "";  
     var re = /\S/;
     $p = $('.outputBox');
      $p.contents()
      .filter(function() {    
        return this.nodeType == 3&& re.test(this.nodeValue);;  
     })
    .wrap('<label> <input type="checkbox" name="field_1" value="on" />')
});

Демоверсия FIDDLE

В основном новые флажки span, div, br или, в этом случае, li должны быть созданы в флажках.

Если существует какой-либо другой метод, который будет выполнять как требование, так и основное требование создания флажков, это очень приветствуется.

4b9b3361

Ответ 1

Почти каждый дал ответ на первый случай вопроса, но я нашел ответ на второй случай Я добавил две строки в событие click ПОКАЗАТЬ СОДЕРЖАНИЕ с CHECKBOX

Я думаю, @arthi sreekumar также получает меня li's в checkbox. Подпишитесь на это.

 $('.outputBox').find("ol").find("li").wrapInner(('<label style="display:block;"> <input type="checkbox" class="liolChk" name="field_1" value="on" />')); 
 $('.outputBox').find("ul").find("li").wrapInner(('<label style="display:block;"> <input type="checkbox" class="liolChk" name="field_1" value="on" />')); 

Скриншот Демо

Ответ 2

Вот возможное решение. Я сделал обход для самого внутреннего текстового элемента, а затем преобразовал его в флажок.

$('#checkbox').click(function() {
     var $p = "";  
     $p = $('.outputBox');
     wrapText($p);
});

function wrapText(domObj) {
    var re = /\S/;
    domObj.contents().filter(function() {
        if (this.nodeType === 1) {
            wrapText($(this));
        } else {
            return (this.nodeType === 3 && re.test(this.nodeValue));
         }
    })
    .wrap('<label> <input type="checkbox" name="field_1" value="on" /></label>');
}

Вот скрипка: http://jsfiddle.net/wLrfqvss/6/

Надеюсь, это то, что вы ищете.

Если вы хотите, чтобы это произошло только для определенных элементов, вы всегда можете добавить проверку так:

if (this.nodeType === 1 && this.tagName === 'DIV')

в приведенном выше коде.

Ответ 3

вы можете использовать шаблон для флажка вместо hardcoding html

<div id="template" style="visibility:hidden">
<label> <input type="checkbox" name="field_1" value="on" /></label>
</div>

в коде

$('#checkbox').click(function() {});

 function createElement()
{
 var targetElement=$("#template").clone(true);
 targetElement.removeAttr("style");
 targetElement.attr("name","new id");
 var $p = "";  
 var re = /\S/;
 $p = $('.outputBox');
  $p.contents()
  .filter(function() {    
    return this.nodeType == 3&& re.test(this.nodeValue);;  
 })
.wrap(targetElement)
}

это также обеспечит вам гибкость использования любого html-шаблона, поскольку код не является специфичным для управления

Ответ 4

Как насчет использования *(space) для генерации li? Я использовал regex и строку процесса для ее создания.

function update() {
    var str = $('#inputBox').html();
    $('#outputBox').html(str);
    $('#showHTML').text(str);

    str = str.replace(/(<br>$)/,'')
             .replace(/(<br>)/g,'$1\n')
             .replace(/\* (.*)/g, '<li>$1</li>')
             .replace(/^(?!<li>)/gm,'<input type="checkbox" name="field_1" value="on">')
             .replace(/^<li>(.*)<\/li>/gm,'<li><input type="checkbox" name="field_1" value="on">$1</li>');

    if(str.indexOf('<li>')!=-1) {
        var index = str.indexOf('<li>');
        var lastIndex; 
        str = str.substring(0, index) + '<ul>' + str.substring(index);        
        lastIndex = str.lastIndexOf('</li>') +  '</li>'.length+  1;
        str = str.substring(0, lastIndex) + '</ul>' + str.substring(lastIndex);
    }
    $('#translatedBox').html(str);
    $('#translatedHTML').text(str);
}

Вот jsfiddle

Ответ 5

Здравствуйте, я изменяю ваш код js следующим образом,

$('div[contenteditable=true]').blur(function() {



    $('.outputBox').append('<br>').append("<input type='checkbox' value='"+$(this).html()+"' />"+$(this).html());
$(this).html("");

 });




$('div[contenteditable=true]').keydown(function(e) {
    //$('.outputBox').html($(this).html()); i commented this line

Я надеюсь, что он работает так, как вы искали.