单击鼠标的JavaScript显示坐标不止一次

时间:2012-01-07 15:03:01

标签: javascript events addeventlistener

我目前正在学习JavaScript,并且当用户点击将输出鼠标点击坐标的文档时,我能够编写一个事件处理程序。

然而我遇到的问题是它只会一次。我认为如果事件处理程序正在等待“点击”,如果它有一个,它将唤起函数getCords。

var x = document;
x.addEventListener("click", getCords, false);

function getCords(event){
    x.writeln(event.clientX, ",", event.clientY)
}

1 个答案:

答案 0 :(得分:4)

MDN上:

  

document.writelndocument.write相同,但添加换行符。

所以,let's look at document.write

  

写入已经加载但未调用的文档   document.open()将自动执行document.open调用。一旦   你写完了,建议你拨打document.close(),   告诉浏览器完成加载页面。你写的文字是   解析成文档的结构模型。在上面的例子中,   h1元素成为文档中的节点。

这是什么意思?

这意味着您的代码真的如下所示:

var x = document;
x.addEventListener("click", getCords, false);

function getCords(event){
    x.open(); // <-------- new
    x.writeln(event.clientX, ",", event.clientY)
}

第一个要做的修复(也会使页面显示为永久“加载”)是按照建议添加document.close()调用:

var x = document;
x.addEventListener("click", getCords, false);

function getCords(event){
    x.open(); // <-------- new
    x.writeln(event.clientX, ",", event.clientY)
    x.close(); // <-------- new
}

现在更清楚的是 - 我们在这里创建一个文档流。您现有的文件内容被覆盖;事件处理程序不再存在。

事实上,the DOM standard says this explicitly about open

  

打开文档流进行编写。 如果目标中存在文档,则此方法会清除它。

并且您的新文档不包含您的脚本,因此即使在回调中重新分配事件处理程序也行不通。

最好不要使用document.write(和document.writeln);将文本指定为某些divspan节点的内容。