Красиво добавляйте элементы HTML в DOM с помощью JQuery

На данный момент я добавляю элементы в DOM с добавлением html внутри двойных кавычек, это может стать невероятно беспорядочным и очень трудным для чтения, особенно если у вас есть переменные внутри него, в React вы бы использовали JSX, который чистый, есть ли способ использовать JSX в обычном скрипте JQuery или что-то вроде JSX?

что ты уже испробовал? пожалуйста, поделитесь этим

Bhushan Kawadkar 26.09.2018 14:24

@bhushan kawadkar, пока ничего, поскольку я не могу найти решение, кроме как сделать беспорядочную строку html и переменных.

Elliott Coe 26.09.2018 14:28

@BhushanKawadkar Не каждый вопрос плох без кода. На самом деле это довольно интересная тема. Было бы интересно написать плагин jQuery, который сможет это сделать, если его еще нет.

Mark Baijens 26.09.2018 14:29

Эта проблема очень раздражает, когда вы работаете с конечными точками API, получающими пост-объекты, тогда вам нужно создать пост без JQuery, который затем будет добавлен в почтовый контейнер.

Elliott Coe 26.09.2018 14:31
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
5
4
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, два варианта:

  1. Литералы шаблона

  2. JSX

Литералы шаблона

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

let counter = 0;

$(`<table class = "main">
    <tbody>
        <tr>
            <td>Cell ${counter++}</td>
            <td>Cell ${counter++}</td>
        </tr>
        <tr>
            <td>Cell ${counter++}</td>
            <td>Cell ${counter++}</td>
        </tr>
    </tbody>
</table>`).appendTo(document.body);
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Определенно есть некоторая неловкость, но это намного лучше, чем строковые литералы.

Подробнее о шаблонных литералах на MDN.

JSX

JSX не ограничивается React. Он имеет свой собственная спецификация и несколько реализаций, таких как jsx-transform.

Например, вот простая оболочка Node.js, которая использует ее для преобразования файла:

var jsx = require('jsx-transform');

console.info(jsx.fromFile("input.jsx", {
  factory: 'be'
}));

Если бы input.jsx были:

let counter = 0;
let table =
    <table class = "main">
        <tbody>
            <tr>
                <td>Cell {counter++}</td>
                <td>Cell {counter++}</td>
            </tr>
            <tr>
                <td>Cell {counter++}</td>
                <td>Cell {counter++}</td>
            </tr>
        </tbody>
    </table>;
table.appendTo(document.body);

(Обратите внимание, что это class = "main", а не className = "main". Использование className вместо этого - вещь React, чтобы избежать проблемы, которая не была проблемой с момента выхода ES5 в 2009 году.)

Результатом будет:

let counter = 0;
let table =
    be('table', {class: "main"}, [
        be('tbody', null, [
            be('tr', null, [
                be('td', null, ["Cell ", counter++]),
                be('td', null, ["Cell ", counter++])
            ]),
            be('tr', null, [
                be('td', null, ["Cell ", counter++]),
                be('td', null, ["Cell ", counter++])
            ])
        ])
    ]);
table.appendTo(document.body);

Обратите внимание, как JSX-выражения были преобразованы в вызовы фабричной функции (be в этом примере; фабричная функция React - React.createElement). Все, что вам нужно сделать, это предоставить функцию be и интегрировать преобразователь в вашу цепочку сборки (jsx-transform поставляется предварительно запеченным с возможностью подключения к Browserify).

Ваш be, использующий jQuery, может выглядеть примерно так:

function be(tagName, attributes, children) {
    const result = $("<" + tagName + "/>");
    if (attributes) {
        result.attr(attributes);
    }
    if (children) {
        if (Array.isArray(children)) {
            for (const child of children) {
                result.append(child);
            }
        } else {
            result.append(child);
        }
    }
    return result;
}

Живой пример функции be с использованием преобразованного результата:

let counter = 0;
let table =
    be('table', {class: "main"}, [
        be('tbody', null, [
            be('tr', null, [
                be('td', null, ["Cell ", counter++]),
                be('td', null, ["Cell ", counter++])
            ]),
            be('tr', null, [
                be('td', null, ["Cell ", counter++]),
                be('td', null, ["Cell ", counter++])
            ])
        ])
    ]);
table.appendTo(document.body);

function be(tagName, attributes, children) {
    const result = $("<" + tagName + "/>");
    if (attributes) {
        result.attr(attributes);
    }
    if (children) {
        if (Array.isArray(children)) {
            for (const child of children) {
                result.append(child);
            }
        } else {
            result.append(child);
        }
    }
    return result;
}
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Удивительно, но все действительно так просто.

Мне кажется, что шаблонные литералы - это путь вперед, но реализация JSX выглядит интересной. Спасибо!

Elliott Coe 26.09.2018 14:58

Другие вопросы по теме