仅在填充上检测单击事件

Ran*_*lue 2 javascript css

我有一个带有一些填充的HTML元素.我想检测该元素填充的点击次数.也就是说,当用户点击内容时,我不希望事件触发,只是填充.

Thi*_*ter 6

创建一个具有100%高度/宽度的内部元素,以便填充整个元素.然后在此事件上注册click事件处理程序并防止事件冒泡.

这是一个例子(使用jQuery):http://jsfiddle.net/ThiefMaster/QPxAp/


标记:

<div id="outer">
    <div id="inner"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

和JS代码:

$('#outer').click(function() {
    alert('click');
});

$('#inner').click(function(e) {
    e.stopPropagation();
});
Run Code Online (Sandbox Code Playgroud)

由于事件冒泡,内部元素上的click事件首先会触及此元素 - 停止它的传播将阻止它到达外部元素,因此只有当属于元素但未被单击内部元素.


dav*_*rad 6

我也需要这个,但也想要一个“真正的”解决方案。接受的答案实际上并不是针对“仅检测填充上的点击事件”这个问题,而是建议对标记进行侵入性更改。

“填充点击”可以通过检索元素填充设置、计算的宽度和高度并将这些值与鼠标点击偏移量进行比较来检测:

function isPaddingClick(element, e) {
  var style = window.getComputedStyle(element, null);
  var pTop = parseInt( style.getPropertyValue('padding-top') );
  var pRight = parseFloat( style.getPropertyValue('padding-right') );
  var pLeft = parseFloat( style.getPropertyValue('padding-left') );  
  var pBottom = parseFloat( style.getPropertyValue('padding-bottom') );
  var width = element.offsetWidth;
  var height = element.offsetHeight;
  var x = parseFloat( e.offsetX );
  var y = parseFloat( e.offsetY );  

  return !(( x > pLeft && x < width - pRight) &&
           ( y > pTop && y < height - pBottom))
}
Run Code Online (Sandbox Code Playgroud)

演示在这里 - > http://jsfiddle.net/er5w47yf/

jQuery :

$('#element').on('click', function(e) {
  if (isPaddingClick(this, e)) {
    console.log('click on padding')
  } else {
    console.log('click on element') 
  }
})
Run Code Online (Sandbox Code Playgroud)

本国的 :

document.getElementById('element').addEventListener('click', function(e) {
  if (isPaddingClick(this, e)) {
    console.log('click on padding')
  } else {
    console.log('click on element') 
  }
}, false)
Run Code Online (Sandbox Code Playgroud)

为方便起见,可以将其转换为 jQuery 伪事件处理程序:

(function($) {
  var isPaddingClick = function(element, e) {
    var style = window.getComputedStyle(element, null);
    var pTop = parseInt( style.getPropertyValue('padding-top') );
    var pRight = parseFloat( style.getPropertyValue('padding-right') );
    var pLeft = parseFloat( style.getPropertyValue('padding-left') );  
    var pBottom = parseFloat( style.getPropertyValue('padding-bottom') );
    var width = element.offsetWidth;
    var height = element.offsetHeight;
    var x = parseFloat( e.offsetX );
    var y = parseFloat( e.offsetY );  
    return !(( x > pLeft && x < width - pRight) &&
             ( y > pTop && y < height - pBottom))
  }
  $.fn.paddingClick = function(fn) {
    this.on('click', function(e) {
      if (isPaddingClick(this, e)) {
        fn()
      }
    })   
    return this
  }
}(jQuery));
Run Code Online (Sandbox Code Playgroud)

现在paddingClick“本地”工作:

$('#element').paddingClick(function() {
  console.log('padding click')
})
Run Code Online (Sandbox Code Playgroud)

演示 -> http://jsfiddle.net/df1ck59r/