// замена строки по шаблону
// например: 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 ;" и т.п.