【问题标题】:How to detect a click outside the current textarea in prototype?如何检测原型中当前文本区域之外的点击?
【发布时间】:2014-04-28 13:17:40
【问题描述】:

我有一个“转换”为文本区域的 div。嗯,这是一个隐藏的文本区域,当有人点击 div 时会显示出来。 div 将隐藏,textarea 将获取 div 的 innerHTML。用户现在可以编辑文本,在他或她完成后我希望他们在文本区域之外单击。现在 textarea 隐藏,div 再次显示更新的 html 内容。

但目前它没有按预期工作。我如何检测用户何时在文本区域外点击?是否有与 jQuery 等效的 .not()?用户还应该能够调整文本区域的大小。目前它在调整大小后关闭。有什么想法吗?

这是一个小提琴: http://jsfiddle.net/t3qRL/

这里是 HTML:

<div class="media_box">
    <div class="label"> Textfeld:</div>
    <!-- with the property contentEditable the div would be editable but there would be no linebreaks -->
    <div class="txt_area"> 
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam id nunc quis purus aliquam sollicitudin porta nec dui. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris sagittis eleifend dignissim. Curabitur ligula est, rhoncus eget lobortis accumsan, volutpat et lorem. Suspendisse augue mauris, mollis et lectus at, sodales pellentesque metus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In rutrum est vitae justo ullamcorper malesuada.
    </div>
    <textarea class="cright_txtarea" style="display: none">
    </textarea>
</div>

JS:

document.observe('dom:loaded', function () {
    $$('body')[0].on('click', '.txt_area', function (event, element) {
        event.stopPropagation();
        var div_text = element.innerHTML;
        element.hide();
        var text_area = element.next('textarea');
        text_area.show();
        text_area.value = div_text;
        $$('html')[0].on('click', function () {
            element.show();
            element.update(text_area.value);
            text_area.hide();
        });
    });
});

【问题讨论】:

  • 您是否尝试过观察 blur 事件的 textarea 元素?

标签: javascript onclick textarea prototypejs


【解决方案1】:

找到了解决方案,但我仍然愿意接受更优雅的解决方案;)

这是新的小提琴:http://jsfiddle.net/t3qRL/2/

更新的javascript:

document.observe('dom:loaded', function () {
    $$('body')[0].on('click', '.txt_area', function (event, element) {
        event.stopPropagation();        
        var div_text = element.innerHTML;
        element.hide();
        var text_area = element.next('textarea');
        text_area.show();
        text_area.value = div_text;
        text_area.onmouseover = function () {
            text_area.observe('click', function(event) {
                Event.stop(event);
            });
        }

        text_area.onmouseout = function () {                
            $$('html')[0].on('click', function () {
                console.log(text_area.value);
                element.show();
                element.update(text_area.value);
                text_area.hide();
            });
        }
    });
});

【讨论】:

    【解决方案2】:
    document.on('click', function(evt, elm){
      if(elm.match('.txt_area')){
        // do your textarea magick here
      }else{
        // cancel the textarea etc. if it's open
      }
    });
    

    这应该会让你看起来不那么痛苦。

    【讨论】:

    • 谢谢!事实上,它更短,但我需要将“.txt_area”绑定到点击函数,因为用户可以动态地将 div 添加到 dom。因此,普通的点击功能将无法完成这项工作。并且在 else 条件元素或 elm 中没有定义,所以我不知道如何选择它们...... :(
    • elm 变量正在点击处理程序中设置。您单击任意位置(单击事件会冒泡到文档级别),但 elm 始终与您实际单击的任何位置完全相同。因此,如果您单击#PageDiv,您将得到与$('PageDiv') 等效的elmif(elm.match('.txt_area') 表示 elm 根据需要绑定到这些大括号内的 .txt_area 。因此,无需为一个事件使用两个处理程序,您只需在一个处理程序中过滤要做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2023-03-02
    • 2014-06-23
    • 1970-01-01
    相关资源
    最近更新 更多