Как включить / отключить JEditable - PullRequest
2 голосов
/ 09 мая 2011

РЕШЕНИЕ

Благодаря доказательству концепции Армана П., наконец, он стал работать с моим сайтом.

код

//Edit Note
$(function(){
    function makeEditable() {
        $(".edit").editable('ajax/save.php?editnotetext', {
            type : 'mce',
            submit : '<button class="save_button">Save</button>',
            event: 'dblclick',
            indicator : 'Saving...',
            tooltip : 'Doubleclick to edit...',
            onblur: 'ignore',
            width : '700px',
            height : '100px',
            callback : function(value, settings){
                      console.log('unlocked');
                      $.post('ajax/save.php?unlocknotetext', {"id" : $(this).attr('id')});
                      $(this).effect("highlight", {}, 3000);
                      $(this).parents('.panel').effect("highlight", {}, 3000);
            },
            'onreset' : function(){
                console.log('unlocked');
                $.post('ajax/save.php?unlocknotetext', {"id" : $(this).attr('id')});
            }
        });
    };

    makeEditable();

     $('.edit').live('click', function() {
          console.log('locked');
          $.post('ajax/save.php?locknotetext', {"id" : $(this).attr('id')});
     });

    $(".edit").click(function() {
        $.post('ajax/save.php?checklock', {"id" : $(this).attr('id')},
            function(data) {
                // USE SAME OPTION IN BOTH PLACES
                // IF YOU USE 1ST OPTION, YOU CAN TAKE JEDITABLE OUT OF makeEditable() and do everything without that function
                if (data[0].is_locked == 1) {
                  // Option 1
                  //$(this).editable('disable');
                  //alert(data[0].username.toUpperCase() + " is editing this note!");
                  // Option 2
                  $(".edit").unbind('dblclick');
                } else {
                  // Option 1
                  //$(this).editable('enable')
                  // Option 2
                  makeEditable();
                }
            },
            "json"
        );
    });
}); 


UPDATE

Итак, теперь, согласно тому, что, как мне кажется, предложил Арман, я сделал JEdtiable работающим, только если запускается пользовательское событие. Я пытаюсь вызвать событие, только если не нашел блокировки. Но теперь JEditable не вызывают. Что-то не так с тем, как я пытаюсь это вызвать. [Обратите внимание, что JEditable вызывается, если я проверю его с помощью кнопки вроде <button onclick="$('.edit').trigger('custom_event');">Click to Edit</button>]

код

Так вот мой новый код

$(function(){
    $(".edit").bind("dblclick",function() {
        $.ajax({ // first check to see if locked
                type: "POST",
                url: "ajax/save.php?locknotetext",
                data: {"id" : $(this).attr('id')},
                dataType: "json",    
                success: function(data){
                    if (data[0].is_locked == 1){ // if locked then alert someone is editing ntoe
                        alert(data[0].username.toUpperCase() + " is editing this note!"); 
                    }
                    else{
                        $(this).trigger('custom_event');
                        $(this).unbind('custom_event.editable');
                    }
                }
        }); //close $.ajax(
    });
});

Вот JEditable части

$(function(){
   $(".edit").editable('ajax/save.php?editnotetext', {
      type : 'mce',
      submit : '<button class="save_button">Save</button>',
      event: 'custom_event',
      indicator : 'Saving...',
      tooltip : 'Doubleclick to edit...',
      onblur: 'ignore',
      width : '700px',
      height : '100px',
      callback : function(value, settings){
                console.log(this, value, settings);
                $(this).effect("highlight", {}, 3000);
                $(this).parents('.panel').effect("highlight", {}, 3000);
                $.ajax({
                    type: "POST",
                    url: "ajax/save.php?unlocknotetext",
                    data: {"id" : $(this).attr('id')} 
                }); //close $.ajax(
                //$(this).addClass("edit");
      }
//   },
//      function(value, settings) {
//      $(this).unbind('settings.event');
    });
});


ФОН

Я создаю веб-сайт, где люди могут делиться и редактировать заметки. Я хотел бы сделать следующее: если кто-то редактирует заметку, она блокируется, и другой пользователь не может ее редактировать.

Я использую JEditable. Пользователи могут дважды щелкнуть, чтобы отредактировать заметку.

Если пользователь дважды щелкает, я выполняю AJAX-вызов, чтобы проверить, есть ли блокировка в заметке. Если нет, я блокирую заметку, и пользователь может редактировать. Если есть блокировка, я предупреждаю пользователя «userX в настоящее время редактирует заметку».

ПРОБЛЕМА

Моя проблема в том, что я хочу вызывать JEditable только тогда, когда нет блокировки. В противном случае, я просто хочу предупредить пользователя, что кто-то еще его редактирует. Проблема, которую я получаю с моим кодом ниже, заключается в том, что JEditable вызывается несмотря ни на что Я также пытался использовать другое имя класса для редактирования и добавлять класс только тогда, когда в обратном вызове первого вызова AJAX нет блокировки, но это тоже не работает.

Любые предложения приветствуются!

Ответы [ 3 ]

5 голосов
/ 06 декабря 2011

JEditable поддерживает это изначально на этом этапе:

