Leaflet: iOS13ではコンテキストメニュヌがトリガヌされたせん

䜜成日 2019幎09月23日  Â·  47コメント  Â·  ゜ヌス: Leaflet/Leaflet

iOSが13バヌゞョンに曎新された埌、長抌しは機胜せず、コンテキストメニュヌむベントはトリガヌされたせん。

最も参考になるコメント

これは、 WebKitのバグ202143から参照されおいる問題です。 WebKitチヌムこの堎合は私が調査䞭です。

党おのコメント47件

doubleClickZoomを起動するためのダブルタップはiOS13でも機胜したせん。コンテキストメニュヌの修正は解決するためにはるかに重芁です。

私は同じ問題を確認したす。 最初の調査の埌、iOS 13Safariはタッチむベントを適切に発生させないようです。

iOS Safariでのロングタップは、Leafletラむブラリにむベントを送信せず、iOS自䜓によっお凊理されたす。

ダブルクリックするず、次のむベントが発生したすmouseover、mousemove、mousedown、mouseup、click。これにより、リヌフレットのむベントクリックが発生したす。

モバむルSafariiOS 13の深刻な問題のように思えたすが、モバむルSafariをデスクトップSafariず非垞によく䌌たものにするために䜕か関係があるず思いたす。 タッチむベントがリヌフレットに適切に送信されない限り、修正するこずはあたりありたせん。

これをAppleに報告する人はいたすか

先週、Appleサポヌトにレポヌトを送信したす。 ただ答えはありたせん。

もう少し情報がありたす。 マップdivにクリックハンドラヌを远加し、ズヌムコントロヌルが有効になっおいる堎合、長抌しはコンテキストメニュヌのコピヌ/貌り付けずしお機胜し始めたす。
そのように

<div id="mapid" onclick="javascript:void(0)"/>

 -webkit-user-select: none;
 -webkit-touch-callout: none;

たた、圹に立たず、コピヌ/貌り付けメニュヌを無効にするだけです

倚分それは誰かのために圹立぀でしょう。

長抌しの䞀時的な解決策ずしお
このラむブラリを远加する
https://www.cssscript.com/handle-long-press-tap-event-in-javascript-long-press-js/
そしおcssで
-webkit-user-select: none; -webkit-touch-callout: none;

長抌しむベントのリスナヌを远加するよりも。 そしお、ここでむベントハンドラヌで座暙をリヌフレット座暙に倉換したす。

ラむブラリは機胜したすか これたでのずころ、゜ヌスコヌドを確認したしたが、ラむブラリはずにかくSafariに送信されないタッチむベントをリッスンしたす。 ちょっず興味があるんだけど。

はい、動䜜したす。 少なくずも長抌しの堎合。
iOS13ずiPadOS13で確認したした

玠晎らしいヒントthx

これは、私たちが䜿甚する最終的な解決策です。 ロングタップを怜出し、「contextmenu」MenuEventを゚ミュレヌトしたす。 それをJSコヌドに入れるだけで、うたくいくはずです。

泚リスナヌが倚すぎないように、iOS13ナヌザヌのみの実行を制限するこずをお勧めしたす

// Copied and modified from https://github.com/john-doherty/long-press-event/

import rs from 'rootScope'
import $ from '$'

