696
 

Редактируемый контент на jQuery

Этот простой туториал посвящен тому, как сделать любой текст на странице динамически редактируемым. В общем виде работает это так: пользователь щелкает мышью по тексту, который нужно отредактировать, в результате чего на этом месте появляется форма для редактирования. После того, как пользователь внес изменения, он нажимает кнопку OK и скрипт автоматически отправляет AJAX запрос на сервер, сохраняя введенные данные. После этого форма исчезает, а на её месте остается отредактированный текст.

Для выполнения такой задачи, нам понадобятся библиотека jQuery и плагин Jeditable.

Начнем с создания HTML страницы, в которой выделим текст, который необходимо редактировать, заключив его в <div> с классом editable. Здесь же подключаем нужные нам скрипты jquery.js и jquery.jeditable.js:

<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.jeditable.js"></script>
</head>
<body>
<div class="editable">
Lorem ipsum dolor sit amet, consectetur adipiscing elit....
</div>
<hr/>
<div class="editable">
Aenean ut mauris nec nisl varius volutpat....
</div>
<hr/>
<div class="editable">
Aenean pharetra. Curabitur non turpis....
</div>
</body>
</html>

Далее пишем скрипт, который будет инициализировать нужные нам блоки текста:

$(document).ready(function() {
     	$(".editable").editable("/jedit/file.php",
		{
			type      : 'textarea',
		        cancel    : 'Отмена',
		        submit    : 'OK',
		        indicator : '',
			tooltip : "Щелкните чтоб отредактировать этот текст"
		}
	);
});

Здесь селектор $(”.editable”) выделяет нужные нам блоки кода, а фукнция editable инициализирует их с указанными параметрами. Первый параметр – это URL, на который будет отправляться AJAX запрос при сохранении изменений. Второй параметр – это опции. Вкратце опишу, что они значат:

  • type – указывает на тип элемента редактирования. По умолчанию используется простое текстовое поле (<input type=”text”>), но можно указать и textarea, как сделано в нашем примере. Также, эта опция может иметь значение select (будет рассмотрено ниже)
  • cancel – указывает на то, что нужно отображать кнопку “отмена”. По умолчанию кнопки нет, отменить редактирование можно клавишей Esc.
  • ОК – указывает на то, что нужно отображать кнопку “ОК”, то есть кнопку сохранения изменений. По умолчанию кнопки нет, сохранить изменения можно клавишей Enter.
  • indicator – индикатор ожидания – форматированный текст (допускаются HTML теги), который будет отображаться при отправке запроса на сервер. Здесь я использовал <img> чтобы показать анимированный индикатор.
  • tooltip – всплывающая подсказка, которая будет показана при наведении мышки на редактируемый блок текста.

AJAX запрос, который отправляется на сервер, имеет два параметра: id и value:

id=elements_id&value=user_edited_content

Если вы хотите изменить названия этих двух параметров, то это можно сделать, присвоив нужные значения опциям id и name:

 $(document).ready(function() {
     $('.edit').editable('http://www.example.com/save.php', {
         id   : 'elementid',
         name : 'newvalue'
     });
 });

Теперь представьте себе ситуацию, когда пользователю нужно отредактировать какой то короткий кусок текста, однако вводить не что попало, а выбирать некоторое определенное значение. В этом случае было бы удобно вместо текстового поля показывать выпадающий список. Это можно сделать, указав в качестве опции type значение select, а в параметре data указать объект со всеми значениями для списка:

$('#country').editable('/jedit/country.php', {
	data   : " {'U':'Украина','B':'Белоруссия','R':'Россия', 'selected':'U'}",
	type   : 'select',
	submit : 'OK',
        indicator : '',
	tooltip : "Щелкните чтоб выбрать страну"
});

Обратите внимание на значение ’selected’ в объекте data. Таким образом указывается элемент списка, который должен быть выбран. В результате при щелчке мышки на таком тексте, вместо него появится выпадающий список. Пользователю остается только выбрать один из предлагаемых вариантов и сохранить свой выбор, нажав ОК.

Смотреть демо

Добавить в закладки:
Maklay.com - Большой каталог товаров для спорта и активного отдыха

Комментарии на “Редактируемый контент на jQuery”

  1. Все здорово, но потенция-лечение портит впечатление.

  2. @q
    Ну это ж реклама, куда уж без неё ))

  3. я не понял, а редактируемый текст где-нибудь сохраняется? или только выводится тому кто его редактирует?

  4. @wuZZard
    Конечно сохраняется, точнее отправляется запрос на сервер, а сервер должен сохранить и вернуть сохраненный текст. URL, на который отправляется запрос указывается первым параметром в $(…).editable().

  5. а как он должен возвращаться?
    предположим у меня такай запрос в save.php
    $text=$_POST['text'];
    $str=”UPDATE `test` SET `text` = ‘{$text}’ WHERE `id` =1 LIMIT 1;”;
    $sql=mysql_query($str);

    обратно измененный текст возвращать каким образом?
    return не подходит.

  6. хотя если просто
    echo $text; там еще дописать – то нормально.. только некрасивое решение проблемы.
    как у вас save.php реализован?

  7. @Дмитрий
    У меня save.php реализован точно также, как вы написали – текст сохраняется, а потом возвращается через echo. Плагин потом подставляет его в исходное поле.

  8. А можно листинг файлов save.php, file.php привести или кинуть на почту. Спасибо

  9. [...] одной из прошлых статей я писал о том, как сделать текст на странице динамически [...]

  10. Спасибо огромное, за эту и предыдущую статью!

  11. Доброе время суток. У меня такой вопрос:
    Использую этот пример вместе с tablesorter и в итоге на странице получается:
    $(document).ready(function() {
    $(”#smsstat”).tablesorter(
    {

    sortList:[[0,1]],

    widgets: ['zebra']

    }
    );
    $(”.edititle”).editable(”jedit.php?act=subaccount&do=edititle”,
    {
    type : ‘textarea’,
    cancel : ”,
    submit : ‘+’,
    indicator : ”,
    tooltip : “Щелкните чтоб отредактировать этот текст”,
    rows : 0,
    width : 200,
    placeholder : ‘нет (добавить)’
    }
    );
    });

    в итоге, если сначала использовать сортировку на странице, то не работает редактирование
    .
    подскажите что я не так делаю и есть ли выход из такой ситуации…
    спасибо!
    З.Ы. подписался на ваш блог. блог замечательный

  12. Приятно, что мой блог нравится, спасибо :)
    Что касается проблемы. Как я понимаю, плагин для сортировки изменяет DOM, т.е. “перерисовывает” таблицу. А значит, назначенный плагином editable обработчик пропадает. Я думаю нужно каждый раз после сортировки опять назначать его:
    $(”.edititle”).editable(…); // первоначально назначаем

    $(”table”).tablesorter();
    $(”table”).bind(”sortEnd”,function() {
    $(”.edititle”).editable(…); // опять назначаем, т.к. таблица изменена
    });
    Для удобства блок $(”.edititle”).editable(…); можно вынести в отдельную функцию, чтобы не дублировать код.

Оставить комментарий

JSToolbox создан на основе WordPress