$.fn.editable = function(target, options) {

    if ('disable' == target) {
        $(this).data('disabled.editable', true);
        return;
    }
    if ('enable' == target) {
        $(this).data('disabled.editable', false);
        return;
    }

Это работает:

$(...).editable("disable")
$(...).editable("enable")
1 голос
/ 09 мая 2011

Попробуйте отменить привязку предыдущего события (вероятно, dblclick), которое jeditable добавило к элементу, добавьте свое собственное с предупреждением, а затем, когда элемент разблокирован, снова вызовите jeditable.

Другим решением было бы добавить прозрачный div или что-то с абсолютным позиционированием на ваши элементы, когда они заблокированы, и связать событие dblclik с вашим собственным сообщением для этих прозрачных элементов..remove() их, когда ваши оригинальные элементы были разблокированы.

Проблема, которую я вижу в вашем коде, заключается в следующем: когда первый пользовательский элемент dblclicks применяет jeditable и блокирует его, а когда второй пользователь dbclicks его, вы хотите предупредить, но проблема в том, что jeditable уже применила событие dblclick к элементу,Вместо этого измените вашу проверку блокировки на событие mouseenter, и если ваше условие блокировки выполнено успешно, отмените событие dblclick (см. unbind ), если никто не редактирует, просто примените jeditable, тело функции editText().Для этого не нужно иметь отдельную функцию.И почему используете .live().Есть ли у вас динамически добавленные элементы?

Вы также можете найти ответы на свой вопрос здесь JQuery JEditable - Как отключить редактирование кликов

Решение, которое я вам предложил, выглядит следующим образом.

HTML-файл:

<html>
  <head>
    <title>Lock wirh jEditable</title>
    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://www.appelsiini.net/download/jquery.jeditable.mini.js"></script>
    <script type="text/javascript">
      $(function() {
        function makeEditable() {
          $('#editable').editable("save.php", {
            tooltip : 'Doubleclick to edit...',
            event : 'dblclick',
            onblur : 'ignore',
            callback : function(value, settings) {
              console.log('unlocked');
            },
            'onreset' : function() {
              console.log('unlocked');
              $.post('unlock.php');
            }
          });
        };

        makeEditable();

        $('#editable input').live('focus', function() {
          console.log('locked');
          $.post('lock.php');
        });

        $('#editable').hover(function() {
          $.post('checklock.php', function(response) {
            // USE SAME OPTION IN BOTH PLACES
            // IF YOU USE 1ST OPTION, YOU CAN TAKE JEDITABLE OUT OF makeEditable() and do everything without that function
            if (response) {
              // Option 1
              $('#editable').editable('disable');
              // Option 2
              //$('#editable').unbind('dblclick');
            } else {
              // Option 1
              $('#editable').editable('enable')
              // Option 2
              //makeEditable();
            }
          });
        });
      });
    </script>
  </head>

  <body>
    <div id="editable">Here is the text that can be edited.</div>
  </body>
</html>

LOCK.PHP

<?php
  $fileName = 'lock.txt';
  file_put_contents($fileName, '1');
?>

UNLOCK.PHP

<?php
  $fileName = 'lock.txt';
  file_put_contents($fileName, '0');
?>

CHECKLOCK.PHP

<?php
  $fileName = 'lock.txt';

  $locked = file_get_contents($fileName);
    if ($locked == '0') {
      echo false;
    } else {
      echo true;
    }
 ?>

SAVE.PHP

<?php   
  $fileName = 'lock.txt';
  file_put_contents($fileName, '0');

  echo $_POST['value'];
?>

LOCK.TXT (По умолчанию)

0

Вы можете взять идею из примера.Конечно, вы можете сделать это более элегантно.Это грубый пример.Вы можете попробовать самостоятельно, создав эти файлы в том же каталоге на вашем веб-сервере и скопировав содержимое.Извините, что не выложил демо онлайн, jsFiddle не поддерживает ajax с изменением состояния (по крайней мере, я так думаю).Если вам нужна дополнительная помощь, дайте мне знать.Удачи.

0 голосов
/ 11 июня 2012

Для этого требуется немного возиться с классами и размещением, но это работает хорошо.Вот код на основе пользовательского интерфейса jquery для создания кнопки, которая управляет собственным состоянием и состоянием редактируемого текста

function makeEditable(params){ //params excluded for now
$("div#body").append("<button id='editTable'>Edit Table</button>"); //inserts a button into a div

$("div#body button#editTable").button({icons: {primary:'ui-icon-pencil'}}); //creates button
$("div#body button#editTable").unbind(); //removes all listeners
$("div#body button#editTable").hover(    //sets hover behaviour
    function(event){ //over
        $(this).addClass("ui-state-hover");
    }, 
    function(event){ //over
        $(this).removeClass("ui-state-hover");
    }
);

//uses a class called editText which is assigned to the td elements of the blocks you want to make editable

$("div#body table .editText").editable("http://www.blah.com/Controller/CEditTable.php", {
   indicator : 'Saving...',
   tooltip   : 'Click to edit...'
}); //basic editable initialization

$("div#body table .editText").editable("disable"); //disables by default

//adds a toggle to the button which enables/disables the editable functionality
$("div#body button#editTable").toggle(
   function(event){
       $("button#editTable").removeClass("ui-state-default");
       $("button#editTable").addClass("ui-state-active");
       $("div#body table .editText").editable("enable");
   },
   function(event){
        $("button#editTable").removeClass("ui-state-active");
        $("button#editTable").addClass("ui-state-default");
        $("div#body table .editText").editable("disable");
   }
);

$("div#body button#editTable").appendTo("div#body div#tableControls"); //move button to wherever to want it.
}
...