ФорумПрограммированиеJavaScript → json ie < 9 iframe tinymce

json ie < 9 iframe tinymce

  • sweet15w

    Сообщения: 139 Репутация: N Группа: Кто попало

    Spritz 14 сентября 2015 г. 12:09

    
    
    // замена строки по шаблону
    // например: source = "<tr data-id='?'><td>?</td><td>?</td><td></td></tr>",
    // ajax запрос возвращает {"error":false,"data":[{"id":167,"date":"2015-09-14","name":"Заголовок","intro":"<p>Вступление<\/p>"}]}, передаю result.data в функцию в качестве json
    // Соответсвенно результат ф-ции будет "<tr data-id='167'><td>2015-09-14</td><td>Заголовок</td><td><p>Вступление</p></td></tr>";
    
    function json_placeholder( source, json ) {
    
        var placeholder = 'placeholder_' + Math.random();
        var placeholder_reg = new RegExp( placeholder );
        var placeholder_default = new RegExp( placeholder, 'g' );
        source = source.replace( /\?/g, placeholder );
    
        $.each( json, function( key, val ) {
            source = source.replace( placeholder_reg, val );
        } );
    
        source = source.replace( placeholder_default, '?' );
    
        return source;
    
    }
    
    
    
    
    // добавить запись из формы в базу
    // _this - объект (кнопка на которую нажали)
    // url - адрес ajax файла
    // type - тип запроса (post, get)
    // placeholder - соответсвенно передаваемый шаблон, используемый в предыдущей функции
    function form_insert( _this, url, type, placeholder ) {
    
        if( !_this.prop( 'disabled' ) ) {
    
            if( typeof FormData != 'undefined' ) {
    
                var mce_textarea = $( '#message textarea.mce_editor, #message textarea.mce_simple' );
                mce_textarea.each( function() {
                    var mce = $( this );
                    var mce_name = mce.attr( 'name' );
                    var mce_content = mce.parents( 'td' ).find( 'iframe' ).contents().find( 'body' ).html();
                    mce.val( mce_content );
                } );
    
                _this.parents( '#message' ).wrapInner( "<form encoding='multipart/form-data' enctype='multipart/form-data'></form>" );
                var form = $( '#message form' );
                form.after( "<progress value='0' max='100'></progress>" );
                var progress = $( 'progress' );
                    var data = new FormData( $( '#message form' )[0] );
    
                    $.ajax( {
    
                    url: url,
                    type: type,
                    data: data,
                    contentType: false,
                    processData: false,
                    dataType: 'json',
    
                    beforeSend: function() {
                        _this.prop( 'disabled', true );
                    },
    
                    success: function ( result ) {
                        // console.log( result );
                        if( result.error == false ) {
                            $.each( result.data, function( key, val ) {
                                var string = json_placeholder( placeholder, val );
                                var tr = $( '[name="add"]' ).parents( 'table' ).find( 'tr:first' );
                                tr.after( string );
                            } );
                            message_close();
                        } else {
                            message_close();
                            message( result.message );
                        }
                    },
    
                    complete: function() {
                        _this.prop( 'disabled', false );
                    },
    
                    error: function() {
                        message_close();
                        message( 'Неизвестная ошибка. Попробуйте выполнить данную операцию позже.' );
                    },
    
                    xhr: function() {
                        var xhr = new window.XMLHttpRequest();
                        xhr.upload.addEventListener( 'progress', function( evt ) {
                            if( evt.lengthComputable ) {
                                var percent = evt.loaded / evt.total;
                                percent = parseInt( percent * 100 );
                                progress.val( percent );
                            }
                        }, false );
                        return xhr;
                    }
    
                    } );
    
            } else {
    
                var mce_textarea = $( '#message textarea.mce_editor, #message textarea.mce_simple' );
                mce_textarea.each( function() {
                    var mce = $( this );
                    var mce_name = mce.attr( 'name' );
                    var mce_content = mce.parents( 'td' ).find( 'iframe' ).contents().find( 'body' ).html();
                    mce.val( mce_content );
                    // console.log( mce_content );
                } );
    
                _this.parents( '#message' ).wrapInner( "<form encoding='multipart/form-data' enctype='multipart/form-data' action='" + url + "' method='" + type + "' target='iframe'></form>" );
                var form = $( '#message form' );
                form.before( "<iframe id='iframe' name='iframe'></iframe>" );
                var iframe = $( '#message iframe#iframe' );
    
                form.submit();
                iframe.load( function() {
                    result = JSON.parse( iframe.contents().find( 'body' ).html() );
                    console.log( result );
                    if( result.error == false ) {
                        $.each( result.data, function( key, val ) {
                            var string = json_placeholder( placeholder, val );
                            var tr = $( '[name="add"]' ).parents( 'table' ).find( 'tr:first' );
                            tr.after( string );
                        } );
                        message_close();
                    } else {
                        message_close();
                        message( result.message );
                    }
                } );
    
            }
    
        }
    
    }
    
    
    

    используется WYSIWYG редактор tinymce (textarea.mce_editor, textarea.mce_simple)

    когда идет проверка на typeof FormData != 'undefined' - данное условие выполняется, запись добавляется все отлично возвращается и обрабатывается.
    когда условие не выполняется (браузер не поддерживает), например IE9 то происходит добавление IFRAME форме таргет на данный ифрейм и соответсвенно форма отправляется.

    на шаге result = JSON.parse( iframe.contents().find( 'body' ).html() ), когда данные в tinymce заполнены возвращает ошибку - так как происходит экранирвоание обратного слэша: "</p>" заменяет на "&lt;\/p&gt;" и т.п.

    так же результат почему-то возвращается

    {"error":false,"data":[{"id":167,"date":"2015-09-14","name":"Заголовок","intro":"<p>Вступление<\/p>"}]}<p>
    - добавляет в конец <p>

    Спустя 355 сек.

    на шаге result = JSON.parse( iframe.contents().find( 'body' ).html() ), когда данные в tinymce заполнены возвращает ошибку - так как происходит экранирвоание обратного слэша: "</p>" заменяет на "& l t ;\/p & g t ;" и т.п.

  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 14 сентября 2015 г. 12:41, спустя 31 минуту 35 секунд

    Фигово, ты обмани его, разэкранируй )

    adw/0
  • sweet15w

    Сообщения: 139 Репутация: N Группа: Кто попало

    Spritz 17 сентября 2015 г. 7:20, спустя 2 дня 18 часов 39 минут

    пока сделал так:

    
    var error = result.match( /\"error\":(true|false),/i )[1];
    var id = result.match( /\"id\":(\"*)(\d*)(\"*),/i )[2];
    

    и отдельно ajax запрос делаю выборки данных из бд по id - тогда ответ нормальный приходит.

    Спустя 109 сек.

    но данынй вариант мне не нравится из за дополнительного ajax запроса.. пытался обработать регулярным выражением результат, убрать лищние тэги что добавляются в конец, разэкранировать и т.п. но чтот лажа какая то получалась

  • sweet15w

    Сообщения: 139 Репутация: N Группа: Кто попало

    Spritz 19 сентября 2015 г. 6:42, спустя 1 день 23 часа 21 минуту

    в php скрипте в котором отдаются данные из полей

    rawurlencode

    в js скрипте при парсинге данных

    unescape

    мерси боку

  • sweet15w

    Сообщения: 139 Репутация: N Группа: Кто попало

    Spritz 19 сентября 2015 г. 7:51, спустя 1 час 8 минут 54 секунды

    не проверил с кирилицей.

    unescape заменил на decodeURIComponent

Пожалуйста, авторизуйтесь, чтобы написать комментарий!