jQuery .append()textarea到div有.val()未定义

时间:2014-04-29 16:18:18

标签: jquery textarea undefined

这有什么问题?

<button id='myButton'>Click me</button>

<p>Borken</p>
<div id='RS_msgBox'></div>

<hr />


<!-- This is the control. The structure is exactly the same as when after 
     the JS gets done .appending to #RS_msgBox -->

<p>Works</p>
<div id='RS_msgBox2'>
    <div id='RS_msgs2'>
        <textarea id='RS_text2' cols=50 rows=5>
            I was here before any JS affected me.
        </textarea>
    </div>
</div>


jQuery('#myButton').click(function () {

    var msgDiv  = jQuery("#RS_text"),
        msgDiv2 = jQuery("#RS_text2"),
        logOne  = '\nI am the first log entry. ',
        logTwo  = "\nHey, where is the first entry? ";

    jQuery("#RS_msgBox").append("<div id='RS_msgs'><textarea id='RS_text' cols=50 rows=5>I was via JS append().</textarea></div>");

    // Experiment
    console.log('Before:'+msgDiv.val());
    msgDiv.val(msgDiv.val()+logOne); // Doesn't work because msgDiv.val() is undefined at this point.  But why?? I 'defined' it when I .append()ed it, didn't I?
    console.log('After:'+msgDiv.val());

    // Control
    msgDiv2.val(msgDiv2.val()+logOne);

    // Appending further text still fails whether we call another function or not.
    anotherFunc(logTwo);
});

function anotherFunc(newText) {
    var msgDiv = jQuery("textarea#RS_text"),
        msgDiv2 = jQuery("textarea#RS_text2");

    msgDiv.val(msgDiv.val()+newText);
    msgDiv2.val(msgDiv2.val()+newText);
}

http://jsfiddle.net/t3knocrat/NZLjd/

tl; dr:为什么我不能.append() <textarea><div>并立即设置.val(logOne)?更重要的是,如何解决/解决?

-

我已经找到了答案,几乎回答了我的问题,但没有一个真正解释为什么最近创建的<textarea>没有附加,或者如何解决它。< / p>

换句话说,我现在肯定这是一个重复的问题,但我没有找到回答我的两个问题的问题(为什么?&amp; how?)。

猜测浏览器需要一点时间.append() <textarea>到DOM,并且代码异步工作。换句话说,代码只是“跳过”设置.val(logOne),因为#RS_text还没有准备好(没有抛出,捕获或处理错误),它只是继续将.val(logTwo)设置为#RS_text2是一种快乐的方式。

有人知道这听起来是否正确吗?

最终,我认为更重要的是如何解决/解决这个问题。目标是创建一个文本区域,其唯一目的是从javascript的其余部分(通过node和socket.io)接收注释/日志条目。此代码 DOES 第二次工作,当<textarea>已创建并向其发送新的日志条目时。

1 个答案:

答案 0 :(得分:1)

第一个问题是你建立

msgDiv  = jQuery("#RS_text"),
在你追加之前

,在它不存在的时候,所以集合是空的。在附加textarea之后进行初始化。

另一个问题是你创建了多个具有相同ID的元素。