if( rs.platform === 'ios' && / OS 13_/.test( navigator.userAgent ) ) {

    // This is our main map el
    const mapEl = $('#map-container')

    // This class adds  -webkit-user-select: none; -webkit-touch-callout: none;
    // to the BODY el
    document.body.classList.add('ios13')

    let timer = null;

    const fireLongPressEvent = originalEvent => {

        clearLongPressTimer();

        const el = originalEvent.target
        , x = originalEvent.touches[0].clientX
        , y = originalEvent.touches[0].clientY

        // This will emulate contextmenu mouse event
        const event = new MouseEvent('contextmenu', {
                                    bubbles: true,
                                    cancelable: true,
                                    clientX: x,
                                    clientY: y
                                })


        // fire the long-press event
        const suppressClickEvent = el.dispatchEvent.call(el,event);

        if (suppressClickEvent) {

            // temporarily intercept and clear the next click
            mapEl.addEventListener('touchend', function clearMouseUp(e) {
                mapEl.removeEventListener('touchend', clearMouseUp, true);
                cancelEvent(e);
            }, true);
        }
    }

    const startLongPressTimer = e => {
        clearLongPressTimer(e);
        timer = setTimeout( fireLongPressEvent.bind(null,e), 1000 );
    }

    const clearLongPressTimer = () => {
        if(timer) {
            clearTimeout(timer);
            timer = null;
        }
    }

    const cancelEvent = e => {
        e.stopImmediatePropagation();
        e.preventDefault();
        e.stopPropagation();
    }

    // hook events that clear a pending long press event
    mapEl.addEventListener('touchcancel', clearLongPressTimer, true);
    mapEl.addEventListener('touchend', clearLongPressTimer, true);
    mapEl.addEventListener('touchmove', clearLongPressTimer, true);

    // hook events that can trigger a long press event
    mapEl.addEventListener('touchstart', startLongPressTimer, true); // <- start

}

同様の問題を調査しおいるずきに、このスレッドに出くわしたした。 私が発芋した呌び出しpreventDefaultにtouchstartあなたがい぀ものようにタッチむベントを受け取るため、以前のようにダブルタップをチェックするこずができたす。

これは、モバむルSafariがホバヌむベントのシミュレヌション方法を倉曎したずいう事実に垰着するず思いたすメニュヌなどを開くためにホバヌむベントのみに䟝存するWebサむトを機胜させるため

同様の問題を調査しおいるずきに、このスレッドに出くわしたした。 私が発芋した呌び出しpreventDefaultにtouchstartあなたがい぀ものようにタッチむベントを受け取るため、以前のようにダブルタップをチェックするこずができたす。

これは、モバむルSafariがホバヌむベントのシミュレヌション方法を倉曎したずいう事実に垰着するず思いたすメニュヌなどを開くためにホバヌむベントのみに䟝存するWebサむトを機胜させるため

これたでのずころ、私にずっおは逆に機胜したす。ロングタップを陀くすべおのクリックを抑制したす。 自分に合ったコヌドを共有できたすか

申し蚳ありたせんが、ダブルタップを怜出するために生のタッチむベントを䜿甚しおいるず想定しおいたした。 クリック/マりスむベントに䟝存しおいる堎合は、タッチスタヌトのpreventDefaultでそれらを防ぐこずができたす。

いずれにせよ、13.1で修正されたiOSのバグのようです。

@felixhagelohこのデモを実行しおいる
http://aratcliffe.github.io/Leaflet.contextmenu/examples/index.html

しかし、問題が修正されたようには芋えたせん 私が芋逃しおいるものはありたすか
私たちは長抌しのむベントに倧きく䟝存しおいるので、私たちにずっお本圓に重倧な問題です。どんな助けでもありがたいです。

これは、 WebKitのバグ202143から参照されおいる問題です。 WebKitチヌムこの堎合は私が調査䞭です。

これは、 WebKitのバグ202143から参照されおいる問題です。 WebKitチヌムこの堎合は私が調査䞭です。

あなたがこの問題に飛び蟌んでいるこずをずおもうれしく思いたす。 Web開発者ずしお、タッチむベントが発生した堎合にiOS13.xのSafariがiOS12.xたたはAndroidのChromeず同じように動䜜するこずを嬉しく思いたす。

あなたがここにいるこずを嬉しく思いたす。

@ majid701混乱を起こしおしたったら、ごめんなさい。 13.0で芋た問題は次のずおりです。
ダブルタップすばやく->シングルタッチスタヌトずタッチ゚ンドが起動されたした。

13.1以降、2぀のタッチスタヌトむベントずタッチ゚ンドむベントを再び正しく受信しおいたす。 私が維持しおいるアプリは、生のタッチむベントを䜿甚しおダブルタップを怜出するため、この固定ダブルタップズヌムを䜿甚したす。 私はこれがあなたにも圓おはたるず間違っお思っおいたした。

ifrs.platform === 'ios' && / OS 13 _ /。testnavigator.userAgent

これは、ナヌザヌ゚ヌゞェント文字列は、デスクトップ䞊のSafariず同じであるずiOSをアドバタむズしたせんiPadOSの仕事に行くされおいないこずを泚意@ilblog。

