【问题标题】:Click on edit jquery点击编辑jquery
【发布时间】:2015-07-16 05:08:35
【问题描述】:

我是新手,所以我的问题非常简单直接。

我有一个简单的 html 文本。当我单击该 html 文本时,文本应更改为保留值的输入字段,当用户在文本框外单击时,输入文本字段现在应更改为 html 文本。

<div class="myText"> Hellow World </div>

有人可以在 jquery/Meteor 中做到这一点吗?我实际上正在构建一个流星项目

【问题讨论】:

  • 简而言之,添加一个将文本更改为输入的 onClick 事件。使用 .html()。还添加一个 onBlur 事件,该事件使用 .val() 将类更改回当前输入框的值
  • 它作为一种算法非常棘手......你应该尽量让事情简单明了,不那么令人头疼,恕我直言。
  • 很简单:查看contenteditable attribute!

标签: javascript jquery html css meteor


【解决方案1】:

您可以通过contenteditable attribute 做到这一点

<div class="myText" contenteditable="true"> Hellow World </div>
<!-- Your div is now editable -->

【讨论】:

    【解决方案2】:

    Updated DEMO jsFiddle

    $(document).ready(function() {
        $('.editable').on('click', function() {
            var that = $(this);
            if (that.find('input').length > 0) {
                return;
            }
            var currentText = that.text();
    
            var $input = $('<input>').val(currentText)
            .css({
                'position': 'absolute',
                top: '0px',
                left: '0px',
                width: that.width(),
                height: that.height(),
                opacity: 0.9,
                padding: '10px'
            });
    
            $(this).append($input);
    
            // Handle outside click
            $(document).click(function(event) {
                if(!$(event.target).closest('.editable').length) {
                    if ($input.val()) {
                        that.text($input.val());
                    }
                    that.find('input').remove();
                }
            });
        });
    });
    

    在我的解决方案中,您需要将 class="editable" 添加到所有可编辑的 div 中。

    您还需要为这些 div 设置 position: relative。也许您可以更新我的代码并编辑 css:

    .editable {
      position: relative;
    }
    

    要正确对齐div内的input,需要去掉边框或者将输入的.css({})设置为left: -1pxtop: -1px。边框实际上将输入向左推 1px,从顶部推 1px。

    【讨论】:

    • 很好的解决办法,但是好像html标签不会被保留,有什么解决办法吗?
    • @vanabel 你的意思是,html标签会不会被保留?
    • 我的意思是,如果.editable元素中有一些html标签,比如&lt;div class='editable"&gt; &lt;b&gt;Strong&lt;/b&gt;&lt;br /&gt;This supposed in the second line. &lt;/div&gt;,那么在外面点击之后,html标签会丢失吗?
    【解决方案3】:

    试试这个:

    $(function() {
      $('div.myText').on('click', function() {
        var div = $(this);
        var tb = div.find('input:text');//get textbox, if exist
        if (tb.length) {//text box already exist
          div.text(tb.val());//remove text box & put its current value as text to the div
        } else {
          tb = $('<input>').prop({
            'type': 'text',
            'value': div.text()//set text box value from div current text
          });
          div.empty().append(tb);//add new text box
          tb.focus();//put text box on focus
        }
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <div class="myText">Hello world</div>
    <div class="myText">This is second</div>

    【讨论】:

      【解决方案4】:

      试试这个:

      $(document).click(function() {
        $('.myText').html("Hello World");
      });
      
      $(".myText").click(function(event) {
        $('.myText').html("<input type='text' id='test' value='Hello World'/>");
        $('#test').focus();
        event.stopPropagation();
      });
      

      FIDDLE.

      【讨论】:

        【解决方案5】:

        要做到这一点非常容易且易于理解,您还可以制作两个元素而不是更改。 工作小提琴:http://jsfiddle.net/45utpzhx/

        它执行 onClick 事件和 onBlur。

        html

        <div>
            <span class="myText">Hello World</span>
            <input class="myInput"  />
        </div>
        

        jQuery

        $(document).ready(function() {
        
         $(".myText").click(function() { 
          $(this).hide();
          var t = $('.myText').html();
          $('.myInput').val(t);
          $('.myInput').show();
         });
        
         $(".myInput").blur(function() {  
        
          $(this).hide();
          var t = $('.myInput').val();
          $('.myText').html(t);
          $('.myText').show();
        
         });
        });
        

        【讨论】:

        • blur 在这种情况下第一次单击元素时不起作用,您需要在文本上单击两次,然后才会在这种情况下触发 blur 事件
        • @MarekKus 为其添加焦点事件
        【解决方案6】:

        用值等于被点击元素的文本的输入替换被点击的元素

        $(document).on('click', '.myText', function() {
          var that = $(this);
          var text = that.text();
          that.wrap('<div id="wrp" />');
          $('#wrp').html('<input type="text" value="' + text + '" />');
        });
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
        <div class="myText"> Hellow World </div>

        【讨论】:

        • OP 还要求在用户离开该字段时将输入更改回 div。 ;)
        • 如果用户在框外单击,OP 还要求将 &lt;input&gt; 恢复为 HTML。为此,我建议将一个事件附加到body,并在处理函数中检查单击元素上的 CSS 类myText;如果不存在,则恢复为 HTML。
        【解决方案7】:

        你可以试试这个解决方案:

        $('.myText').click(function(){
          var m = $(this).text();
          $(this).html('');
          $('<input/>',{
            value : m
          }).appendTo(this).focus();
        });
        
        $(document).on('blur','input',function(){
          var m = $(this).val();    
          $(this).parent().find('input').remove().end().html(m);
        
        });
        

        工作DEMO

        【讨论】:

          【解决方案8】:

          $('#text').on('click', function() {
          $("#text").hide();
                  if ($("#text").text()=="Add New text"){
          $('#in_text').val("");
          }else{
          $('#in_text').val($("#text").text());
          
          }
          $("#in_text").show();
                      });
                  // Handle outside click
          $(document).click(function(event) {
                      if(!$(event.target).closest('.editable').length) {
                   if($("#text").css('display') == 'none'){
                  $("#in_text").hide();
                  if ($("#in_text").val()==""  ){
                  $('#text').text("Add New text");
                  $('#text').addClass("asd");
                  }else{
                  $('#text').removeClass("asd");
                  $('#text').text($("#in_text").val());
                  }
                  $("#text").show();
          }
             }
                  });
          #in_text{
            display:none;
          }
          .editable{ 
          width:50%;
          
          }
          .asd{
            border-bottom : 1px dashed #333;
          }
          #text{
          display: inline;   
          }
          <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
          <div class="editable">
          <div id="text" >Text in div</div>
          <input type="text" placeholder="Add New Text" id="in_text"/></div>

          【讨论】:

            猜你喜欢
            • 2017-01-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-23
            • 2020-05-06
            • 1970-01-01
            • 2014-11-17
            相关资源
            最近更新 更多