Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.06.2017, 11:13
Аспирант
Отправить личное сообщение для Stenli Посмотреть профиль Найти все сообщения от Stenli
 
Регистрация: 25.06.2017
Сообщений: 36

Обработка определенных тегов в тексте помещенном в textarea (для оглавления)
Здравствуйте.

Я не могу понять что-то. Прошу помощи с этим:

В одно textarea я помещаю html-содержимое, далее по нажатию на кнопке скрипт должен проанализировать содержимое и каждому header добавить id, кроме того, в начало кода добавляется список с <a>, указывающий на тот или иной header.

Сейчас имею кое-что работающее, но не правильно:
1. Появляется лишний и пустой <a>
2. Внутрь header не вставляется id
3. Обрабатывает не только header, но и каждый тег, например <p>.

$(document).ready(function() {

    var ToC = '<nav role="navigation" class="table-of-contents">' + '<h1>On this page:</h1>' + '<ul>';
    var newLine, el, title;

	$('#sendTo').on('click', function () {

        var insertData = $('#insertArea').val();

        $(insertData,':header').each(function () {

             // if ( $(this) === 'h2' ) {

            	el = $(this);
                title = el.text();
                $('el').attr('id' + title);

                newLine = '<li>' + '<a href="#' + title + '">' + title + '</a>' + '</li>';
                ToC += newLine;

             // }

        });

        ToC += '</ul>' + '</nav>' + insertData;
        $('#pastArea').val(ToC);

    });

    });


<!DOCTYPE html>
<html>
<head>


	<title></title>
</head>
<body>


    <form name="insertForm" id="insertForm">
        <div style="width:45%; float: left; margin: auto;">
            <textarea name="insertArea" id="insertArea" cols="80" rows="40"></textarea>
        </div>
    </form>
    <br>

    <input type="button" name="sendTo" value="Send to" id="sendTo">

    <form name="pastForm" id="pastForm">
        <div style="width:45%; float: right; margin: auto;">
            <textarea name="pastArea" id="pastArea" cols="80" rows="40"></textarea>
        </div>
    </form>
    <br>

    <script type="text/javascript" src="jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="cm.js"></script>

</body>
</html>


Было бы здорово, если б не только подсказали, как извлечь из insertData заголовки, но и направили, чтобы я почитал и понял, где не прав.

Спасибо.

Последний раз редактировалось Stenli, 27.06.2017 в 09:29.
Ответить с цитированием
  #2 (permalink)  
Старый 25.06.2017, 11:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Stenli,
можно html на входе и выходе? для примера
Ответить с цитированием
  #3 (permalink)  
Старый 25.06.2017, 15:35
Аспирант
Отправить личное сообщение для Stenli Посмотреть профиль Найти все сообщения от Stenli
 
Регистрация: 25.06.2017
Сообщений: 36

С удовольствием. Можете обратить внимание, что в <a> попадает иногда то, что надо.

На входе:
<h2>Лечение цистита</h2>
<p>Для того чтобы устранить неприятные признаки цистита и привести мочевой пузырь в порядок, нужно принимать лекарства следующих типов:</p>
<ul>
<li>антибактериальные средства;</li>
<li>растительные препараты;</li>
<li>спазмолитики;</li>
<li>нестероидные противовоспалительные;</li>
<li>иммуномодуляторы и пробиотики.</li></ul>
<blockquote>

<h3><a id="Нолицин" name="Нолицин"></a>Нолицин</h3>
<p>Этот медикамент содержит норфлоксацин, который очень эффективно воздействует на возбудителей цистита. Обычно Нолицин и его аналоги (Норбактин, Нормакс) назначаются в тех случаях, когда другие антибиотики не оказали должного воздействия на цистит. Активное действующее вещество не накапливается в других органах, а концентрируется в моче, что позволяет омывать поврежденную слизистую оболочку мочевого пузыря.</p>