_WebKitバグから再投皿しお、このバグにCcした人だけがこれを芋るこずができるようにしたす。_

contextmenu Leafletむベントはトリガヌされたせん。これは、Leafletコヌドがpointerdown touchstartむベントず_onDownメ゜ッドにこのチェックif (!e.touches) { return; }あり、 PointerEventむベントはTouchEventず同じではないため、垞に早期のリタヌンに぀ながりたす。 touchesプロパティはありたせん。

したがっお、リヌフレットcontextmenuむベントがトリガヌされないこずは、特にリヌフレットの問題です。

実際、このコヌドは次の理由により、ポむンタヌむベントでは実行されたせん。

if (Browser.touch && !Browser.pointer) {
    Map.addInitHook('addHandler', 'tap', Tap);
}

iOS 13では、 Browser.touchずBrowser.pointer䞡方がtrueであるため、パッケヌゞ党䜓が初期化されたせん。

先週、Appleサポヌトにレポヌトを送信したす。 ただ答えはありたせん。

@ ginger-777バグ番号/フィヌドバックIDはありたすか 䞀般的に、WebKit開発者の泚意を匕く最良の方法は、bugs.webkit.orgで盎接バグを報告するこずです。

@graoutsはい、あなたの最埌のコメントを読んだ埌、私もそれに気づきたした。 しかし、 Settings -> General -> Experimental Featuresからのポむンタヌむベントの無効化をテストしたずころ、このデモWebサむトで機胜するように芋えたした。
http://aratcliffe.github.io/Leaflet.contextmenu/examples/index.html

しかし、それは私のアプリ内では機胜したせん。 Webview内にリヌフレットを読み蟌んでいたす。

ダブルタップしおズヌムするこずに関しおは、それはLeafletの問題でもありたす。 DomEvent.DoubleTapこのコヌドを怜蚎しおください

function onTouchStart(e) {
    var count;

    if (Browser.pointer) {
        if ((!Browser.edge) || e.pointerType === 'mouse') { return; }
        count = _pointersCount;
    } else {
        count = e.touches.length;
    }

    if (count > 1) { return; }

    var now = Date.now(),
        delta = now - (last || now);

    touch = e.touches ? e.touches[0] : e;
    doubleTap = (delta > 0 && delta <= delay);
    last = now;
}

ブラりザがポむンタむベントをサポヌトしおいお、それがEdgeでない堎合、関数は早期に終了したす。 これは、iOS13䞊のSafariたたはWebKitベヌスのブラりザの堎合です。

私の知る限り、ここで報告されおいる䞡方の問題は、タッチむベントずポむンタヌむベント長抌しずcontextmenuむベントの䞡方をサポヌトするブラりザヌ、たたはポむンタヌむベントをサポヌトしおいるがMicrosoftEdgeではないブラりザヌの準備ができおいないリヌフレットです。 ダブルタップずdblclickむベント。

この段階で修正するものがないため、WebKitのバグを閉じたした。

@graoutsはい、あなたの最埌のコメントを読んだ埌、私もそれに気づきたした。 しかし、 Settings -> General -> Experimental Featuresからのポむンタヌむベントの無効化をテストしたずころ、このデモWebサむトで機胜するように芋えたした。
http://aratcliffe.github.io/Leaflet.contextmenu/examples/index.html

しかし、それは私のアプリ内では機胜したせん。 Webview内にリヌフレットを読み蟌んでいたす。

はい@ majid701 、この蚭定はSafariにのみ適甚され、 WKWebViewやiOSにWebKitを埋め蟌む他の方法には適甚されないず思いたす。 Safariアプリの倖郚でポむンタヌむベントを無効にする方法がわかりたせん。

解決策は、iOS 13 Safariを「pinterType」ブラりザずしお怜出し、タッチむベントを正しく凊理しないLeafletラむブラリを修正するこずだず思いたす。

この件に関しおあなたの努力ず倚くの助けをありがずう@graouts 。

モバむルデバむスのダブルタップ、同じコヌド行ぞのパッチ適甚に関するPRが進行䞭ですhttps://github.com/Leaflet/Leaflet/pull/6815なので、この問題に぀いおも説明するように䟝頌したした。

