8

我是 jQuery 新手,所以我敢打赌我做错了什么,但我无法弄清楚为什么这个事件没有触发。由于正在接受数据的应用程序,我有一个 textarea 元素需要在提交之前删除任何中断空格。当它失去焦点时,我试图在文本区域中进行清理,因此使用模糊方法。不幸的是,它似乎没有在我的表单中触发。奇怪的部分是相同的代码在 jsFiddle 中工作,但只是在最初失去焦点时。对 textarea 的所有后续更改和失去焦点都不会触发该事件。我还在另一个答案中读到可能需要使用delegate()or.on()方法,但我不确定如何正确执行此操作。(jQuery blur() 不起作用?)代码如下,任何建议都会有所帮助。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>

<script type="text/javascript">
$(document).ready(function() {
$("#comments").blur(function() {
    var txt = $("#comments").html();
    txt = txt.replace(/\n/g, ' ');
    txt = txt.replace(/\s{3,}/g, ' ');
    $("#comments").html($.trim(txt));
});

//$("#comments").trigger("blur"); added this to help fix the issue, but it didn't make a difference
});
</script>

HTML:
<textarea name="comments" id="comments" style="width: 100%; height:200px"></textarea>

这是 jsFiddle 链接:http: //jsfiddle.net/75JF6/17/

编辑:感谢所有快速响应。我已经查看了每个人的答案并听取了您的建议。我已经完成了 95%,但是仍然存在一个问题。切换到.val()方法而不是.html()执行此操作的更好方法,但根据 jQuery API,在textarea解析回车符的 s 上调用此方法时存在以下问题。问题是我需要确保将它们删除以验证该字段。

注意:目前,.val()在 textarea 元素上使用会从浏览器报告的值中去除回车符。然而,当这个值通过 XHR 发送到服务器时,会保留回车(或由不包含在原始值中的浏览器添加)。可以使用 valHook 来解​​决此问题,如下所示:

$.valHooks.textarea = {
  get: function( elem ) {
  return elem.value.replace( /\r?\n/g, "\r\n" );
  }
};

正如我之前提到的,我是 jQuery 新手,找不到太多关于如何在 google 和堆栈溢出之间正确使用 valHooks 的信息。如果有人可以就我最初的问题对此有所了解,将不胜感激。

4

7 回答 7

5

你的代码工作得很好。

还要在提交按钮上附加单击事件,因为单击按钮时不会发生模糊事件。您必须明确使 textarea 失去焦点。

$(document).ready(function () {
    $("#comments").on('blur', trimText);
    $("input[type='submit']").on('click', function (e) {
        e.preventDefault();
        trimText();
        $("input[type='submit']").submit();
    });

    function trimText() {
        var txt = $("#comments").html();
        txt = txt.replace(/\n/g, ' ');
        txt = txt.replace(/\s{3,}/g, ' ');
        $("#comments").html($.trim(txt));
    }
});

检查小提琴

于 2013-09-09T17:14:56.380 回答
4

不需要将delegate() 或on() 添加到元素中,仅在动态添加、删除等情况下才需要,但尝试不会有任何坏处。

对于您的示例,将:替换为
$("#comments").blur(function() {

$(document).on("blur","#comments",function() {

另外,你可以通过 chrome/firefox/safari/etc 的开发者工具检查它是否在控制台中出现错误?

于 2013-09-09T17:19:21.273 回答
2

你很亲密。jQuery 中的 on() 事件可能是您可以使用的资源最多的工具之一,但是标记它的方法很少。

$("#comments").on({
    'blur' : function() {
        // your magic here
    }
});
$("#comments").trigger("blur");

我分叉了你的 jsFiddle 以获得你的工作。http://jsfiddle.net/75JF6/33/你很接近并且走在正确的轨道上。将 on() 事件视为向任何事件添加回调功能。我希望这会有所帮助!

于 2013-09-09T17:24:57.440 回答
1

正确的方式:http: //jsfiddle.net/75JF6/35/

$(document).ready(function() {
    $("textarea#comments").on('blur',function() {
        var txt = $(this).val();
        txt.replace(/\n/g, ' ');
        txt = txt.replace(/\s{3,}/g, ' ');
        $(this).val($.trim(txt));
    });
});

val() 应该用于表单输入元素,textarea 也不例外。

于 2013-09-09T17:23:58.373 回答
0

仅当您在 DOM 准备好后附加目标元素时才使用 On、delegate 或 Live。

你可以使用 keyup 来做同样的事情,除了它在每次击键时触发。当用户在键入后等待 300 毫秒时,将触发以下代码。它会比模糊事件更快。

var ClearInterValHandel;
var interval = 300 //in milisecond.

$("#comments").keyup(function(){
ClearTimeOut(ClearInterValHandel);

ClearInterValHandel = SetTimeout(trimText, interval);    
});

function trimText() {
        var txt = $("#comments").html();
        txt = txt.replace(/\n/g, ' ');
        txt = txt.replace(/\s{3,}/g, ' ');
        $("#comments").html($.trim(txt));
    }
于 2013-09-09T17:22:28.067 回答
0

@Sushanth 和 @Eez 的答案以及一些额外的研究让我找到了这个问题的正确答案。感谢您的意见,这使我走上了正确的道路。我将把这个答案设置为社区维基。

将检索方法从.html()更改.val()为 以及使用该.on()功能都解决了我遇到的问题。由于表单字段"#comments"是一个textarea它在 jQuery API 中遇到了一个已知问题:http: //api.jquery.com/val/

下面是实际解决问题的代码:

$(document).ready(function () {
    $.valHooks.textarea = {
        get: function (elem) {
            return elem.value.replace(/\r?\n/g, "<br>\n");
        }
    };


$("#comments").on('blur', trimText);
$("input[type='submit']").on('click', function (e) {
    e.preventDefault();
    trimText();
    $("form:first").submit();
});

function trimText() {
    var txt = $("#comments").val();
    txt = txt.replace(/<br>\n/g, ' ');
    txt = txt.replace(/\s{3,}/g, ' ');
    //alert(txt);
    $("#comments").val($.trim(txt));
  }


});

如果有人感兴趣,我再次分叉 @Sushanth-- 的 jsFiddle 以包含所有这些信息:http: //jsfiddle.net/B3y4T/

于 2013-09-09T19:32:36.437 回答
0

它适用于val()而不是html()

我认为这是因为 html 值不会更新 DOM 树的实际内容

$(document).ready(function() {
    $("#comments").blur(function() {

        var txt = $("#comments").val();

        txt = txt.replace(/\n/g, ' ');
        txt = txt.replace(/\s{3,}/g, ' ');

        $("#comments").val($.trim(txt));
});
});
于 2013-09-09T17:17:16.540 回答