На выходе:
<nav role="navigation" class="table-of-contents">
<h1>On this page:</h1>
<ul>
<li><a href="#Лечение цистита">Лечение цистита</a></li>
<li><a href="#"></a></li>
<li><a href="#Для того чтобы устранить неприятные признаки цистита и привести мочевой пузырь в порядок, нужно принимать лекарства следующих типов:">Для того чтобы устранить неприятные признаки цистита и привести мочевой пузырь в порядок, нужно принимать лекарства следующих типов:</a></li>
<li><a href="#"></a></li>
<li><a href="#
антибактериальные средства;
растительные препараты;
спазмолитики;
нестероидные противовоспалительные;
иммуномодуляторы и пробиотики.">
антибактериальные средства;
растительные препараты;
спазмолитики;
нестероидные противовоспалительные;
иммуномодуляторы и пробиотики.</a></li>

<li><a href="#"></a></li>

<li><a href="#
Нолицин
Этот медикамент содержит норфлоксацин, который очень эффективно воздействует на возбудителей цистита. Обычно Нолицин и его аналоги (Норбактин, Нормакс) назначаются в тех случаях, когда другие антибиотики не оказали должного воздействия на цистит. Активное действующее вещество не накапливается в других органах, а концентрируется в моче, что позволяет омывать поврежденную слизистую оболочку мочевого пузыря.">

Нолицин
Этот медикамент содержит норфлоксацин, который очень эффективно воздействует на возбудителей цистита. Обычно Нолицин и его аналоги (Норбактин, Нормакс) назначаются в тех случаях, когда другие антибиотики не оказали должного воздействия на цистит. Активное действующее вещество не накапливается в других органах, а концентрируется в моче, что позволяет омывать поврежденную слизистую оболочку мочевого пузыря.</a></li></ul></nav>

<h2>Лечение цистита</h2>

<p>Для того чтобы устранить неприятные признаки цистита и привести мочевой пузырь в порядок, нужно принимать лекарства следующих типов:</p>

<ul>
<li>антибактериальные средства;</li>
<li>растительные препараты;</li>
<li>спазмолитики;</li>
<li>нестероидные противовоспалительные;</li>
<li>иммуномодуляторы и пробиотики.</li></ul>

<blockquote>

<h3><a id="Нолицин" name="Нолицин"></a>Нолицин</h3>
<p>Этот медикамент содержит норфлоксацин, который очень эффективно воздействует на возбудителей цистита. Обычно Нолицин и его аналоги (Норбактин, Нормакс) назначаются в тех случаях, когда другие антибиотики не оказали должного воздействия на цистит. Активное действующее вещество не накапливается в других органах, а концентрируется в моче, что позволяет омывать поврежденную слизистую оболочку мочевого пузыря.</p>


Спойлера здесь нету, да?

Последний раз редактировалось Stenli, 27.06.2017 в 09:29.
Ответить с цитированием
  #4 (permalink)  
Старый 25.06.2017, 16:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Stenli
Можете обратить внимание, что в <a> попадает иногда то, что надо.

на выходе хотелось вариант того что вам нужно.
Сообщение от Stenli
Спойлера здесь нету, да?
[JS hide][/JS]

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #5 (permalink)  
Старый 25.06.2017, 17:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Stenli,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(document).ready(function() {

    var ToC = '<nav role="navigation" class="table-of-contents">' + '<h1>On this page:</h1>' + '<ul>';
    var newLine, el, title;

  $('#sendTo').on('click', function () {

        var insertData = $('#insertArea').val();
        var div = $("<div>", {html : insertData});
        $(':header', div).each(function (i,el) {
            	el = $(el);
                var title = el.text();
                el.attr('id' , title).html(title);
                newLine = '<li>' + '<a href="#' + title + '">' + title + '</a>' + '</li>';
                ToC += newLine;
        });
        ToC += '</ul>' + '</nav>' + div.html();
        $('#pastArea').val(ToC);

    });

    });

  </script>
</head>

<body>
<form name="insertForm" id="insertForm">
        <div style="width:45%; float: left; margin: auto;">
            <textarea name="insertArea" id="insertArea" cols="80" rows="40">
            </textarea>
        </div>
    </form>
    <br>

    <input type="button" name="sendTo" value="Send to" id="sendTo">

    <form name="pastForm" id="pastForm">
        <div style="width:45%; float: right; margin: auto;">
            <textarea name="pastArea" id="pastArea" cols="80" rows="40"></textarea>
        </div>
    </form>
    <br>