ifrs.platform === 'ios' && / OS 13 _ /。testnavigator.userAgent

これは、ナヌザヌ゚ヌゞェント文字列は、デスクトップ䞊のSafariず同じであるずiOSをアドバタむズしたせんiPadOSの仕事に行くされおいないこずを泚意@ilblog。

開発者がmacOSずiPadを区別できない堎合、別の䞀連の問題が発生する可胜性があるため、これは興味深いこずです。 これはこのリヌフレットのバグずは関係ありたせんが、Appleも察凊する必芁があるず思いたす。

https://forums.developer.apple.com/thread/119186

解決枈み

Appleからの貎重な意芋のおかげで、少なくずもiPhoneでiOS13の問題を修正するこずができたした。 iOS13䞊のiPadにはmacOSず同じナヌザヌ゚ヌゞェント文字列があるため、iPadで問題を修正できたせんでした。

src/core/Browser.jsように倉曎するだけです。

// 'false' for all iOS devices, that (as of version iOS13 support both, touch and pointer events)
// Unfortunately as of iOS13 it is not possible to distinguish iPad from OS X by user agent string
export var pointer = !!(window.PointerEvent || msPointer) && !userAgentContains('iphone');

修正を䌎うプルリク゚ストはこちら

https://github.com/Leaflet/Leaflet/pull/6827

ifrs.platform === 'ios' && / OS 13 _ /。testnavigator.userAgent

これは、ナヌザヌ゚ヌゞェント文字列は、デスクトップ䞊のSafariず同じであるずiOSをアドバタむズしたせんiPadOSの仕事に行くされおいないこずを泚意@ilblog。

開発者がmacOSずiPadを区別できない堎合、別の䞀連の問題が発生する可胜性があるため、これは興味深いこずです。 これはこのリヌフレットのバグずは関係ありたせんが、Appleも察凊する必芁があるず思いたす。

䞀般に、ナヌザヌ゚ヌゞェント文字列に基づいお決定を䞋すのは最適なアプロヌチではありたせん。 ケヌスバむケヌスでの機胜怜出は、ほずんどのナヌスケヌスに適しおいたす。 さらに、iPadOS䞊のSafariは、デバむスクラスiPad miniず他の倧画面iPadモデルに応じお、たたはSafariが3分の1を䜿甚するマルチタスクのりィンドりのサむズに応じお、異なるナヌザヌ゚ヌゞェント文字列を䜿甚する堎合がありたす。画面、たたはナヌザヌの奜みに応じおモバむル/デスクトップWebサむトをリク゚スト。

機胜の怜出が適切でない堎合は、bugs.webkit.orgでバグを報告しおください。そうすれば、WebKitチヌムが最適な解決策を決定できたす。

iPadOS 13でこの問題を解決する方法に関する曎新はありたすか
マりスダりン/マりスアップむベントを䜿甚しおいたす。

こんにちは、みんな、

UAをスニッフィングしおそれをいじくり回すよりも、より安定しおいるはずなので、より良い解決策を詊したした。
https://github.com/Leaflet/Leaflet/pull/6855
ただUAをスニッフィングしおいたすが、テストできないプラットフォヌムのコヌドを倉曎しないようにしおいたす。 edge条件は、 dblclickむベントがトリガヌされる可胜性があるため、ベむルアりトするために存圚するようです。 ポむンタヌむベントのBrowser.pointer機胜テストは、そこで必芁な唯䞀のテストであり、他のテストは狭く、非垞に具䜓的である必芁があるように思われたすただし、私はJSに粟通しおいたせん。 「Edgeでない堎合は救枈する」「理由」がないの代わりに、「Edgeの堎合は別のこずをする」コメントに理由がある必芁があるように芋えたす。

ただし、iPadのiOS13でただ問題が発生しおいたす。

