jQuery .append()在编辑文本后不附加到textarea

Krz*_*mic 47 javascript jquery

请看以下页面:

<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"/>
</head>
<body>
    <div class="hashtag">#one</div>
    <div class="hashtag">#two</div>
    <form accept-charset="UTF-8" action="/home/index" method="post">
        <textarea id="text-box"/>
        <input type="submit" value ="ok" id="go" />
    </form>

    <script type="text/javascript">
        $(document).ready(function() {

            $(".hashtag").click(function() {
                var txt = $.trim($(this).text());
                $("#text-box").append(txt);
            });

        });
    </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我期望的行为,我希望实现的是当我点击其中一个div时,hashtag他们的内容(分别为"#one"和"#two")将附加在textarea 文本的末尾text-box.

当我在页面加载后单击哈希标记时,会发生这种情况.然而,当我然后也开始text-box手动编辑文本然后返回点击任何主题标签时,他们没有附加在Firefox上.在Chrome上,最奇怪的事情正在发生 - 我手动输入的所有文本都被新的主题标签取代并消失.


我可能在这里做了一些非常错误的事情,所以如果有人可以在这里指出我的错误,以及如何解决这个问题,我将不胜感激.

谢谢.

Ale*_*yne 91

2件事.

首先,<textarea/>它不是有效的标签. <textarea>必须使用完整的</textarea>结束标记完全关闭标记.

第二,$(textarea).append(txt)不像你想象的那样有效.加载页面时,textarea中的文本节点将设置该表单字段的值.之后,可以断开文本节点和值.当您在字段中键入时,值会更改,但DOM上的文本节点不会更改.然后使用append()更改文本节点,浏览器将删除该值,因为它知道标记内的文本节点已更改.

所以你想设置值,你不想追加.为此使用jQuery的val()方法.

$(document).ready(function(){
  $(".hashtag").click(function(){
    var txt = $.trim($(this).text());
    var box = $("#text-box");
    box.val(box.val() + txt);
  });
});
Run Code Online (Sandbox Code Playgroud)

工作示例:http: //jsfiddle.net/Hhptn/


小智 11

使用val()函数:)

<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
    </head>
    <body>
        <div class="hashtag">#one</div>
        <div class="hashtag">#two</div>
        <form accept-charset="UTF-8" action="/home/index" method="post">
            <textarea id="text-box"></textarea>
            <input type="submit" value ="ok" id="go" />
        </form>
        <script type="text/javascript">
$(document).ready(function(){

  $(".hashtag").click(function(){
    var txt = $.trim($(this).text());
    $("#text-box").val($("#text-box").val() + txt);
  });
});
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?

附加的原因似乎不起作用是因为textarea的值由子节点组成,但是根据我的Firebug,通过将其视为多个单独的节点,屏幕将不会更新.Firebug将向我显示更新的子节点,但不是我手动键入文本区域的文本,而屏幕显示手动键入的文本但不显示新节点.