【问题标题】:touchstart on one element, drag, touchend on another elementtouchstart 在一个元素上,拖动,touchend 在另一个元素上
【发布时间】:2016-08-17 08:01:56
【问题描述】:

我有一个颜色选择器,可以同时选择两种不同的颜色;它应该像这样工作。 触摸第一种颜色 -> 拖动到第二种颜色 -> 在第二种颜色上松开手指。 问题是,现在当我从屏幕上抬起手指时,第一种颜色会触发 touchend 事件。不过,它在点击时效果很好。

$('.single-color').on('mousedown touchstart', function(e) {
  e.preventDefault();
  var index = $(this).attr('data-index');
  $('#color1').val(index);
  $('#color1').attr('data-color', $(this).css('background-color'));
  console.log('touchstart - index: ' + $(this).attr('data-index'));
});

$('.single-color').on('mouseup touchend', function(e) {
  e.preventDefault();
  var index = $(this).attr('data-index');
  $('#color2').val(index);
  $('#color2').attr('data-color', $(this).css('background-color'));
  console.log('touchend - index: ' + $(this).attr('data-index'));
});
.colors {
  list-style: none;
  margin: 0;
  padding: 0;
  overflow: hidden;
}

.single-color {
  height: 50px;
  width: calc(50% - 10px);
  margin: 0 5px 5px 5px;
  float: left;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="colors">
						
  <li class="single-color" data-color="#4DB023" data-index="0" style="background-color: #4DB023">
    &nbsp;
  </li>

  <li class="single-color" data-color="#1E6B3D" data-index="1" style="background-color: #1E6B3D">
    &nbsp;
  </li>

  <li class="single-color" data-color="#233778" data-index="2" style="background-color: #233778">
    &nbsp;
  </li>

  <li class="single-color" data-color="#3098FF" data-index="3" style="background-color: #3098FF">
    &nbsp;
  </li>

  <li class="single-color" data-color="#FF0000" data-index="4" style="background-color: #FF0000">
    &nbsp;
  </li>

  <li class="single-color" data-color="#38889C" data-index="5" style="background-color: #38889C">
    &nbsp;
  </li>

  <li class="single-color" data-color="#483063" data-index="6" style="background-color: #483063">
    &nbsp;
  </li>

</ul>

要重现问题,请查看上面的 sn-p,在 Chrome Resposive 工具中将视口设置为 iPhone6,以便模拟触摸。

【问题讨论】:

    标签: javascript touch-event


    【解决方案1】:

    我用这个答案解决了:Get the element under a touchend

    var $singleColors = $('.single-color');
    $singleColors.on('mousedown touchstart', function(e) {
      e.preventDefault();
      var index = $(this).attr('data-index');
      $singleColors.removeClass('active1');
      $(this).addClass('active1');
      $('#color1').val(index);
      $('#color1').attr('data-color', $(this).css('background-color'));
      console.log('touchstart - index: ' + $(this).attr('data-index'));
    });
    
    $singleColors.on('mouseup touchmove', function(e) {
      e.preventDefault();
      var endTarget = document.elementFromPoint(
        e.originalEvent.touches[0].pageX,
        e.originalEvent.touches[0].pageY
      );
      var index = $(endTarget).attr('data-index');
      $singleColors.removeClass('active2');
      $(endTarget).addClass('active2');
      $('#color2').val(index);
      $('#color2').attr('data-color', $(endTarget).css('background-color'));
      console.log('touchend - index: ' + $(endTarget).attr('data-index'));
    });
    * {
      box-sizing: border-box;
    }
    
    .colors {
      list-style: none;
      margin: 0;
      padding: 0;
      overflow: hidden;
    }
    
    .single-color {
      height: 50px;
      width: calc(50% - 10px);
      margin: 0 5px 5px 5px;
      float: left;
    }
    
    .single-color.active1, .single-color.active2 {
      border: 2px solid black;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="colors active2">
    						
      <li class="single-color active1" data-color="#4DB023" data-index="0" style="background-color: #4DB023">
        &nbsp;
      </li>
    
      <li class="single-color" data-color="#1E6B3D" data-index="1" style="background-color: #1E6B3D">
        &nbsp;
      </li>
    
      <li class="single-color" data-color="#233778" data-index="2" style="background-color: #233778">
        &nbsp;
      </li>
    
      <li class="single-color" data-color="#3098FF" data-index="3" style="background-color: #3098FF">
        &nbsp;
      </li>
    
      <li class="single-color" data-color="#FF0000" data-index="4" style="background-color: #FF0000">
        &nbsp;
      </li>
    
      <li class="single-color active1 active2" data-color="#38889C" data-index="5" style="background-color: #38889C">
        &nbsp;
      </li>
    
      <li class="single-color" data-color="#483063" data-index="6" style="background-color: #483063">
        &nbsp;
      </li>
    
    </ul>

    注意:此脚本不再适用于桌面。它仅适用于触控设备。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多