Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Нужно из всего кода оставить только BODY, но body вырезается. Торможу (https://javascript.ru/forum/jquery/69957-nuzhno-iz-vsego-koda-ostavit-tolko-body-no-body-vyrezaetsya-tormozhu.html)

Stenli 30.07.2017 20:58

Нужно из всего кода оставить только содержимое BODY, но body вырезается
 
Есть код под спойлером:

$(document).ready(function() {

    var Final = '';

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

        var insertData = $('#insertArea').val();
        var div = $("<div>", {html : insertData});

// only body content with internal tags

        var bodyVal = $('body', div).html();
        $(div).empty();
        $(div).remove();
        $(div).html('bodyVal');

// find and replace all href links to {{ $landing_url }}

        $('a', div).attr("href","{{ $landing_url }}");

// find and replace all img to {{ $landing_url }}

        $('img', div).each(function (i,el) {
            var srcVal=el.src.substr(el.src.lastIndexOf("/")+1,el.src.length);
            $(this).attr("src","{{ asset('layers/'. $template_folder .'/img/" + srcVal + "') }}");
        });

// delete tag script, iframe, noscript with content

        $('script', div).empty();
        $('noscript', div).empty();
        $('iframe', div).empty();

        $('script', div).remove();
        $('noscript', div).remove();
        $('iframe', div).remove();

// display result

        Final += "@include('layers.header')<body>" + div.html() + "@include('layers.footer')";
        $('#pastArea').val(Final);

    });

});

Задумка такая, что из:

<doctype! html>
<html>
<head></head>
<body>
<div></div>
</body>
</html>

Должно оставаться это:
<div></div>

Но при конвертации исчезают теги <head>, <body>, <html> при этом все их содержимое остается, хотя я jQuery такого не просил. А потому я не могу извлечь содержимое <body>.

Что не так? Догадываюсь, что дело в 7,8 строке кода, но я там не очень могу понять.

рони 30.07.2017 21:25

Stenli,
:-? подожду телепата ...

Stenli 30.07.2017 21:30

Цитата:

Сообщение от рони (Сообщение 460117)
Stenli,
:-? подожду телепата ...

Профессор, продуктивнее будет если скажете, где я сморозил или что не понятно. Зачем пальцы-то гнуть?

рони 30.07.2017 21:33

Stenli,
я не понимаю, что вы хотите сделать.

Stenli 30.07.2017 21:41

Понял, осознал.

Это ответвление темы этой: http://javascript.ru/forum/jquery/69...lavleniya.html

Суть такая, что в первый textarea помещается код HTML, а во втором textarea должен появится сконвертированный, очищенный код.

То есть я вставляю код
<doctype! html>
<html>
<head></head>
<body>
<div></div>
</body>
</html>


jQuery думает и выдает это, удаляя все ненужное:
<div></div>


Только jQuery почему-то удаляет теги, которые я не просил удалять. В частности тег <body>.

рони 30.07.2017 21:51

Stenli,
ок -- видимо браузер считает что одного body на страницу достаточно.

Stenli 30.07.2017 21:55

Мы сегодня похоже не понимаем друг друга :-)

Браузер тут не должен ничего понимать, мне кажется. Все изменения происходят не на сайте, а внутри формы textarea - объяснил как мог.

Это нечто похожее, как вы мне советовали, когда был вопрос об автооглавлении (пример по ссылке выше). Только тут не оглавление сделать, а вытащить некоторое содержимое.

рони 30.07.2017 22:15

Stenli,
пока не знаю

Stenli 31.07.2017 00:17

Цитата:

Сообщение от рони (Сообщение 460123)
Stenli,
ок -- видимо браузер считает что одного body на страницу достаточно.

Кажется вник в эту фразу. А потому стал искать по просторам, нашел схожую проблему у одного человека. У него частично получилось сделать то, что нужно - извлечь содержимое BODY.

Только помогите разобраться, как он это провернул: ссыль

Или тут что-то нарешали, но я не пойму как: ссыль

рони 31.07.2017 01:41

Stenli,
ждите специалиста...
Цитата:

Сообщение от Stenli
нужно - извлечь содержимое BODY.

Цитата:

Сообщение от Stenli
jQuery думает и выдает это, удаляя все ненужное:
<div></div>

<div></div> это же и есть содержимое или вам нужно что-то иное?

рони 31.07.2017 01:47

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() {

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

        var insertData = $('#insertArea').val();
        var div = $("<div>", {html : insertData});
        $('#pastArea').val($(">", div).html().trim());

    });

    });

  </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"><doctype! html>
<html>
<head></head>
<body>
<div></div>
</body>
</html>

            </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>

Stenli 31.07.2017 03:12

Спасибо, Рони за время, но немного не то.

Цитата:

Сообщение от Stenli
Но при конвертации исчезают теги <head>, <body>, <html> при этом все их содержимое остается, хотя я jQuery такого не просил. А потому я не могу извлечь содержимое <body>.

Смотрите, то есть, если на старте имеем:

