【问题标题】:How to save and retrieve contenteditable data如何保存和检索 contenteditable 数据
【发布时间】:2014-11-05 13:39:35
【问题描述】:

我希望能够更改某些页面的文本。使用 contenteditable 对我来说是完美的。
问题是我只知道如何用 PHP 编程。我在互联网上搜索了几个小时试图让它工作,但我只是不了解用于存储数据以使其工作的编程语言。

这就是我希望它的工作方式:

  1. 管理员点击“编辑”按钮
  2. div 变为可编辑。
  3. 当管理员准备好编辑时,他点击了“保存”按钮
  4. 数据保存到文件或数据库中(不知道什么是最佳选择)。
  5. 打开页面时会显示已编辑的内容。

这就是我现在所拥有的:

<div class="big_wrapper" contenteditable>
  PAGE CONTENT
</div>

当管理员点击“编辑”时,我知道如何将 div 转换为 contenteditable div。
我的问题是我真的不知道如何保存编辑后的数据。
我也不知道是否很难从文件中检索数据,这取决于数据的保存方式。如果将其保存到数据库中,我将毫无问题地检索它,但我不知道这是否可能以及这是否是最佳选择。

感谢您的帮助,

萨缪尔


编辑:

@gibberish,非常感谢您的超快速回复!
我试图让它工作,但它还没有工作。我不知道我做错了什么。

这是我的代码:
over_ons.php

<div class="big_wrapper" contenteditable>
  PAGE CONTENT
</div>

<input type="button" value="Send Data" id="mybutt">

<script type="text/javascript">
  $('#mybutt').click(function(){
    var myTxt = $('.big_wrapper').html();
    $.ajax({
        type: 'post',
        url:  'sent_data.php',
        data: 'varname=' +myTxt+ '&anothervar=' +moreTxt
  });
});
</script>

sent_data.php

<?php
 session_start();
include_once('./main.php');
include($main .'connectie.php');

$tekst=$_POST['myTxt'];

$query="UPDATE paginas SET inhoud='" .$tekst. "' WHERE id='1'";

mysql_query($query);
?>

再次感谢您的大力帮助!
你能帮我让 div 仅在用户点击按钮时才可编辑吗?


解决方案

我花了 2 周多的时间才最终完成所有工作。我必须学习 javascript、jQuery 和 Ajax。但现在它完美无缺。我什至添加了一些额外的花哨:)
如果有人想做同样的事情,我想分享一下我是如何做到的。

over_ons.php

//Active page:
$pagina = 'over_ons'; ?>
<input type='hidden' id='pagina' value='<?php echo $pagina; ?>'> <!--Show active page to javascript--><?php
//Active user:
if(isset($_SESSION['correct_ingelogd']) and $_SESSION['functie']=='admin'){
$editor = $_SESSION['gebruikersnaam']; ?>
<input type='hidden' id='editor' value='<?php echo $editor; ?>'> <!--Show active user to javascript--><?php  
} ?>

<!--Editable DIV: -->
<div class='big_wrapper' id='editable'>
    <?php
        //Get eddited page content from the database
        $query=mysql_query("SELECT inhoud FROM paginas WHERE naam_pagina='" .$pagina. "'");
        while($inhoud_test=mysql_fetch_array($query)){
            $inhoud=$inhoud_test[0];
        }

        //Show content
        echo $inhoud;
    ?>
</div>

<!--Show edit button-->
<?php
if(isset($_SESSION['correct_ingelogd']) and $_SESSION['functie']=='admin')
{?>
    <div id='sidenote'>
        <input type='button' value='Bewerken' id='sent_data' class='button' />
        <div id="feedback" />
    </div>
<?php }

由于这是一个相当长且复杂的文件,我尝试将我的大部分 cmets 翻译成英文。
如果您想翻译尚未翻译的内容,原始语言是荷兰语。
javascript.js
//If the system is in edit mode and the user tries to leave the page,
//let the user know it is not so smart to leave yet.
$(window).bind('beforeunload', function(){
var value = $('#sent_data').attr('value'); //change the name of the edit button

if(value == 'Verstuur bewerkingen'){
    return 'Are you sure you want to leave the page? All unsaved edits will be lost!';
}
});

