禁用长按智能手机

时间:2014-07-26 09:07:57

标签: javascript html long-press

我已经有一个可用的代码来禁用长按 但现在我不想通过ID获取元素。我不可能为每个特定项目添加Id。 我想让它适用于名称标签中的每个img。 但是,它现在不能正常工作。请帮忙。

原始工作线:     preventLongPressMenu(的document.getElementById(' theimage'));

编辑线:     preventLongPressMenu(document.getElementByTagName(' body img'));

整个代码:

<!DOCTYPE html>
<html>
<head>
  <script>
    function absorbEvent_(event) {
      var e = event || window.event;
      e.preventDefault && e.preventDefault();
      e.stopPropagation && e.stopPropagation();
      e.cancelBubble = true;
      e.returnValue = false;
      return false;
    }

    function preventLongPressMenu(node) {
      node.ontouchstart = absorbEvent_;
      node.ontouchmove = absorbEvent_;
      node.ontouchend = absorbEvent_;
      node.ontouchcancel = absorbEvent_;
    }

    function init() {
      preventLongPressMenu(document.getElementByTagName('body img'));
    }
  </script>
  <style>
    *:not(input):not(textarea) {
    -webkit-user-select: none; /* disable selection/Copy of UIWebView */
        -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */

    }
  </style>
</head>
<body onload="init()" id="theimage" >
  <img src="http://www.google.com/logos/arthurboyd2010-hp.jpg" width="400">
</body>
</html>

2 个答案:

答案 0 :(得分:1)

您拼错了方法名称,而没有传递正确的字符串。它是getElementsByTagName(注意元素上的s),您只需传递标记的名称而不是css选择器。您还必须修改函数以循环结果,因为它将是节点列表

preventLongPressMenu(document.getElementsByTagName('img'));

function preventLongPressMenu(nodes) {
  for(var i=0; i<nodes.length; i++){
     nodes[i].ontouchstart = absorbEvent_;
     nodes[i].ontouchmove = absorbEvent_;
     nodes[i].ontouchend = absorbEvent_;
     nodes[i].ontouchcancel = absorbEvent_;
  }
}

如果手机上的浏览器支持,您还可以使用querySelector / querySelectorAll,这样您就可以使用css选择器来选择元素了

preventLongPressMenu(document.querySelectorAll('body img'));

function preventLongPressMenu(nodes) {
  for(var i=0; i<nodes.length; i++){
     nodes[i].ontouchstart = absorbEvent_;
     nodes[i].ontouchmove = absorbEvent_;
     nodes[i].ontouchend = absorbEvent_;
     nodes[i].ontouchcancel = absorbEvent_;
  }
}

答案 1 :(得分:0)

您还可以通过JQuery分配事件处理程序,而不为每个节点使用public class MetadataTypeConverter implements DynamoDBTypeConverter<String, Metadata> { @Override public String convert(final Metadata metadata) { String metadataValue = null; try { ..... ..... your custom code } catch (JsonProcessingException e) { // TODO Auto-generated catch block e.printStackTrace(); } return metadataValue; } @Override public Metadata unconvert(final String jsonData) { Metadata metadataType = null; try { ..... ..... your custom code } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return metadataType; } }

for

所以,而不是这个:

function preventLongPressMenu(node) {
    node.on('touchstart', absorbEvent_);
    node.on('touchmove', absorbEvent_);
    node.on('touchend', absorbEvent_);
    node.on('touchcancel', absorbEvent_);
}

这样做:

function init() {
    preventLongPressMenu(document.getElementByTagName('body img'));
}


只是为了使用JQuery,你必须实现它:

来自Google CDN:

function init() {
    preventLongPressMenu($('body img'));
}

或来自Microsoft CDN:&#34;我更喜欢Google! :)&#34;

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

最好是从两个CDN中的一个下载文件并将其作为本地文件放置,这样您网站的启动加载速度就会更快!

< p> 选择权在你身上!


对我而言,它似乎比使用DOM简单得多,我喜欢JQuery! :)