Как опубликовать содержимое редактора Quill в форме?

У меня есть, как мне кажется, очень распространенный сценарий. Обычно у меня есть такая форма:

<form method="post">

<textarea name="text"></textarea>
<input type="submit" value="Save" />

</form>

Затем с помощью PHP я мог бы захватить данные из формы ($ _POST ['text']) и использовать их в другой переменной.

Теперь я хотел бы использовать Quill, чтобы вместо этого у пользователей был хороший редактор форматированного текста. Quill кажется очень подходящим для этого, и документация очень подробная. Однако по какой-то причине я не могу найти, как «разместить» данные в форме. Есть одна страница с одним примером, которая выполняет то, что я хочу, но я не могу полностью реализовать это в моем примере и в кратком руководстве, эта довольно фундаментальная (для меня) тема не обсуждается , и я не могу найти этого в документации.

Можно ли так использовать Quill? Я что-то контролирую? Есть ли рекомендуемый способ сделать эту работу?

Вот что у меня сейчас есть:

<!doctype html>
<html>
<head>
<title>Test</title>
<meta charset="UTF-8" />
<link href="https://cdn.quilljs.com/1.0.0/quill.snow.css" rel="stylesheet">
</head>
<body>
<form method="post">


<!-- Create the toolbar container -->
<div id="toolbar">
  <button class="ql-bold">Bold</button>
  <button class="ql-italic">Italic</button>
</div>


<form method="post">

<!-- Create the editor container -->
<div id="editor">
  <p>Hello World!</p>
</div>

<input type="submit" value="Save" />

</form>

<!-- Include the Quill library -->
<script src="https://cdn.quilljs.com/1.0.0/quill.js"></script>

<!-- Initialize Quill editor -->
<script>
  var editor = new Quill('#editor', {
    modules: { toolbar: '#toolbar' },
    theme: 'snow'
  });
</script>
</body>
</html>

person user32421    schedule 09.06.2017    source источник
comment
Я продолжал исследовать это, и похоже, что Quill на самом деле не предназначен для этого (github.com/ quilljs / quill / issues / 774). К сожалению, кажется, что Quill - не лучшее решение для того, чтобы пользователи вводили форматированный текст и сохраняли HTML в базе данных. Но я до сих пор не совсем понимаю, почему и так ли это на самом деле, поэтому, если кто-то может пролить свет на ситуацию, сделайте это.   -  person user32421    schedule 10.06.2017
comment
Вот недавнее обсуждение (github.com/quilljs/quill/issues/1234) . Предлагается сохранить innerHTML и массив дельт. Чтобы опубликовать innerHTML, см. этот ответ, но замените var question = advancedEditor.getText() на editor.container.innerHTML.   -  person ourmandave    schedule 11.06.2017


Ответы (11)


Вы можете проверить соответствующее обсуждение https://github.com/quilljs/quill/issues/87 < / а>

Пока это не идеальное решение:

var myEditor = document.querySelector('#editor')
var html = myEditor.children[0].innerHTML
person erw13n    schedule 12.06.2017
comment
Спасибо. Почему это так сложно? Какова цель Quill, если такого рода вещи так трудно достичь? - person user32421; 13.06.2017
comment
Этот ответ кажется довольно простым ... +1 - person Mike Barwick; 12.09.2017
comment
Вот как я подошел к этому, прежде чем искать решение в Google. Кажется довольно простым. - person germs12; 12.12.2018
comment
Вопрос ко мне тот же. Они создали такой удивительный инструмент, который столько лет не делал никто. Но они не говорят, как сформировать данные и опубликовать их! В чем суть этого плагина :) Шикарно! Нет! - person Gediminas; 12.02.2020
comment
Отвечает ли он на вопрос и добавляет ли все содержимое в предоставленное текстовое поле? Я не вижу в ответе никакого метода для этого. Только сбор данных. Спасибо! - person Gediminas; 12.02.2020

<form method="post" id="identifier">

<div id="quillArea"></div>

<textarea name="text" style="display:none" id="hiddenArea"></textarea>
<input type="submit" value="Save" />

