【问题标题】:How to Enable/Disable JEditable如何启用/禁用 JEditable
【发布时间】:2011-05-09 14:45:13
【问题描述】:

解决方案

感谢 Arman 的 P. 概念证明,终于可以在我的网站上使用它。

代码

//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"
        );
    });
}); 


更新

所以现在,按照我认为 Arman 的建议,我让 JEdtiable 仅在触发自定义事件时才起作用。只有当我没有找到锁时,我才会尝试触发事件。但是现在 JEditable 没有被调用。我尝试触发它的方式有问题。 [请注意,如果我使用 &lt;button onclick="$('.edit').trigger('custom_event');"&gt;Click to Edit&lt;/button&gt; 之类的按钮对其进行测试,JEditable 确实会被调用]

代码

这是我的新代码

$(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 调用的回调中没有锁定时才添加该类,但这也不起作用。

任何建议将不胜感激!

【问题讨论】:

  • 我没有将 tinyMCE 与 jEditable 一起使用。我需要知道 tinyMCE jEditable 究竟创建了什么来帮助你。如果您能够在线提供您的代码并给我链接,那将对我有很大帮助。

标签: javascript jquery jeditable


【解决方案1】:

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")

【讨论】:

  • 那么有人会写像$(this).disable;这样的东西吗?
  • 更新了 cmets。最初发布时我还没有尝试过 :) 但它似乎有效
【解决方案2】:

尝试取消绑定 jeditable 添加到元素的先前事件(可能是dblclick),添加您自己的警报,然后当元素解锁时再次调用 jeditable。

另一种解决方案是在元素被锁定时添加透明的div 或具有绝对定位的元素,并将 dblclik 事件与您自己的消息绑定到该透明元素。 .remove()他们,当你的原始元素被解锁时。

我在您的代码中看到的问题是:当第一个用户 dblclicks 元素应用 jeditable 并锁定它时,当第二个用户 dbclicks 您想要提醒时,问题是 jeditable 已经将 dblclick 事件应用到元素。而不是这个改变你的锁定检查到mouseenter事件,如果你的锁定条件成功取消绑定dblclick事件(见unbind),如果没有人在编辑,只需应用jeditable,editText()的函数体。没有必要为它设置单独的功能。以及为什么使用.live()。你有动态添加的元素吗?

您也可以在JQuery JEditable - How to Disable on click editing找到您的问题的一些答案

我为您提出的解决方案如下所示。

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');
?>

解锁.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;
    }
 ?>

保存.PHP

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

  echo $_POST['value'];
?>

LOCK.TXT(初始)

0

您可以从示例中获取想法。当然你可以做得更优雅。这是一个粗略的例子。您可以自己尝试,只需在 Web 服务器上的同一目录中创建这些文件并复制粘贴内容即可。很抱歉没有把演示放到网上,jsFiddle 不支持改变状态的 ajax(至少我是这么认为的)。如果您需要任何进一步的帮助,请告诉我。祝你好运。

【讨论】:

  • 嗨,阿曼。我在哪里以及如何解除绑定?我想我已经尝试过了:` $(function editText(){ $(".edit-ready").editable('ajax/save.php?editnotetext', { type : 'mce', ... } , function(value, settings) { $(this).unbind('dblclick.editable'); }); });`
  • 谢谢阿曼。你说得对,我不需要使用 .live。很抱歉很厚,但我仍然不清楚如何去做。我在发帖之前查看了stackoverflow.com/questions/3367885/…,但我仍然找到了它。我试过$(".edit").bind("MouseEnter",function() {,但现在锁定不起作用。再次抱歉,很抱歉,但我现在才使用 JQuery 几天[而且似乎该网站已关闭]。
  • 我是否应该先为 JEditable 创建自己的自定义事件,然后在注释未锁定时尝试触发它?我如何触发它? (this).trigger('custom_event');?
  • @Hydra 让我为您准备示例并在此处发布。我会在 2-3 小时内完成(因为我现在有点忙)。抱歉,如果您赶时间...
  • 阿曼。非常感谢你的帮助。我想我快到了。概念证明有效(我复制了代码可以创建它们各自的页面,看起来它有效)。我认为在将您的代码合并到我的代码中时有几个问题。我发布了我的更新代码和相关的 PHP。
【解决方案3】:

这确实需要对课程和位置进行一些处理,但效果很好。 这是基于 jquery UI 的代码,用于创建一个按钮,该按钮控制其自身的状态和可编辑文本的状态

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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多