这有什么问题?
<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>
已创建并向其发送新的日志条目时。
答案 0 :(得分:1)
第一个问题是你建立
msgDiv = jQuery("#RS_text"),
在你追加之前,在它不存在的时候,所以集合是空的。在附加textarea之后进行初始化。
另一个问题是你创建了多个具有相同ID的元素。