【问题标题】:onmousedown - left or right?onmousedown - 向左还是向右?
【发布时间】:2012-02-20 01:08:23
【问题描述】:

首先,我不是在寻找 jQuery 解决方案,只是在一个元素内部寻找简单的纯 Javascript 代码。

假设我们有以下 html 代码:

<select onmousedown=" ??? ">...</select>

我想要元素内部的一个简单脚本来显示弹出消息alert(),其中包含按下哪个按钮以及元素与文档&lt;body&gt; 的相对位置的信息——类似于jQuery 中的offset()

【问题讨论】:

  • "我不是在寻找 jQuery 解决方案"... *puts jquery tag* :P
  • @Šime Vidas :: 这意味着我正在寻找 jquery 替代代码 :D

标签: javascript html jquery dom-events onmousedown


【解决方案1】:

使用某个名称创建一个 JavaScript 函数,然后在 onmousedown 事件上调用它,传递可在函数内部使用的 eventthis 对象。

HTML

<select onmousedown="onMouseDown(event, this)">...</select>

JS

function onMouseDown(e, obj){
   e = e || window.event; //window.event for IE

   alert("Keycode of key pressed: " + (e.keyCode || e.which));
   alert("Offset-X = " + obj.offsetLeft);
   alert("Offset-Y = " + obj.offsetTop);

}

如果你打算使用 jQuery,那么你可以使用这个脚本

$('select').mousedown(function(e){
    alert("Keycode of key pressed: " + e.which);

    //Inside the handler this points to the select DOM element
    alert("Offset-X = " + $(this).offset().left);
    alert("Offset-Y = " + $(this).offset().top); 
});

更新:

如果你想要内联脚本,那么试试这个。

<select onmousedown="function(e, obj){ e = e || window.event;alert('Keycode of key pressed: ' + (e.keyCode || e.which));alert('Offset-X = ' + obj.offsetLeft);alert('Offset-Y = ' + obj.offsetTop);}(event, this);">...</select>

【讨论】:

  • 在这种情况下不需要使用e || window.event,因为您从侦听器传递event
  • 在 IE 中它不起作用,所以我们必须使用 window.event 来访问它。
  • @ShankarSangoli :: 我需要不使用任何新函数名称的解决方案,因为我需要此代码用于其他合作伙伴需要添加到其现有页面的代码,以消除函数名称的风险和/或变量冲突,我需要解决方案而不为函数和/或全局变量分配一些名称。我真正的意思是脚本在元素内部,所以可以替换&lt;select onmousedown=" ??? "&gt;...&lt;/select&gt; 代码中的???
  • @ShankarSangoli——你错了。当您编写&lt; ... onclick="fn(event)"&gt; 时,在IE 中标识符event 解析为window.event,这就是传递给fn() 的内容。在 Mozilla 和其他浏览器中,它解析为处理程序的事件对象,因此它们也传递对相关事件的引用。
  • @RobG - 我说的是 IE7 和更少。也许它适用于 IE8+
【解决方案2】:

MouseEvent.button 在不同的浏览器中具有不同的值

MouseEvent.button == 1// means left key in ie6~ie8
MouseEvent.button == 0// means left key in ie9&others

【讨论】:

  • 只是为了让你开心,在 IE 中,mousedownmouseup 的“左”按钮为 1,click、dblclickcontextmenu 事件。
【解决方案3】:

&lt;select id="foo" onmousedown="mouseDown()"&gt;...&lt;/select&gt;

window.captureEvents(Event.MOUSEDOWN)
window.onmousedown = mouseDown

function mouseDown(e)
{
  xPos = e.screenX;
  yPos = e.screenY;
  alert('onmousedown foo ' + ' x:' + xPos + ' y:'+ yPos);
}

编辑

&lt;select id="foo" onmousedown="function mouseDown(e){alert(MouseEvent.button + ' x:' + e.screenX + ' y:'+ e.screenY);}"&gt;...&lt;/select&gt;

【讨论】:

  • :: 我真正的意思是脚本在元素内部,所以可以替换&lt;select onmousedown=" ??? "&gt;...&lt;/select&gt; 代码中的???。跨度>
  • 只需将脚本移动到onmousedown属性中即可
  • :: 我无法为函数分配任何新名称,也无法创建新的全局变量。您的代码也不会检查女巫按钮是否被按下,如果主要(左)或其他一些......
  • 再次,只需将脚本移动到 onmousedown 属性中即可
【解决方案4】:

编辑

在继续之前,您可能想阅读这篇文章:Javascript Madness: Mouse Events

点击一个文档会发送一个MouseEvent object,它有很多属性——例如。 MouseEvent.button 告诉您按下了哪个鼠标按钮,MouseEvent.ctrlKey 告诉您在点击发生时是否按下了控制键。

请注意,按钮并不是真正的“左”和“右”,因为它们可以通过用户偏好进行更改,您想知道它是否是主按钮(通常是左但可能是右或可能是与其他指针设备完全不同的东西)或辅助按钮(通常是正确的,但同样可以是任何东西)。

一些播放代码:

<script>
function clickDetails(e) {
  e = e || window.event;
  var msg = [];

  for (var p in e) {
    msg.push(p + ': ' + e[p]);
  }
  document.getElementById('msg').innerHTML = msg.join('<br>');
}
    
window.onload = function() {
  document.getElementById('sp0').onmousedown = clickDetails;
}

</script>

<div>
  <span id="sp0">click me</span>
  <br>
  <span id="msg"></span>
</div>

编辑

啊,什么鬼:

<select onmousedown="alert('Button: ' + event.button
                         + '\nPosition: ' + this.offsetLeft 
                         + ',' + this.offsetTop);">

【讨论】:

  • 没有可用的元素 id,代码需要在元素内部,没有新的全局变量,没有新函数的新名称。
  • 然后把代码放到handler里面,上面只是帮大家解惑。我不会为你写代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多