2013-09-26 4 views
1

так основная схема ...форма должна быть представлена ​​дважды перед отправкой обновленные данные

У меня есть «сообщения» вытащил из базы данных и отображаются следующим образом:

<div class="blogtest"> 

    <form action="process/updatepost.php" class="updatepost" method="post"> 
     <input type="button" class='.$editenabled.' value="Edit"> 
     <input type="submit" class="saveupdatebutton" value="Save"> 
     <input type="hidden" class="postid" name="postid" value="'.$postID.'"> 

     <div class="text"> 

      <div class="buildtext">'.$text.'</div> 

      <div class="editor"><textarea name="ckeditor"id="ckeditor" class="ckeditor">'.$text.'</textarea></div> 

     </div> 

    </form> 

    </div> 

После нажатия кнопки редактирования щелкнул , класс buildtext скрывается и отображается ckeditor. То же самое для кнопки редактирования и сохранения.

Когда нажата кнопка «Сохранить», вызывается запрос ajax, после чего данные обновляются. Это работает отлично ... однако он работает только отлично, если на этой странице есть только 1 сообщение в блоге.

Здесь Ajax для справки:

$(document).ready(function(){ 
$(".updatepost").submit(function(){ 
    var $targetForm = $(this); 

    $targetForm.find(".error").remove(); 
    $targetForm.find(".success").remove(); 

    // If there is anything wrong with 
    // validation we set the check to false 
    var check = true; 

    // Get the value of the blog update post 
    var $ckEditor = $targetForm.find('.ckeditor'), 
     blogpost = $ckEditor.val(); 

      // Validation 
    if (blogpost == '') { 
     check = false; 
     $ckEditor.after('<div class="error">Text Is Required</div>'); 
    } 

     // ... goes after Validation 
    if (check == true) { 
    $.ajax({ 
    type: "POST", 
    url: "process/updatepost.php", 
    data: $targetForm.serialize(), 
    dataType: "json", 
    success: function(response){ 

    if (response.databaseSuccess) 
     $targetForm.find(".error").remove(); 
    else 
     $ckEditor.after('<div class="error">Something went wrong!</div>'); 

} 
     }); 
    } 
    return false; 
}); 

});

Итак, если на странице есть 2 сообщения в блоге, и я редактирую второй (последний) пост, при нажатии «Сохранить пост» правильно обновляется.

Однако, если я редактирую любой другой, тогда для отправки данных требуется два отправления.

Я проверил на firebug, и он показывает, что при первом щелчке старое значение отправляется, а затем на второе - новое.

Где я иду не так?

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

Спасибо за помощь! Вам понадобится еще какой-нибудь код и плохой пост.

Craig :)

EDIT: После того, CKEditor просто нормальный текстовое поле он работает отлично. Должно быть, ckeditor не обновляется, поскольку я знаю, что он не работает как текстовая область как таковая. Может быть, придется использовать другой богатый редактор ...

ответ

1

Насколько я могу видеть из integration guide, CKEditor, скорее всего, использует свое собственное событие onsubmit, чтобы отправить данные обратно в текстовое поле. Это означало бы, что эти 2 события могут запустить обратный порядок, сначала получить старый текст из вашего кода и только затем обновить текстовое поле.

Вы всегда можете попытаться получить содержимое CKEditor, используя следующий синтаксис:

var editor_data = CKEDITOR.instances.yourInstance.getData(); 

Кроме того, вы используете адаптер JQuery с CKEditor?

EDIT: проблема, похоже, имеет одинаковые идентификаторы на нескольких текстовых пространствах, причем все они называются «ckeditor». Это приведет к неожиданному поведению в браузерах, поскольку идентификатор должен быть всегда уникальным для страницы.

+0

0 Я видел эту часть кода, плавающей вокруг, но никогда не работает/я не могу ее понять Здесь нормально, что я использую: \t вар $ CKEditor = $ targetForm.find ('CKEditor'), \t Блогпост = $ ckEditor.val(); Вы можете создать что-то из того, что может помочь мне понять это? – craig

+0

Как вы создаете экземпляры CKEditor? все ли у них разные пользовательские идентификаторы, или все они называются «ckeditor»? –

+0

все называются ckeditor, потому что они выходят из базы данных в foreach – craig

2

У меня была аналогичная проблема. Просто чтобы поделиться своим опытом, если кто-то окажется здесь с той же проблемой. CKEditor не обновлял целевое текстовое поле при первом нажатии кнопки отправки, и, поскольку у меня была проверка данных в текстовой области, благодарность заставило меня понять, что текстовое поле не было заполнено в первом представлении.Чтобы преодолеть это, я добавляю этот бит кода:

$('#accept-button').click(function (event) { 
    for (var i in CKEDITOR.instances) { 
     CKEDITOR.instances[i].updateElement(); 
    } 
} 
Смежные вопросы