<doctype! html>
<head>
<meta example 1>
<meta example 2>
<link example 1>
<link example 2>
</head>
<body>
<div>
example 1
</div>
<div>
example 2
</div>
</body>
</html>

То после конвертации получаем:

<meta example 1>
<meta example 2>
<link example 1>
<link example 2>

<div>
example 1
</div>
<div>
example 2
</div>

Куда-то исчезают <body>, <head>, в итоге в JS-код они не попадают и я не могу от них оттолкнуться, чтобы захватить то, что внутри них.

Как правильно заметил Рони, тут браузер что-то химичит, считая <body> внутри <textarea> лишним... наверное.

Полный HTML:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" type="text/css" href="assets/css/bootstrap/bootstrap.min.css">
    <link rel="stylesheet" type="text/css" href="assets/css/main.css">
    <script type="text/javascript" src="assets/js/jquery-3.2.1.min.js"></script>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script type="text/javascript" src="assets/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="assets/js/preland.js"></script>
    <title>Preland convert</title>
</head>

<body>



<div class="container">


    <div class="row">



            <div class="text-center" style="margin-top: 20px;">
                <button type="button" name="sendTo" value="Send to" id="sendTo" class="btn btn-success">Адаптировать</button>
            </div>
            <div class="text-center" style="font-size: 12px; margin: 10px;">Каждый новый текст требует обновления страницы (F5 на клавиатуре или кнопка обновить <span class="glyphicon glyphicon-repeat"></span>)</div>
            <hr />

            <div class="col-lg-12">
                <label>Введите html-текст, который нужно адаптировать (правая кнопка мыши + вставить или Ctrl+V)</label>
                <textarea class="form-control" name="insertArea" id="insertArea" cols="80" rows="10">
                </textarea>
            </div>





            <div class="col-lg-12" style="margin-top: 10px;">
                <label>Скопируйте/вырежьте адаптированный html-текст (правая кнопка мыши + копировать или Ctrl+C/X)</label>
                <textarea class="form-control" name="pastArea" id="pastArea" cols="80" rows="10"></textarea>
            </div>
            <br>



    </div>
</div>


</body>
</html>

Полный JS:
$(document).ready(function() {

    var Final = '';

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

        var insertData = $('#insertArea').val();
        var bodyVal = $("<body>", {html : insertData});
        var div = $("<div>", {html : insertData});

// only body content with internal tags

        $(div).empty();
        $(div).remove();
        $(div).html(bodyVal);

// find and replace all href links to {{ $landing_url }}

        $('a', div).attr("href","{{ $landing_url }}");

// find and replace all img to {{ $landing_url }}

        $('img', div).each(function (i,el) {
            var srcVal=el.src.substr(el.src.lastIndexOf("/")+1,el.src.length);
            $(this).attr("src","{{ asset('layers/'. $template_folder .'/img/" + srcVal + "') }}");
        });

// delete tag script, iframe, noscript with content

        $('script', div).empty();
        $('noscript', div).empty();
        $('iframe', div).empty();

        $('script', div).remove();
        $('noscript', div).remove();
        $('iframe', div).remove();

// replace dates
        var reg = /\d{2}\.\d{2}\.\d{4}/g;
        $(div).html(function (a,h) {
            return h.replace(reg, '<?=date('+'d.m.Y'+', strtotime('+'0 day'+'));?>');
        });


// display result

        Final += "@include('layers.header') <body> " + div.html() + " @include('layers.footer')";
        $('#pastArea').val(Final);

    });

});

Вопрос все тот же: как вытащить содержимое тега <body>?
Путаница может быть в том, что цель моего jQuery обработать не код своей страницы, а код помещенный в <textarea>.

И, да, простите за мою тупость - не сразу правильно поставил вопрос. Впрочем я и сейчас не уверен до конца, что все понятно.

j0hnik 31.07.2017 04:12

<!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() {

  $('#sendTo').on('click', function () {
        var str = $('#insertArea').val();
        str = str.substring(str.indexOf('<body>')+6, str.lastIndexOf('</body>')).trim();
        $('#pastArea').val(str);
    });

    });

  </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"><doctype! html>
<head>
<meta example 1>
<meta example 2>
<link example 1>
<link example 2>
</head>
<body>
<div>
example 1
</div>
<div>
example 2
</div>
</body>
</html>

            </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>


Ты умеешь запутать, не уверен что это то что нужно.

Stenli 31.07.2017 06:59

Вот она! Спасибо :dance:

Там еще кое-что поддоделал, чтобы можно было еще работать с данными, типа удалять скрипты, менять даты и так далее. Тема решена. Карму поднял чуть раньше.

И отдельное спасибо за терпение всем профессорам.

Ключевые строки:
var bodyVal = $('#insertArea').val();
bodyVal = bodyVal.substring(bodyVal.indexOf('<body>')+6, bodyVal.lastIndexOf('</body>')).trim();
var div = $("<div>", {html : bodyVal});

Теперь, если надо, например, удалить все скрипты и их содержимое из оставшегося куска кода, то просто дополняем скрипт:
$('script', div).empty();
$('script', div).remove();


Часовой пояс GMT +3, время: 08:21.