我有一组3个可编辑的预标记。当有人在其中一行并点击"enter"时,我希望它在它所在的行下面(在文档树中)插入一个新标记。我曾试图在标记上放置一个事件处理程序,以便发生这种情况,但"onkeypress"似乎没有启动。
<script>
function handlers(){
var pres = document.getElementsByTagName("pre");
for(i=0; i<pres.length;i++){
pres[i].addEventListener("onkeypress", function(e){
if(e.which != 13) return;//the ENTER key
var tag = e.srcElement;
if(tag.nextSibling){
var next = tag.nextSibling;
var newPre = document.createElement('pre');
tag.nextSibling = newPre;
newPre.nextSibling = next;
}
var tree = document.getElementById("tree");
tree.innerHTML = document.getElementByTagName().length;
});
}
}
</script>
<body onload="handlers();">
<div id="editor" contentEditable="true">
<pre>1</pre>
<pre>2</pre>
<pre>3</pre>
</div>
<div>
<p id="tree"></p>
</div>
</body>
您对元素数组的迭代不正确,并且没有正确附加事件侦听器。
我建议将for循环更改为:
for (var i=0, l=pres.length; i<l; i++) {
pres[i];//This is where the Element is stored
}
你可以在这里阅读附加事件监听器的
此外,它还显示:http://jsfiddle.net/vZYpX"contentEditable"下按键事件的来源是"contentEditive"的实际元素。因此,您必须使<pre>
的内容可编辑(而不是div),或者将侦听器附加到父div(当前为contentEditable)。
我不确定'onkeypress'是否可以从'pre'标记中激发。
不过,我有一个建议:1.注册文档。使用移动检测鼠标位置。2.注册document.onkeypress事件,当检测到"回车"键时,检查鼠标是否位于"pre"标记上。如果是,请运行您的代码。
它应该是这样的:
function moveMoveHandler(e)
{
var evt = window.event || e;
window.lastMouseX = evt.clientX;
window.lastMouseY = evt.clientY;
}
function keypressHandler(e)
{
var evt = window.event || e;
// handling only 'enter' key
if (evt.keyCode !== 13) return;
// getting the element the mouse is on
var elem = document.elementFromPoint(window.lastMouseX,window.lastMouseY);
var node = elem;
// checking if the found node is a child of a 'pre' node
while (node.nodeName !== "PRE" && node !== document.body)
node = node.parentNode;
if (node.nodeName === "PRE")
{
... INSERT YOUR CODE HERE ...
}
}
// IE
if (window.attachEvent)
{
document.attachEvent("onkeypress", keypressHandler);
document.attachEvent("onmousemove", moveMoveHandler);
}
// other browsers
else
{
document.addEventListener("keypress", keypressHandler, false);
document.addEventListener("mousemove", moveMoveHandler, false);
}