Парсинг BBCode через AJAX

Список разделов phpBBex 1.x (поддерживается) Пожелания 1.x

Описание: В phpBBex 1.x чего-то не хватает? Напишите об этом здесь, и мы постараемся исправиться.
Правила раздела: Одна тема — один запрос новой возможности. Обязательно формируйте внятный заголовок, максимально отражающий суть вашей идеи. Также приведите примеры, где предлагаемая вами возможность будет актуальна.
Модератор: Поддержка

Сообщение #81 factotum » 06.10.2013, 20:47

Sumanai:Вот ещё- гостями так и не отправляется. Я кажется знаю почему- мешает код VEG, который от ботов защищает, капчи не причём.
эмммммм. вы используете файл из моего архива?
проверял - работает для гостей. возвращает ошибки
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #82 Sumanai » 06.10.2013, 20:59

factotum:Подправленный код с поддержкой IE < 10
Мусора нет

Работы тоже :smile:

factotum:мммммм. вы используете файл из моего архива?

Я чего только не использовал.

factotum:проверял - работает для гостей. возвращает ошибки

Вот именно. А должно показывать превью.
Кстати ошибки тоже надо стирать перед вставкой следующих, а то плодятся.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #83 factotum » 06.10.2013, 21:30

Sumanai:А должно показывать превью.
ах вы про это... превью не показывает и в дефолтном phpBBex - подавай имя, капчу и чего там еще. Текущая версия повторяет ровно то, что делает сам phpBBex

Sumanai:Кстати ошибки тоже надо стирать перед вставкой следующих, а то плодятся.
стирало :ill:

Добавлено спустя 5 минут 45 секунд:
переписал код JS, убрав устаревшие методы:
Код: Выделить всё
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var $form = $(form)
         var url = form.action
            .replace('posting.php', 'postingajax.php')
            .replace('ucp.php', 'ucpjax.php')
         $.post( url, $form.serialize() )
         .done(function( data ) {
            // console.log("data:",data)
            if ($("#preview").length){
               $preview = $("#preview")
               $preview.next("hr").remove()
               $preview.remove()
            }
            $(".alert").remove()
            $(".post:last").after(data)
            target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
            $('html, body').animate({
               scrollTop: $(target).offset().top
            }, 200)
         })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)
нужны небольшие правки на стороне PHP - пропарсить полученные данные
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #84 Sumanai » 06.10.2013, 21:36

factotum:ах вы про это... превью не показывает и в дефолтном phpBBex - подавай имя, капчу и чего там еще.

Только вот дефолтная версия при предъявлении всего этого нормально показывает превью, а ваша отлупливает со стандартным сообщением.
Вот эта антибот функция, работу которой необходимо выполнить перед предпросмотром сообщения костями:
Код: Выделить всё
   <input type="hidden" name="creation_time" value="0" />
   <input type="hidden" name="form_token" value="0" />
   <script type="text/javascript">
   jQuery(function($)
   {
      $('#postform').submit(function()
      {
         $('inp'+'ut[na'+'me=crea'+'tion_t'+'ime]').val('{RAW_CREATION_TIME}');
         $('in'+'pu'+'t[name'+'=for'+'m_to'+'ken]').val('{RAW_FORM_TOKEN}');
      });
   });
   </script>

Добавлено спустя 4 минуты 38 секунд:
factotum:нужны небольшие правки на стороне PHP - пропарсить полученные данные

Да не небольшие. В phpBB везде используется request_var, придётся это обходить.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #85 factotum » 06.10.2013, 22:21

