// замена строки по шаблону
// например: 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>" заменяет на "<\/p>"  и т.п.
так же результат почему-то возвращается 
{"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 ;" и т.п.