我在这里要做的是在使用MooTools提交表单后显示一个跟随光标的加载框。但是,我已经将问题简化为1个div和1个形式。
脚本:
document.addEvent('domready', function(){
$('test_form').addEvent('submit', function(){
var box = $('box');
document.addEvent('mousemove', function(e){
box.setStyles({
top: e.page.y,
left: e.page.x
});
});
box.setStyle('display', 'block');
return false;
});
});
HTML:
<div id="box">
</div>
<form id="test_form" action="">
<label>Name: </label><input type="text" name="name" /><br/>
<input type="submit" value="Submit" />
</form>
的CSS:
#box {
width: 50px;
height: 50px;
background-color: blue;
position: absolute;
display: none;
}
#test_form {
margin-left: 150px;
}
提交表单时,它将显示隐藏的蓝色div,它将跟随光标。但是,在提交表单时,我无法使div显示在鼠标位置。在我们移动鼠标之前,'mousemove'不会触发;因此,蓝色div在显示后立即出现在位置(0,0)。有没有办法在提交表单后立即获取鼠标位置?或者有其他方法可以做到吗?
非常感谢任何建议!
的更新 的
我不想在提交表单之前添加鼠标事件(mousemove)。原因很简单,因为我不希望javascript在没有必要时继续检查鼠标位置。尽量避免性能问题!
答案 0 :(得分:1)
基本上,提交是一个事件,但它的event.type是提交,它不包含鼠标信息。
您的赌注是重新安排您的javascript,以便它一直安静地移动框,并通过在提交时更改显示来显示框。类似的东西:
(function() {
var box = $('box');
document.addEvent('mousemove', function(e) {
box.setStyles({
top: e.page.y,
left: e.page.x
});
});
$('test_form').addEvent('submit', function(ev) {
ev.stop();
box.setStyle('display', 'block');
var sizes = box.getPosition();
box.set("html", [sizes.x, ' x ', sizes.y].join("<br/>"));
});
})();
提交后阅读框位置将返回光标:)
缺点:在提交之前更改invis框的css的延迟。
编辑更好的版本没有随时更改为dom:
(function() {
var lastEventObject, eventListener = function(e) {
// keep a scoped referene of the last known mouse event object
lastEventObject = e;
};
document.addEvent('mousemove', eventListener);
document.id('test_form').addEvent('submit', function(e) {
e.stop();
// not needed anymore...
document.removeEvent("mousemove", eventListener);
// show the box at last known mouse loc
document.id("box").setStyles({
display: 'block',
left: lastEventObject.page.x,
top: lastEventObject.page.y
});
// attach to mousemove or whatever....
});
})();
我很害怕这是好事。对事件对象的引用的足迹最多是最小的。