</form>

Если вы дадите форме идентификатор, то с помощью jQuery вы сможете сделать следующее:

var quill = new Quill ({...}) //definition of the quill

$("#identifier").on("submit",function(){
$("#hiddenArea").val($("#quillArea").html());
})

Вместо HTML вы можете использовать quill.getContents () для получения дельты.

person GazEdBro    schedule 28.06.2018
comment
Если вы хотите получить только контент, вы можете добавить .ql-editor в свой селектор: $("#hiddenArea").val($("#quillArea .ql-editor").html()); - person Adrien V; 30.07.2020
comment
При использовании getContents () для получения дельт вы также должны преобразовать его в json, иначе [Object object] отправляется. $("#hiddenArea").val(JSON.stringify(quill.getContents())) - person naghal; 27.05.2021

Вот код, который я использовал для этого:

$(document).ready(function(){
  $("#theform").on("submit", function () {
    var hvalue = $('.ql-editor').html();
    $(this).append("<textarea name='content' style='display:none'>"+hvalue+"</textarea>");
   });
});

По сути, он добавляет скрытое текстовое поле в вашу форму и копирует в него содержимое контейнера «ql-editor» (это автоматически выполняется редактором Quill Editor в контейнере div). Текстовое поле будет отправлено вместе с формой. Вам необходимо изменить идентификаторы, используемые в коде, на идентификаторы тегов вашего контейнера.

person eLeMeNOhPi    schedule 17.12.2018

Решение, которое я придумал, заключалось в создании класса-оболочки.

class QuillWrapper {

    /**
     * @param targetDivId { string } The id of the div the editor will be in.
     * @param targetInputId { string } The id of the hidden input
     * @param quillOptions { any } The options for quill
     */
    constructor(targetDivId, targetInputId, quillOptions) {

        //Validate target div existence
        this.targetDiv = document.getElementById(targetDivId);
        if (!this.targetDiv) throw "Target div id was invalid";

        //Validate target input existence
        this.targetInput = document.getElementById(targetInputId);
        if (!this.targetInput) throw "Target input id was invalid";

        //Init Quill
        this.quill = new Quill("#" + targetDivId, quillOptions);

        //Bind the two containers together by listening to the on-change event
        this.quill.on('text-change',
            () => {
                this.targetInput.value = this.targetDiv.children[0].innerHTML;
            });
    }
}

Просто включите класс где-нибудь на своей странице, а затем используйте следующее для его инициализации:

    let scopeEditor = new QuillWrapper("ScopeEditor", "Scope", { theme: "snow" });

Ваш html будет выглядеть примерно так:

<div class="form-group">
     <label asp-for="Scope" class="control-label col-md-2"></label>  
     <div id="ScopeEditor"></div>
     <input type="hidden" asp-for="Scope" class="form-control" />
</div>
person Maxwell Devos    schedule 29.05.2019

Я делаю это:

var quill = new Quill('.quill-textarea', {
            placeholder: 'Enter Detail',
            theme: 'snow',
            modules: {
                toolbar: [
                    ['bold', 'italic', 'underline', 'strike'],
                    [{ 'list': 'ordered'}, { 'list': 'bullet' }],
                    [{ 'indent': '-1'}, { 'indent': '+1' }]
                ]
            }
        });

        quill.on('text-change', function(delta, oldDelta, source) {
            console.log(quill.container.firstChild.innerHTML)
            $('#detail').val(quill.container.firstChild.innerHTML);
        });

Где-то в форме:

<div class="quill-textarea"></div>
<textarea style="display: none" id="detail" name="detail"></textarea>
person Emeka Mbah    schedule 17.09.2019

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

https://stackoverflow.com/a/42541886/2910546

Здесь также стоит отметить: вопрос автора задавали как минимум 2 года назад. Итак, сегодня, я считаю, что это наиболее эффективный способ ответить на вопрос.

Для получения дополнительной информации о Quill, с примерами тематических исследований и распространенными вопросами с ответами, пожалуйста, перейдите по следующей ссылке:

https://github.com/loagit/Quill-Examples-and-FAQ

person Loa    schedule 13.01.2020
comment
Знаете ли вы, возможно ли получить содержимое HTML, но с учетом новых строк в том виде, в котором они были изначально в документе? Потому что кажется, что по умолчанию редактор помещает весь HTML в одну строку, как только он инициализируется. - person Digital Ninja; 20.01.2020
comment
@DigitalNinja Я думаю, что сам Quill не имеет такой функциональности, но вы можете получить то, что хотите, используя любой HTML Beautifier. Существуют онлайн-инструменты, которые могут выполнять этот тип процедуры, а также библиотеки в javascript, например выделить js. Оба могут дать желаемый результат. - person Loa; 22.01.2020

Решено здесь

Как сохранить значения Quill.js в базе данных Laravel 5.6

Добавьте скрытый ввод:

<input type="hidden" name="body"/>

Js-код:

var form = document.getElementById("FormId"); // get form by ID

form.onsubmit = function() { // onsubmit do this first
                             var name = document.querySelector('input[name=body]'); // set name input var
                             name.value = JSON.stringify(quill.getContents()); // populate name input with quill data
                             return true; // submit form
                           }
To set contents to quill do this :

quill.setContents({!! $post->body !!});
person ztvmark    schedule 07.04.2020

это то, что я использую, все, что вам нужно сделать, это указать атрибут data-name для тега редактора. это создаст скрытый ввод как родственный элемент тегу вашего редактора и поместит внутрь HTML-содержимое. вы можете получить другие форматы вашего содержимого, я оставил неиспользуемые переменные, если вам нужно знать, как их получить.

html:

<div class="field editor" data-name="experience"></div>

js:

let quill_element = document.querySelector('.editor')
let quill = new Quill(quill_element, {
    modules: {
        toolbar: '#toolbar'
    },
    placeholder: document.querySelector('.editor').getAttribute('data-placeholder'),
    theme: 'bubble',
});

let hiddenInput = document.createElement('input');
hiddenInput.type = 'hidden';
hiddenInput.name = quill_element.getAttribute('data-name');
quill_element.parentElement.appendChild(hiddenInput);

quill.on('text-change', function () {
    let justHtml = quill.root.innerHTML;
    hiddenInput.value = justHtml;
    // other formats if you like to use..
    var delta = editor.getContents();
    var text = editor.getText();
});
person Pezhvak    schedule 20.11.2020

Попробуй это:

<!-- Include the Quill library -->
<script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>

<!-- Initialize Quill editor -->
<script>
    var quill = new Quill('#editor', {
        modules: {
            toolbar: [
                ['bold', 'italic'],
                ['link', 'blockquote', 'code-block', 'image'],
                [{
                    list: 'ordered'
                }, {
                    list: 'bullet'
                }]
            ]
        },
        placeholder: 'Compose an epic...',
        theme: 'snow'
    });

    $("#form").submit(function() {
        $("#description").val(quill.getContents());
    });
</script>
person Erich García    schedule 29.05.2019

Это сработало для меня:

<!-- Include the Quill library -->
<script src="https://cdn.quilljs.com/1.3.6/quill.js"></script>

<!-- Initialize Quill editor -->
<script>
    var quill = new Quill('#editor', {
        modules: {
            toolbar: [
                ['bold', 'italic'],
                ['link', 'blockquote', 'code-block', 'image'],
                [{
                    list: 'ordered'
                }, {
                    list: 'bullet'
                }]
            ]
        },
        placeholder: 'Compose an epic...',
        theme: 'snow'
    });

    $("#form").submit(function() {
        $("#description").val(quill.getContents());
    });
</script>
person Erich García    schedule 29.05.2019

это решение отлично работает для меня:

    <script type="text/javascript">
    $(document).ready(function(){
      $("#emailForm").on("submit", function () {
        var hvalue = $('.editor').text();
        $(this).append("<textarea name='message' style='display:none'>"+hvalue+"</textarea>");
       });
    });
    </script>
person Mahmoud    schedule 20.03.2020