Sumanai:В phpBB везде используется request_var, придётся это обходить.
Ок, мне тоже не нравится ковыряться в дебрях phpBB
Пусть будет так:
Код: Выделить всё
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var formData = new FormData(form)
         formData.append("preview", "")
         var url = form.action
            .replace('posting.php', 'postingajax.php')
            .replace('ucp.php', 'ucpjax.php')
         // console.log("form:",form,"formdata:",formData,"url:",url)
         $.ajax({
            global: false,
            type: "POST",
            url: url,
            data: formData,
            cache: false,
            contentType: false,
            processData: false,
         })
         .done(function(data){
               // console.log("data:",data)
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)
заменил только устаревший коллбек "success"

Добавлено спустя 3 минуты 25 секунд:
Sumanai:Только вот дефолтная версия при предъявлении всего этого нормально показывает превью, а ваша отлупливает со стандартным сообщением.
не согласен
Вложения
screenshot.70.jpg
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #86 Sumanai » 06.10.2013, 22:32

Отлично, теперь всё пашет, даже у гостей. не совсем, но уже лучше. Пойду оформлю мод. Но в моде я внесу всё таки правки в оригинальные файлы, так будет проще для автомода. Плюс немного другая стилизация. У вас я вижу код вывода блока ошибок приспособлен для вашего стиля.
Последний раз редактировалось Sumanai 06.10.2013, 22:57, всего редактировалось 1 раз.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #87 factotum » 06.10.2013, 22:32

пропустил ключевые слова "при предъявлении всего этого"

Тут все просто. Как минимум капча в форме полного ответа другая. Как максимум, проверятся и хеш формы. И то, и другое, уникальные значения в форме полного ответа. Обойти это можно только отключив проверку или заставить работать с данными из формы быстрого ответа.

Добавлено спустя 55 секунд:
Sumanai:У вас я вижу код вывода блока ошибок приспособлен для вашего стиля.
не так что бы очень. скажем, с видом на него :smile:
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #88 Sumanai » 06.10.2013, 22:36

factotum:не согласен

Ну так заполните капчу. Или вообще отключите для гостей, для тестирования.

Добавлено спустя 3 минуты:
На функции защиты от ботов я указал. Если вручную вставить всё это, то предпросмотр работает, ровно один раз. Нужно так же капчу обновлять.
Вру, не один. Но капчу всё равно надо обновлять, зафлудят.

Добавлено спустя 4 минуты 29 секунд:
Вот, сделал всё руками, сервер принял:
Изображение
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #89 factotum » 07.10.2013, 00:04

В общем не нашел подходящего полифилла для formData, а без него браузеры без поддержки html5 в пролете

В итоге JS приобрел такой вид:
Код: Выделить всё
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var url = form.action
            .replace('posting.php', 'postingajax.php')
         $
            .post( url, $(form).serialize() + '&preview' )
            .done(function(data){
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)
данные ловятся банально через $_POST('name'), соотвественно все, что с $_POST должно работать корректно. Но request_var придется сначала отфильтровать от переменных в урле (урл остался без изменений), к остальному привить $_POST...
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #90 factotum » 07.10.2013, 18:15

factotum:данные ловятся банально через $_POST('name'), соотвественно все, что с $_POST должно работать корректно. Но request_var придется сначала отфильтровать от переменных в урле (урл остался без изменений), к остальному привить $_POST...
обманул. ради любопытства сделал так:
Код: Выделить всё
// Output page ...
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   if (@extension_loaded('zlib') && !headers_sent() && ob_get_level() <= 1 && ob_get_length() == 0) {
      ob_start('ob_gzhandler');
   } else {
      ob_start();
   }
   header('Content-type: text/html; charset=UTF-8');
   if (sizeof($error)) {
      echo '<div class="alert alert-danger"><p class="error">' .  implode('</p><p class="error">', $error) . '</p></div>';
   } else {
      $template->set_filenames(array(
         'body' => 'posting_preview.html')
      );
      $template->display('body');
   }
   $message = utf8_normalize_nfc(request_var('message', '', true));
   echo $message;
   $size = ob_get_length(); // Определяем длину контента
   header("Content-Length: $size"); // Помещаем длину в заголовок ответа
   ob_end_flush(); // Закрываем буфер
   flush(); // Отдаем содержимое
   ob_end_clean(); // Сбрасываем буфер
   garbage_collection(); // Сбрасываем кеш и закрываем соединения с базой
   exit_handler();// Закрываем соединения с присоедененными приложениями
   die();
}
тут добавлено явно:
$message = utf8_normalize_nfc(request_var('message', '', true));
echo $message;
все работает. Попробую глянуть, где затык :ill:

Добавлено спустя 2 минуты 35 секунд:
factotum:Попробую глянуть, где затык
Код: Выделить всё
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         var url = form.action
            .replace('posting.php', 'postingajax.php')
         $
            .post( url, $(form).serialize() + '&preview=preview' )
            .done(function(data){
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementById("preview") || document.getElementsByClassName("alert")[0]
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)
Все, работает. Кросс-браузерно. Без мусора. Остается обыграть гостей.

Добавлено спустя 1 час 5 минут:
И подправленный PHP:
Код: Выделить всё
// Output page ...
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   header('Content-type: text/html; charset=UTF-8');
   header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
   header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
   header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
   header( 'Pragma: no-cache' );
   ob_start();
   if (sizeof($error)) {
      echo '<div class="alert alert-danger"><p class="error">' .  implode('</p><p class="error">', $error) . '</p></div>';
   }
   $template->set_filenames(array(
      'body' => 'posting_preview.html')
   );
   $template->display('body');
   $data = ob_get_contents(); // Помещаем вывод в переменную
   $size = ob_get_length(); // Определяем длину контента
   ob_end_clean(); // Закрываем и сбрасываем буфер
   header("Content-Length: $size"); // Помещаем длину в заголовок ответа
   echo $data; // Вывод
   garbage_collection(); // Сбрасываем кеш и закрываем соединения с базой
   exit_handler();// Закрываем соединения с присоединенными приложениями
}
Добавлены необходимые заголовки и разобрался с буфером. Ненужное удалено (die не нужно при использовании exit_handler. Flush прописан там же.
На сжатие средствами PHP забил. Сжимаю сервером, соответственно там же добавляю заголовки
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #91 Sumanai » 07.10.2013, 21:26

factotum:Все, работает.

Маленький баг- при предпросмотре пустого или ошибочного сообщения вместе с блоком ошибки появляется и пустой блок предпросмотра, к которому прокручивает (а не к блоку с ошибкой, который выше).
Подправленный PHP
Код: Выделить всё
// Output page ...
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
   header('Content-type: text/html; charset=UTF-8');
   header( 'Expires: Wed, 11 Jan 1984 05:00:00 GMT' );
   header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s' ) . ' GMT' );
   header( 'Cache-Control: no-cache, must-revalidate, max-age=0' );
   header( 'Pragma: no-cache' );
   ob_start();
   if (sizeof($error)) {
      echo '<div class="alert alert-danger"><p class="error">' .  implode('</p><p class="error">', $error) . '</p></div>';
   }
   else{
   $template->set_filenames(array(
      'body' => 'posting_preview.html')
   );
   $template->display('body');
   }
   $data = ob_get_contents(); // Помещаем вывод в переменную
   $size = ob_get_length(); // Определяем длину контента
   ob_end_clean(); // Закрываем и сбрасываем буфер
   header("Content-Length: $size"); // Помещаем длину в заголовок ответа
   echo $data; // Вывод
   garbage_collection(); // Сбрасываем кеш и закрываем соединения с базой
   exit_handler();// Закрываем соединения с присоединенными приложениями
}

factotum:Добавлены необходимые заголовки

Точно необходимые? Last-Modified я бы выкинул.

factotum:Остается обыграть гостей.

Я приводил код, который нужно выполнить.
Для окончательного совершенства надо обновлять токен и капчу.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #92 factotum » 07.10.2013, 22:18

Sumanai:Подправленный PHP
есть другое мнение. я пока не исключаю сценарии, где могут выводиться и ошибки, и превью. Правильней было бы что-то вроде такого:
if (sizeof($message)) { // проверяем размер сообщения
$template->set_filenames(array(
'body' => 'posting_preview.html')
}
Sumanai:Маленький баг- при предпросмотре пустого или ошибочного сообщения вместе с блоком ошибки появляется и пустой блок предпросмотра, к которому прокручивает (а не к блоку с ошибкой, который выше).
Ок, прокрутим к ошибке
Sumanai:Точно необходимые? Last-Modified я бы выкинул.
нормальный корректный заголовок :smile:
За исключением сжатия средствами PHP. Сам не сжимаю, и другим не советую :ill:
Sumanai:Я приводил код, который нужно выполнить.
тыкните, пожалуйста.
Sumanai:Для окончательного совершенства надо обновлять токен и капчу.
не обязательно. если только тоукен. При превью вводить каждый раз капчу бессмыслено и беспощадно :fie:
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #93 Sumanai » 07.10.2013, 22:35

factotum:я пока не исключаю сценарии, где могут выводиться и ошибки, и превью.

Я таких случаев не помню.

factotum:нормальный корректный заголовок :smile:

Лишний по моему. Эти заголовки весят больше, чем некоторые сообщения.

factotum:тыкните, пожалуйста.

Прямо на этой странице же...
Всё, что нужно- подставить эти значения в отправляемые creation_time и form_token.

factotum:не обязательно. если только тоукен.

По мне так обаятельно. И уничтожать в БД предыдущий. А то заддосят легко.

factotum:При превью вводить каждый раз капчу бессмыслено и беспощадно :fie:

Я имел в виду при ошибке прохождения. Раз прошёл правильно- это должно запомнится.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #94 factotum » 07.10.2013, 22:52

Sumanai:Я таких случаев не помню.
мало ли. код ниже расставляет все на свои места.
factotum:if (sizeof($message)) { // проверяем размер сообщения
$template->set_filenames(array(
'body' => 'posting_preview.html')
}
как-то так:
Код: Выделить всё
   if (!empty($message_parser->message)) {
      $template->set_filenames(array(
         'body' => 'posting_preview.html')
      );
      $template->display('body');
   }
Sumanai:Лишний по моему. Эти заголовки весят больше, чем некоторые сообщения.
заголовки http должны быть корректными. из-за одной строки в заголовке с сервером ничего страшного не будет точно.

Sumanai:По мне так обаятельно. И уничтожать в БД предыдущий. А то заддосят легко.
Sumanai:Я имел в виду при ошибке прохождения. Раз прошёл правильно- это должно запомнится.
вот не знаю. мне почему то захотелось просто отключить превью для гостей. а зодосить могут в пределах безопасности самого posting.php - запрос проходит все стандартные проверки независимо от того, как он послан - напрямую через http или через AJAX. Хотя обновить тоукен может оказаться не лишним. Но толку. Скажем Вы злоумышленник. Написали чего или долбите вручную напару с ботом. Либо движок пошлет сразу из-за отсутствия тоукена. Либо Вы научились его ловить. В этом случае обновление тоукена - еще одна операция, лишь нагружающая движок. Ни больше, ни меньше.

Добавлено спустя 4 минуты 22 секунды:
Sumanai:Вот эта антибот функция, работу которой необходимо выполнить перед предпросмотром сообщения костями:
это стандартная процедура при отправке сообщения. разве превью проходит эти проверки в сдандартной реализации?

Добавлено спустя 1 минуту 2 секунды:
уже разобрался. проходит)

Добавлено спустя 2 минуты:
тогда у меня вопрос!
если постинг отдает все без времени и тоукена в нашем случае, то накой черт добавлять то, без чего все равно работает?)
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #95 Sumanai » 07.10.2013, 23:09

factotum:заголовки http должны быть корректными.

Вроде этот не является обязательным. Хотя как знаете.

factotum:если постинг отдает все без времени и тоукена в нашем случае,

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

Возвращаясь к старому:
factotum:добавить небольшой фоллбек:

Есть идея надёжнее:
PHP
Ищем
Код: Выделить всё
$preview   = (isset($_POST['preview'])) ? true : false;
Добавляем после
Код: Выделить всё
$ajax   = (isset($_POST['ajax'])) ? true : false;
В нашем коде ищем
Код: Выделить всё
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
Меняем на несколько более простое
Код: Выделить всё
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $ajax == true) {
Яваскрипт ищем
Код: Выделить всё
.post( url, $(form).serialize() + '&preview=preview' )
Меняем на
Код: Выделить всё
.post( url, $(form).serialize() + '&preview=preview' + '&ajax=true' )
В коде проверки можно даже один $ajax == true оставить. Работает железно на любом сервере, где вообще phpBB работает.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #96 factotum » 07.10.2013, 23:13

глянул код. превью генериться со строки 636. нет там никаких проверок.
Sumanai:$ajax == true
может быть

Добавлено спустя 5 минут 3 секунды:
вот ответы на все вопросы:
screenshot.71.jpg
screenshot.71.jpg (48.76 КБ) Просмотров: 8605

это запрос к серверу через AJAX
заполняется это для всех и всегда
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #97 Sumanai » 07.10.2013, 23:22

factotum:вот ответы на все вопросы:

Это у пользователя. У гостя creation_time и form_token изначально пустые, и заполняются перед отправкой стандартными средствами. Наш же код идёт мимо, не запуская заполнение этих полей. Проверьте, у гостей они в коде страницы пустые.

Добавлено спустя 5 минут 57 секунд:
factotum:это запрос к серверу через AJAX
заполняется это для всех и всегда

А у меня не пашет, хоть убейте:
Изображение
Uploaded with ImageShack.us

Добавлено спустя 4 минуты 10 секунд:
factotum:это запрос к серверу через AJAX
заполняется это для всех и всегда

Вот что. Включите каптчу.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #98 factotum » 07.10.2013, 23:56

Sumanai:Это у пользователя. У гостя creation_time и form_token изначально пустые, и заполняются перед отправкой стандартными средствами. Наш же код идёт мимо, не запуская заполнение этих полей. Проверьте, у гостей они в коде страницы пустые.
Ваша правда, виноват. Можно добавить. Так заработает и у гостей.

Добавлено спустя 1 час 24 минуты:
было лень править шаблон. заодно решил проверить насколько правильней было отдавать тоукен через костыли: http://regexr.com?36kse
вот и конец всем костылям

Добавлено спустя 1 минуту 24 секунды:
с условием того, что в regexp я не спец, потратил целый час двадцать четыре минуты. Правда, с кодом JS, цепляющим тоукен из страницы.
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Сообщение #99 Sumanai » 08.10.2013, 01:40

factotum:было лень править шаблон.

factotum:потратил целый час двадцать четыре минуты.

:smile:

factotum:было лень править шаблон. заодно решил проверить насколько правильней было отдавать тоукен через костыли: http://regexr.com?36kse
вот и конец всем костылям

Что там? Требует флеш, а я его после обновления на фф24 с его дебильным предупреждением о включении плагина удалил с корнем.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #100 factotum » 08.10.2013, 07:40

Sumanai:Что там
пример выборки кода из страницы
Добавлено спустя 2 часа 1 минуту:
Для гостей будет примерно так:
Код: Выделить всё
!function ($) {
   /* Preview viewtopic*/
   $(function(){
      function preview() {
         var form = document.getElementById("postform")
         if (form.form_token.value == 0) {
            var text = form.textContent || form.innerText
            var token = /[a-z0-9]{38,40}/g.exec(text);
            form.form_token.value = token[0]
            var time = /\.val\('(\d{10})/g.exec(text);
            form.creation_time.value = time[1]
            console.log("text:",text,"token:",token[0],"time:",time[1])
         }
         var $form = []
         $form = $(":input[value!='']", form).serialize() + '&preview='
         // $.grep($form,function(n){ return(n) });
         var url = form.action
            .replace('posting.php', 'postingajax.php')
         $
            .post( url, $form )
            .done(function(data){
               if ($("#preview").length){
                  $preview = $("#preview")
                  $preview.next("hr").remove()
                  $preview.remove()
               }
               $(".alert").remove()
               $(".post:last").after(data)
               target = document.getElementsByClassName("alert")[0] || document.getElementById("preview")
               $('html, body').animate({
                  scrollTop: $(target).offset().top
               }, 200)
            })
      }
       
      $(document).on('click', '.section-viewtopic input[name=preview]', function(e) {
         e.preventDefault()
         e.stopPropagation()
         preview()
      })
   })
}(window.jQuery)
при вводе правильной капчи - работает. если ввести капчу неправильно - все пропало)
factotum
Автор темы
Откуда: Люксембург
Репутация: 234
С нами: 11 лет 11 месяцев

Пред.След.

Вернуться в Пожелания 1.x



cron