web-dev-qa-db-ja.com

Android=の長いタップでコンテキストメニューを無効にする

Webアプリケーションの画像を長押し(長押し)した後に表示されるコンテキストメニューを無効にしたいと思います。私はそれを行う方法が異なるアイデアを持つ投稿を見てきましたが、それらのどれも私には役に立たないようです。

HTML/CSS/Javascriptを介してAndroidでこれを行う方法はありますか?

51
Roy Sharon

これは1.6以降で動作するはずです(正しく思い出せば)。 1.5以前には回避策はないと思います。

<!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.getElementById('theimage'));
    }
  </script>
</head>
<body onload="init()">
  <img id="theimage" src="http://www.google.com/logos/arthurboyd2010-hp.jpg" width="400">
</body>
</html>
33
Roman Nurik

コンテキストメニューには独自のイベントがあります。キャッチして伝播を停止するだけです。

window.oncontextmenu = function(event) {
     event.preventDefault();
     event.stopPropagation();
     return false;
};
142
bbsimonbb

私にとっては、ユーザーが画像をズームしたりパンしたりできるようにしつつ、長押しのダウンロードを無効にしたかったため、すべてのイベントを吸収することは選択肢ではありませんでした。私はCSSとHTMLでこれを解決することができました。次のように画像の上に「シールド」divをレイヤー化するだけです。

<div class="img-container">
  <div class="shield"></div>
  <img src="path.jpg">
</div>

img {
    max-width: 100%;
}

.shield {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1;
}

これが誰かを助けることを願っています!

8

Nurikの完全な例を使用していますが、要素(ページ内の入力画像)もクリックに対して無効になっています。

これで元の行を変更します:

元の行:

node.ontouchstart = absorbEvent_;

私の変更:

node.ontouchstart = node.onclick;

この承認では、ログプレスのポップアップ画像保存メニューを無効にしますが、クリックイベントは保持します。

Dolphin HDブラウザーでAndroid 2.2を使用して7インチタブレットでテストし、正常に動作しています!

5
GAL

CSSを使用

img {
  pointer-events: none;
}
5
Artem Andreev

このCSSコードをモバイルで使用します

-webkit-touch-callout: none;
-webkit-user-select: none; /* Disable selection/copy in UIWebView */
3
vitralyoz
pointer-events: none; // for Android

-webkit-touch-callout: none; // for iOS

-webkit-user-select: none; 

-khtml-user-select: none; 

-moz-user-select: none; 

-ms-user-select: none; 

user-select: none;
0
soonsuweb

同様の問題が発生しました。上記の提案はAndoidブラウザーでは機能しませんでしたが、問題のある画像を埋め込み画像ではなくCSS背景画像として表示すると問題が解決することがわかりました。

0
Richard B

同様の問題が発生しました。私はこの問題とサファリの別のスレッドから同じ問題でいくつかの解決策を試しました( モバイルSafari(iPad/iPhone)のロングプレス/ロングクリックのデフォルトのコンテキストメニューの防止 )。悪い点は、onTouchStart、onTouchEndなどを使用できなかったことです...

OnContextMenuからのイベントのみを防止します。 React 16.5.2。テスト済みchromeのみ。

    <img {...props} onContextMenu={event => event.preventDefault()}
    onTouchStart={touchStart}
    onTouchEnd={touchEnd} />

それが誰かを助けることを願っています。乾杯!


0
Vlad Ilie
<a id="moo" href=''> </a>

<script type="text/javascript">
    var moo = document.getElementById('moo');

    function handler(event) {
        event = event || context_menu.event;

        if (event.stopPropagation)
            event.stopPropagation();

        event.cancelBubble = true;
        return false;
    }

    moo.innerHTML = 'right-click here';

    moo.onclick = handler;
    moo.onmousedown = handler;
    moo.onmouseup = handler;
</script>

OnContextMenuイベントをキャプチャし、イベントハンドラーでfalseを返します。

とにかく、一部のブラウザでは、クリックイベントをキャプチャし、event.buttonを使用してイベントを発生させたマウスボタンを確認することもできます。

0
Hare-Krishna

コピーは無効になりますが、選択は無効にしないでください。

document.oncontextmenu = function() {return false;};

WebViewで動作します。

0
deepcell