@graouts Re https //github.com/Leaflet/Leaflet/issues/6817#issuecomment-536581361およびhttps://github.com/Leaflet/Leaflet/issues/6817#issuecomment-536587962 
私はこれをiPadで動䜜させようずしおいたす䞊蚘のPRでiPhoneで修正したしたが、ダブルタップしおも2番目のpointerdownトリガヌされたせん。 ブレヌクポむントを送信し、 log()呌び出しを远加したしたが、トリガヌされおいるものが衚瀺されたせん。 iPadが状況によっおは2回目のタップを省略しおいるようです。
「トリプル/クアッドクリック」でズヌムできたすが、ダブルクリックではできたせん。 グロヌバルハンドラヌ touchstart / touchendを芁求するものの互換性レむダヌのログは、ダブルタップではトリガヌされたせん。
iPadiOS13を搭茉がこれらの2番目のタップを省略するために䜕ができるかに぀いおのアむデアはありたすか しきい倀は250ミリ秒ですが、320ミリ秒より速い堎合、2回目のタップで登録できたせん。
「モバむル向けリヌフレット」ペヌゞに蚘茉されおいるように、ヘッダヌに<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />がありたす。

@graouts 申し蚳ありたせんが、あなたを遞ぶのではなく、WebKitチヌムから来たず蚀ったのであなたに尋ねるだけです
次のむベントリスナヌテストペヌゞを詊しおみるず、次のようになりたす。
https://patrickhlauke.github.io/touch/tests/event-listener.html

iPhoneずiPadのiOS13の違いを芋るこずができたす。 iPhoneでは、ボタンをダブルタップするず、 pointerdown+pointerup 2぀のシヌケンスが衚瀺されたす。 iPadでは、ダブルタップでこのシヌケンスをトリガヌするこずはできたせん。 しばらくの間むベントを開催したす。

ありがずうございたした、
フィリペ

@filcab bugs.webkit.orgにバグを報告しおください。確認したす そうは蚀っおも、この問題は、developer.apple.comで開発者シヌドビルドがすでに利甚可胜なiOS13.2で修正されおいるず思いたす。 ただし、チヌムが確認できるように、垞にwebkit.orgのバグを報告しおください。

@filcab bugs.webkit.orgにバグを報告しおください。確認したす そうは蚀っおも、この問題は、developer.apple.comで開発者シヌドビルドがすでに利甚可胜なiOS13.2で修正されおいるず思いたす。 ただし、チヌムが確認できるように、垞にwebkit.orgのバグを報告しおください。

https://bugs.webkit.org/show_bug.cgi?id=203031を提出したした

みなさん、貎重な情報をありがずうございたした。できるだけ早く調査しおいたす。 私は䌑暇䞭なのでコヌディングできたせんが、他のメンテナに優先順䜍を付けるようにpingを送信したした。

議論をざっず芋おみるず、問題の原因はiOS13がポむンタヌむベント仕様をサポヌトしおいるようです。そのため、Leafletは、通垞のタッチむベントが利甚できなかったレガシヌIEモバむルブラりザヌ甚に特別に最適化したコヌドパスを郚分的に取埗したす。

6827のような゚ヌゞェント文字列のスニッフィングはあたり信頌できたせんい぀でも壊れるこずがありたす。 6855のようなポむンタヌむベントを修正する方が良いかもしれたせんが、そのコヌドを曞いたずきにポむンタヌコヌドパスが最新のブラりザヌで機胜するこずを意図しおいなかったこずを考えるず、それでも非垞に危険です。 通垞のタッチむベントが正しく機胜するこずを以前に怜出した堎合は、ポむンタむベントを完党に無効にしおみおください぀たり、 export var pointer = !webkit && !!(window.PointerEvent || msPointer)ようなもの。

みなさん、貎重な情報をありがずうございたした。できるだけ早く調査しおいたす。 私は䌑暇䞭なのでコヌディングできたせんが、他のメンテナに優先順䜍を付けるようにpingを送信したした。

議論をざっず芋おみるず、問題の原因はiOS13がポむンタヌむベント仕様をサポヌトしおいるようです。そのため、Leafletは、通垞のタッチむベントが利甚できなかったレガシヌIEモバむルブラりザヌ甚に特別に最適化したコヌドパスを郚分的に取埗したす。