</body>
</html>
Ответить с цитированием
  #6 (permalink)  
Старый 25.06.2017, 17:10
Аспирант
Отправить личное сообщение для Stenli Посмотреть профиль Найти все сообщения от Stenli
 
Регистрация: 25.06.2017
Сообщений: 36

А, ок!

На входе:
<h2>Лечение цистита</h2>

<h3>Нолицин</h3>
<p>Этот медикамент содержит норфлоксацин, который очень эффективно воздействует на возбудителей цистита. Обычно Нолицин и его аналоги (Норбактин, Нормакс) назначаются в тех случаях, когда другие антибиотики не оказали должного воздействия на цистит. Активное действующее вещество не накапливается в других органах, а концентрируется в моче, что позволяет омывать поврежденную слизистую оболочку мочевого пузыря.</p>



На выходе:
<ul>
<li><a href="#Лечение цистита">Лечение цистита</a>
<ul>
<li><a href="#Нолицин">Нолицин</a></li>
</ul>
</li>
</ul>

<h2><a id="Лечение цистит" name="Лечение цистит"></a>Лечение цистита</h2>

<h3><a id="Нолицин" name="Нолицин"></a>Нолицин</h3>
<p>Этот медикамент содержит норфлоксацин, который очень эффективно воздействует на возбудителей цистита. Обычно Нолицин и его аналоги (Норбактин, Нормакс) назначаются в тех случаях, когда другие антибиотики не оказали должного воздействия на цистит. Активное действующее вещество не накапливается в других органах, а концентрируется в моче, что позволяет омывать поврежденную слизистую оболочку мочевого пузыря.</p>


Спасибо

UPD: Увидел ваш пост. Сейчас обмозгую.

Последний раз редактировалось Stenli, 27.06.2017 в 09:28.
Ответить с цитированием
  #7 (permalink)  
Старый 25.06.2017, 17:17
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Stenli,
смотрите вариант выше может устроит
<h3 id="Нолицин">Нолицин</h3>
вместо
<h3><a id="Нолицин" name="Нолицин"></a>Нолицин</h3>

иначе замениите el.attr('id' , title).html(title); на
el.html('<a id="' + title + '"></a>'+title);
добавьте нужное

Последний раз редактировалось рони, 25.06.2017 в 17:19.
Ответить с цитированием
  #8 (permalink)  
Старый 27.06.2017, 08:46
Аспирант
Отправить личное сообщение для Stenli Посмотреть профиль Найти все сообщения от Stenli
 
Регистрация: 25.06.2017
Сообщений: 36

Спасибо, работает на ура. Только подскажите, в этом коде, что такое
var div = $("<div>", {html : insertData});

на 19-й строке.

Я понимаю, что в переменную загоняется содержимое texarea, но ведь вроде бы оно уже помещено в insertData. Почему конструкция {html : insertData} в фигурных скобках? html: - это, видимо, не знаю, для сохранения тегов?

Дайте только название, остальное попробую сам найти, почитать и понять.

------------

Ведь пробую по аналогии удалить все <p>

$('p', div).each(function () {$(this).remove(':empty');});


Но не выходит.

Особенно интересует, что происходит здесь: {html : insertData}
Ответить с цитированием
  #9 (permalink)  
Старый 27.06.2017, 09:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Stenli
Ведь пробую по аналогии удалить все <p>

$('p', div).remove()


Сообщение от Stenli
что такое
var div = $("<div>", {html : insertData});
тоже что
var div = document.createElement("div");
    div.innerHTML = insertData;

чтобы работать с текстом как с html и сохранять id прочее где-то, div как контейнер.
Ответить с цитированием
  #10 (permalink)  
Старый 27.06.2017, 09:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от Stenli
Почему конструкция {html : insertData} в фигурных скобках?
это обьект с данными для формирования элемента
можно добавиить css, on, attr и всё остальное
http://api.jquery.com/jQuery/#jQuery-html-attributes
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка события click для iframe dqrest Events/DOM/Window 0 22.09.2015 10:17
кнопки тегов для textarea sones Элементы интерфейса 8 17.05.2015 18:01
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00
Вставка данных в textarea из модального окна (для Markitup) Roman Koff jQuery 0 26.08.2010 23:21