代码之家  ›  专栏  ›  技术社区  ›  balu

内联编辑:onBlur防止触发onClick(jQuery)

  •  1
  • balu  · 技术社区  · 15 年前

    你好,StackOverflow社区!

    我目前正在为我自己的jQuery插件做内联编辑,因为那些已经存在的不符合我的需要。

    总之,我想给用户提供以下(布尔)选项,说明编辑的工作方式:

    • 提交按钮
    • 重置模糊

    假设用户希望有一个submit按钮(submit_button=true),并希望一旦失去焦点(reset_on_blur=true)就删除内联输入元素。 这将导致为按钮注册onClick处理程序,为输入元素注册onBlur处理程序。

    但是,每次用户单击按钮时,onBlur处理程序也会被触发,并导致编辑模式被保留,即在onClick事件发生之前。这使得提交变得不可能。

    仅供参考,编辑模式下的HTML如下所示:

    <td><input type="text" class="ie-input" value="Current value" /><div class="ie-content-backup" style="display: none;">Backup Value</div><input type="submit" class="ie-button-submit" value="Save" /></td>
    

    那么,如果在激活submit按钮时焦点丢失了,那么在触发submit按钮的onClick事件之前,编辑模式不会离开,那么有没有办法签入onBlur处理程序?

    我还试图注册一个$('body').click()处理程序来模拟模糊,并能够跟踪已单击的元素,但这也不起作用,并导致了相当奇怪的错误:

    $('html').click(function(e) { // body doesn't span over full page height, use html instead
    
     // Don't reset if the submit button, the input element itself or the element to be edited inline was clicked.
     if(!$(e.target).hasClass('ie-button-submit') && !$(e.target).hasClass('ie-input') && $(e.target).get(0) != element.get(0)) {  
      cancel(element);
     }
    });
    

    绝地武士使用以下代码。不过,我不喜欢这种方式,因为耽搁了。更不用说我都不明白为什么会这样。;)

    input.blur(function(e) {
     /* prevent canceling if submit was clicked */
     t = setTimeout(function() {
      reset.apply(form, [settings, self]);
     }, 500);
    });
    

    提前谢谢!

    2 回复  |  直到 15 年前
        1
  •  3
  •   Matt user129975    15 年前

    将提交绑定到 mousedown / keydown 事件而不是 click ;他们两人都曾开火 blur . 如果需要,可以使用 unbind ,或班级检查等。

    编辑:如果你不幸地点击了按钮,这将不起作用,所以这可能不是理想的方式。。。

        2
  •  0
  •   Gaurav Sachdeva    10 年前

    如果你想同时启动onblur和onclick,那么使用onfocus而不是onclick按钮。这将使onblur事件先触发,然后触发onFocus。 将代码从OnClick复制到OnFocus事件,它会很好地工作。

                        $(document).off('focus', '#Button1');
                        $(document).on('focus', '#Button1', function (e) {
    
                            // ur work.
                            }
    
                        });