//Make content editable
$('#sent_data').click(function(){
    var value = $('#sent_data').attr('value'); //change the name of the edit button

    if(value == 'Bewerken'){
        $('#sent_data').attr('value', 'Verstuur bewerkingen');  //change the name of the edit button
        var $div=$('#editable'), isEditable=$div.is('.editable'); //Make div editable
        $div.prop('contenteditable',!isEditable).toggleClass('editable')
        $('#feedback').html('<p class="opvallend">The content from<BR>this page is now<BR>editable.</p>');
    }else if(value == 'Verstuur bewerkingen'){
                var pagina = $('#pagina').val();
                var editor = $('#editor').val();
                var div_inhoud = $("#editable").html();
                $.ajax({
                type: 'POST',
                url:  'sent_data.php',
                data: 'tekst=' +div_inhoud+ '&pagina=' +pagina+ '&editor=' +editor,
                success: function(data){
                Change the div back tot not editable, and change the button's name
                    $('#sent_data').attr('value', 'Bewerken');  //change the name of the edit button
                    var $div=$('#editable'), isEditable=$div.is('.editable'); //Make div not editable
                    $div.prop('contenteditable',!isEditable).toggleClass('editable')
                    
                //Tell the user if the edditing was succesfully
                    $('#feedback').html(data);
                    setTimeout(function(){
                        var value = $('#sent_data').attr('value'); //look up the name of the edit button
                        if(value == 'Bewerken'){ //Only if the button's name is 'bewerken', take away the help text
                        $('#feedback').text('');
                        }
                        }, 5000);
                    }
                    }).fail(function() {
                    //If there was an error, let the user know
                        $('#feedback').html('<p class="opvallend">There was an error.<BR>Your changes have<BR>not been saved.<BR>Please try again.</p>');
                    });
    }
});

最后,
sent_data.php
<?php
session_start();
include_once('./main.php');
include($main .'connectie.php');

//Look up witch page has to be edited
$pagina=$_POST['pagina'];
//Get the name of the person who eddited the page
$editor=$_POST['editor'];
//Get content:
$tekst=$_POST['tekst'];
$tekst = mysql_real_escape_string($tekst);

$query="UPDATE paginas SET naam_editer='" .$editor. "', inhoud='" .$tekst. "' WHERE naam_pagina='" .$pagina. "'";

}
    if(mysql_query($query)){
        echo "<p class='opvallend'>Successfully saves changes.</p>";
    }else{
        echo "<p class='opvallend'>Saving of changes failed.<BR>
        Please try again.</p>";
    }
?>