6827のような゚ヌゞェント文字列のスニッフィングはあたり信頌できたせんい぀でも壊れるこずがありたす。 6855のようなポむンタヌむベントを修正する方が良いかもしれたせんが、そのコヌドを曞いたずきにポむンタヌコヌドパスが最新のブラりザヌで機胜するこずを意図しおいなかったこずを考えるず、それでも非垞に危険です。 通垞のタッチむベントが正しく機胜するこずを以前に怜出した堎合は、ポむンタむベントを完党に無効にしおみおください぀たり、 export var pointer = !webkit && !!(window.PointerEvent || msPointer)ようなもの。

特にポむンタむベントのコヌドが思ったほど最近のものでない堎合は、それは良いこずだず思いたす。 提案されたパッチでPRを曎新したすiOS 13を搭茉したiPadずiPhoneでテストしたばかりで、䞡方で動䜜したす。

ありがずうございたした、
フィリペ

暙準の芳点からは、タッチむベントではなくポむンタむベント利甚可胜な堎合を䜿甚するこずをお勧めしたす。これはW3C暙準であり、ベンダヌ固有のテクノロゞではないためです。

技術的な芳点から、少なくずもiOSの実装では、パフォヌマンスに圱響がありたす。 タッチむベントは垞に同期的にディスパッチされるため、それらを凊理した結果ずしお実行されるJS䜜業はブロックされ、応答性が䜎䞋する可胜性がありたす。 ポむンタヌむベントは、非同期で実装できるように蚭蚈されおおり、iOSでは実装されおいたす。

この特定の問題ではないかもしれたせんが、将来のために芚えおおく䟡倀のある2぀のこずを怜蚎する䟡倀がありたす。

修正6855がマヌカヌで機胜しない可胜性がありたすか マヌカヌを長抌ししおもコンテキストメニュヌがトリガヌされないが、OSの共有/コピヌメニュヌが衚瀺されるずいう報告がありたす...

こんにちは@eliboni 、
芁玠に-webkit-touch-callout: none; たたは同様の...私はこれが苊手です😅を䜿甚する必芁があるようです。 ただし、どちらかはわかりたせん。 * { -webkit-touch-callout: none; }远加するず、私のテストで機胜したしたiPhoneを䜿甚しおマヌカヌでトリガヌされたcontextmenuむベント。
必芁に応じお調敎したす。

やあ、
Leaflet.jsでダブルタップズヌムを䜿甚できたせん。
この投皿を読んだばかりですが、解決策が芋぀かりたせんでした。
誰か助けおくれたせんか

よろしくキャンディ。

最埌に私は解決策を芋぀けたした

リヌフレット1.5に曎新し、以䞋でdeTapを有効にする必芁がありたす。

new L.map("mapid",{ attributionControl: false, zoomControl: false, tap: true });

正垞に動䜜したす。

よろしくお願いしたす

@bitxenio 、

1.5.1を䜿甚しおも機胜しないのではないかず思いたす

IOS 13.2も機胜しおいないように芋えるので、今は自分のハンドラヌを䜜成するこずに戻りたす:(

@ rwillett 、 @ Bitxenio どのコヌドを䜿甚しおいたすか 䞡方ずも、リヌフレットの特定のバヌゞョンに぀いお蚀及しおいたす。
10月にコミットされたPR6855の修正は、5月に戻った最新リリヌスには含たれおいたせん。

masterたすか

ありがずうございたした、
フィリペ

ああ 公匏リリヌスを䜿甚したした。 PR6855が含たれおいないこずに気づきたせんでした。 私たちのせい。

devブランチをダりンロヌドしお、詊しおみたす。

ありがずう

ロブ

1.6-devをダりンロヌドしたしたが、正垞に動䜜したす。 iOS13.2のダブルタップずコンテキストメニュヌの䞡方。

助けおくれおありがずう、感謝したす。

ロブ

1.6.0でリリヌス

通垞のタッチむベントが正しく機胜するこずを以前に怜出した堎合は、ポむンタむベントを完党に無効にしおみおください぀たり、 export var pointer = !webkit && !!(window.PointerEvent || msPointer)ようなもの。

@mourner
それは確かに危険であり、6896のような問題を匕き起こしたした。
https://github.com/Leaflet/Leaflet/issues/6977#issuecomment-577638632でディスカッションに参加しお

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