【问题讨论】:

    标签: php jquery ajax html contenteditable


    【解决方案1】:

    使用客户端语言,例如 JavaScript(或最好的 jQuery)来管理输入框是否可以编辑。

    使用 AJAX 获取字段数据并将其发送到 PHP 文件,这会将数据粘贴到您的数据库中。

    这是一个使用 jQuery 管理启用/禁用输入字段的非常简化的示例:

    jsFiddle Demo

    $('.editable').prop('disabled',true);
    
    $('.editbutt').click(function(){
        var num = $(this).attr('id').split('-')[1];
        $('#edit-'+num).prop('disabled',false).focus();
    });
    
    $('.editable').blur(function(){
        var myTxt = $(this).val();
        $.ajax({
            type: 'post',
            url:  'some_php_file.php',
            data: 'varname=' +myTxt+ '&anothervar=' +moreTxt
        });
    });
    

    PHP 文件:some_php_file.php

    <?php 
        $myVar = $_POST['varname'];
        $secondVar = $_POST['anothervar'];
        //Now, do what you want with the data in the vars
    

    使用 AJAX 非常简单。我举了一个非常简短的例子来说明它的样子。不要在 HTML 或 jQuery 中查找 moreTxt 变量——我添加它是为了展示如何将第二个 var 数据添加到 ajax。

    以下是一些基本示例,可帮助您快速了解 ajax:

    AJAX request callback using jQuery


    学习 jQuery 或 AJAX 没有捷径可走。阅读示例和实验。

    您可以在这里找到一些优秀的免费 jQuery 教程:

    http://thenewboston.com

    http://phpacademy.org


    更新编辑:

    回复您的评论询问:

    要将数据从 DIV 发送到 PHP 文件,首先您需要一个触发代码的 事件。正如您所提到的,在输入字段上,这可以是blur() 事件,当您离开字段时触发。在&lt;select&gt; 上,它可以是change() 事件,当您选择一个选项时触发。但是在 DIV 上......好吧,用户不能与 div 交互,对吧?触发器必须是用户执行的操作,例如单击按钮。

    因此,用户单击一个按钮——您可以使用.html() 命令获取 DIV 的内容。 (在输入框和选择控件上,您可以使用.val(),但在DIV 和表格单元格上,您必须使用.html()。代码如下所示:

    点击按钮后如何发送DIV内容:

    HTML:

    <div class='big_wrapper' contenteditable>
        PAGE CONTENT
    </div>
    <input id="mybutt" type="button" value="Send Data" />
    

    jQuery:

    $('#mybutt').click(function(){
        var myTxt = $('.big_wrapper').html();
        $.ajax({
            type: 'post',
            url:  'some_php_file.php',
            data: 'varname=' +myTxt+ '&anothervar=' +moreTxt
        });
    
    });
    

    【讨论】:

    • 我一直在尝试通过以下教程学习 jQuery 和 AJAX。我了解到模糊事件仅适用于输入字段。而且我不想要一个输入字段,而是一个 div。将数据从 div 发送到 php 文件的最佳方法是什么?顺便说一句,在您的示例中,您使用按钮使输入字段可编辑。我尝试了很多方法来让 div 仅在按下按钮时才可编辑,但无法使其工作。对我来说,只使用 PHP 来使 div 可编辑也可以,但也许使用 jQuery 很简单,也许你可以解释一下如何使用 jQuery 中的按钮使 div 可编辑?
    • 我现在完成了点击按钮后使 div 可编辑的部分,只需使用 PHP 和我习惯使用的表单。现在唯一要做的就是使“发送数据”按钮工作,并将 div 中的文本实际发送到 php 文件。 (顺便说一句,我在没有使用 jQuery 的情况下测试了 PHP 文件,它确实有效。所以我确定数据还没有发送到 PHP 文件,如果是,数据将在数据库中)
    • 请,请,请... 请仔细阅读我上面的完整答案。 尝试一下。 然后,尝试每个 AJAX 链接 - 进行一些实验。我保证,你会在大约 45 分钟内完成所有事情(允许 30 分钟用于学习/测试),你会对最终结果感到非常满意。你已经为这个问题工作了好几个小时——你有什么损失?
    • 我不太明白为什么,但是在代码中添加
    • 是的,你需要这个因为$('class_or_id'). 语法是 jQuery——任何时候你看到它,代码都是 jQuery——所以你需要加载 jQuery 库。三个相关的例子也表明了这一点。看看这些Free jQuery Tutorials -and- Free Register&Login Tutorial——我自己从他们身上学到了很多。
    【解决方案2】:

    你可以拯救整个 页面客户端:

        <script>
    function saveAs(filename, allHtml) {
    allHtml =  document.documentElement.outerHTML; 
    var blob = new Blob([allHtml], {type: 'text/csv'});
    if(window.navigator.msSaveOrOpenBlob) {
    window.navigator.msSaveBlob(blob, filename);
    }
    else{
    var elem = window.document.createElement('a');
    elem.href = window.URL.createObjectURL(blob);
    elem.download = filename;        
    document.body.appendChild(elem);
    elem.click();        
    document.body.removeChild(elem);
    }
    }    
    </script> 
    

    【讨论】:

    • 这不符合 OP 的要求。 msSaveBlob 也是非标准且已过时的。更不用说代码是不可读的。我建议跳过这个答案。
    猜你喜欢
    • 1970-01-01
    • 2018-05-28
    • 2016-10-29
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2021-05-07
    相关资源
    最近更新 更多