স্পর্শ ডিভাইসে ব্রাউজারে ডাবল-ট্যাপ "জুম" বিকল্পটি অক্ষম করুন


112

আমি সমস্ত জুম কার্যকারিতা অক্ষম না করে ব্রাউজারে (স্পর্শ ডিভাইসে) নির্দিষ্ট উপাদানগুলিতে ডাবল-ট্যাপ জুম কার্যকারিতা অক্ষম করতে চাই ।

উদাহরণস্বরূপ: কিছু ঘটে যাওয়ার জন্য একটি উপাদান একাধিকবার আলতো চাপতে পারে। এটি ডেস্কটপ ব্রাউজারগুলিতে (আশানুরূপ হিসাবে) দুর্দান্ত কাজ করে তবে স্পর্শ ডিভাইস ব্রাউজারগুলিতে এটি জুম বাড়বে।


যদিও জুমের জন্য নয়, তবে এখানে আরও কিছু প্রয়োজনীয় জিনিস রয়েছে - we-ওয়েবকিট-টাচ-কলআউট: কিছুই নয়; -উইবকিট-টেক্সট-আকার-সমন্বয়: কিছুই নয়; -উইবকিট-ব্যবহারকারী-নির্বাচন: কিছুই নয়;
উদয়রাজ দেশমুখ

উত্তর:


98

দ্রষ্টব্য (2020-08-04 হিসাবে): এই সমাধানটি আইওএস সাফারি ভি 12 + তে কাজ করে না বলে মনে হচ্ছে। আমি এই উত্তরটি আপডেট করব এবং আমি আইওএস সাফারিকে কভার করে এমন একটি পরিষ্কার সমাধান পেয়ে গেলে এই নোটটি মুছে ফেলব।

সিএসএস-কেবলমাত্র সমাধান

যোগ touch-action: manipulationকোনো উপাদান যা আপনি অক্ষম ডবল জুম টোকা করতে চান, নিম্নলিখিত সঙ্গে মতো disable-dbl-tap-zoomশ্রেণী:

.disable-dbl-tap-zoom {
  touch-action: manipulation;
}

touch-actionদস্তাবেজগুলি থেকে (জোর দেওয়া আমার):

দক্ষতা সহকারে হস্তচালন

জুম অঙ্গভঙ্গি প্যানিং এবং চিম্টি সক্ষম করুন, তবে অতিরিক্ত অ-মানক অঙ্গভঙ্গি যেমন জুম করতে ডাবল-আলতো চাপুন অক্ষম করুন

এই মানটি Android এবং iOS এ কাজ করে।


@ সার্গোপাসোভি, আপনি কি এমন উদাহরণ তৈরি করতে পারেন যা কাজ করে না? আমি এই আইওএস 12 এর জন্য এই সমাধানটি ব্যবহার করছি এবং এটি আমার জন্য কাজ করছে।
রস অ্যালেন

আমি @ সার্গোপাওয়েভির মতো একই সমস্যাটি দেখছি, আইওএস 12 এ কাজ করছেন না
ট্রেভর জেক্স

আইওএস 12 এ আমার জন্য কাজ করেছেন!
KB2497

2
টাচ-অ্যাকশন দিয়ে আপনার পুরো শরীরটি মোড়ানোর পক্ষে কী কী?
ওজেন

1
কোনও চিত্র ডাবল ট্যাপ করার সময় সর্বশেষতম আইওএসে কাজ করে না।
অ্যাডাম সিলভার

54
<head>
<title>Site</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> 
etc...
</head>

আমি এটি খুব সম্প্রতি ব্যবহার করেছি এবং এটি আইপ্যাডে দুর্দান্ত কাজ করে। অ্যান্ড্রয়েড বা অন্যান্য ডিভাইসে পরীক্ষিত হয়নি (কারণ ওয়েবসাইটটি কেবল আইপ্যাডে প্রদর্শিত হবে)।


16
এটি সমস্ত জুম কার্যকারিতা অক্ষম করবে, দুর্ভাগ্যক্রমে এটি আমার প্রশ্ন ছিল না। আমি কেবল নির্দিষ্ট উপাদানগুলিকে অক্ষম করতে চাই।
ওয়াউটার কনেকনি

ওই বাজে কথা। আমি এটি অন্য উপায়ে পড়ি, ব্যর্থতা আমার উপর পড়ে। দুঃখিত!
কাবলাম

5
কীভাবে এই সমাধান? এটি কেবল আইওএস, তবে সম্ভবত টুইটযোগ্য? : gist.github.com/2047491
কাবলাম

2
@ ওয়াটারকোননি আপনি যদি ইউজারেজেন্ট চেকটি সরিয়ে থাকেন তবে এটি এমন কোনও ডিভাইসে কাজ করবে যা টাচস্টার্ট ইভেন্টকে সমর্থন করে। এই ডিভাইসগুলি সনাক্ত করতে আপনি এমন কিছু ব্যবহার করতে পারেন যেমন -EventSupported
nxt

4
অ্যাপল এখন আনুষ্ঠানিকভাবে এটিকে উপেক্ষা করে। github.com/w3c/html/issues/602
27/08

38

আমি জানি এটি পুরানো হতে পারে তবে আমি এমন একটি সমাধান পেয়েছি যা আমার জন্য পুরোপুরি কার্যকর হয়েছিল। ক্রেজি মেটা ট্যাগ এবং সামগ্রীর জুম থামানো দরকার নেই।

ক্রস-ডিভাইসটি কেমন তা আমি 100% নিশ্চিত নই, তবে এটি ঠিক কীভাবে চেয়েছিল তা আমি কাজ করেছিলাম।

$('.no-zoom').bind('touchend', function(e) {
  e.preventDefault();
  // Add your code here. 
  $(this).click();
  // This line still calls the standard click event, in case the user needs to interact with the element that is being clicked on, but still avoids zooming in cases of double clicking.
})

এটি কেবলমাত্র সাধারণ টেপিং ফাংশনটি অক্ষম করবে এবং তারপরে আবার একটি স্ট্যান্ডার্ড ক্লিক ইভেন্টকে কল করবে। এটি মোবাইল ডিভাইসটি জুম করা থেকে বাধা দেয় তবে অন্যথায় স্বাভাবিক হিসাবে কাজ করে।

সম্পাদনা: এটি এখন সময়ের পরীক্ষিত হয়েছে এবং কয়েকটি লাইভ অ্যাপ্লিকেশনগুলিতে চলছে। 100% ক্রস ব্রাউজার এবং প্ল্যাটফর্ম বলে মনে হচ্ছে। উপরের কোডটি বেশিরভাগ ক্ষেত্রে কপি-পেস্ট সমাধান হিসাবে কাজ করা উচিত, যদি না আপনি ক্লিক ইভেন্টের আগে কাস্টম আচরণ না চান want


সহজ কিন্তু দুর্দান্ত উত্তর। মেটা ট্যাগ বা অন্যান্য পরিবর্তন করার দরকার নেই
বেঞ্চপ্রেসার

2
এটি ক্লিকগুলি অক্ষম করে, আমি মনে করি না এটি একটি ভাল সমাধানের জন্য দুঃখিত
পিক্সেলো

6
আপনার pointer-events: none
জেএসের

1
পুরো পৃষ্ঠায় জুম অক্ষম না করে ইনক্রিমেন্ট / হ্রাস বোতামগুলি পরিচালনা করার জন্য এটি পুরোপুরি কাজ করেছে ধন্যবাদ।
রামান

1
যদি আমি এটি সঠিকভাবে দেখি তবে এটি এমন কিছু পরিস্থিতিতে ব্যর্থ হতে পারে যেখানে আপনার নির্ভরযোগ্য ইভেন্টগুলির প্রয়োজন হয় (উদাহরণস্বরূপ স্টিএইচ ক্লিকিন যা পুরো স্ক্রিন বা অন্যান্য পরীক্ষাগুলি ট্রিগার করছে, ইয়েনেড বিশ্বস্ত ইভেন্ট হিসাবে যার অর্থ ব্যবহারকারী / ওএসের সাহায্যে ট্রিগার)
ম্যানুয়েল গ্রাফ

29

আমি ঠিক আমার প্রশ্নের উত্তরটি সঠিকভাবে দিতে চেয়েছিলাম কারণ কিছু লোক উত্তরের নীচে দেওয়া মন্তব্যগুলি না পড়ে। সুতরাং এটি এখানে:

(function($) {
  $.fn.nodoubletapzoom = function() {
      $(this).bind('touchstart', function preventZoom(e) {
        var t2 = e.timeStamp
          , t1 = $(this).data('lastTouch') || t2
          , dt = t2 - t1
          , fingers = e.originalEvent.touches.length;
        $(this).data('lastTouch', t2);
        if (!dt || dt > 500 || fingers > 1) return; // not double-tap

        e.preventDefault(); // double tap - prevent the zoom
        // also synthesize click events we just swallowed up
        $(this).trigger('click').trigger('click');
      });
  };
})(jQuery);

আমি এটি লিখিনি, আমি কেবল এটি সংশোধন করেছি। আমি এখানে iOS-কেবল সংস্করণটি পেয়েছি: https://gist.github.com/2047491 (ধন্যবাদ কাবলাম)


1
এটি কাজ করে বলে মনে হচ্ছে না, অন্তত এসআইআইআই (ডাব্লু / অ্যান্ড্রয়েড 4.0.০.৪) এ নয়। আমি নথী, বডি, উইন্ডো, *, কোনও ডাইস বাঁধতে চেষ্টা করেছি।
সর্বোচ্চ

আমাকেও চেষ্টা করে, সাফারি / আইপ্যাড, অ্যান্ড্রয়েড ক্রোমে কাজ করে তবে অ্যান্ড্রয়েড ডিফল্ট ব্রাউজারের সাথে নয়
স্ট্রে

2
jquery জাভাস্ক্রিপ্ট নয় এটি একটি লাইব্রেরি ছাড়া এটি কীভাবে করা যায় তার একটি উদাহরণ পেয়ে ভাল লাগবে
মার্টিজন শেফার

একটি নন-জেকারি সংস্করণটির জন্য খুঁজছেন :-(
টিমো

আবার, jQuery জাভাস্ক্রিপ্ট নয়, এবং উত্সাহিত করা উচিত নয়, কারণ এটি কৌণিকের মতো আরও আধুনিক ধারণার উপর ভিত্তি করে সাইটগুলির সাথে ভাল কাজ করে না। প্রশ্নটি পড়ুন
মার্টিজন শেফার

15

সিএসএস বিশ্বজুড়ে ডাবল-ট্যাপ জুম অক্ষম করতে (যে কোনও উপাদানটিতে):

  * {
      touch-action: manipulation;
  }

দক্ষতা সহকারে হস্তচালন

জুম অঙ্গভঙ্গি প্যানিং এবং চিম্টি সক্ষম করুন, তবে অতিরিক্ত অ-মানক অঙ্গভঙ্গি যেমন জুম করতে ডাবল-আলতো চাপুন অক্ষম করুন।

ধন্যবাদ রস, আমার উত্তরটি তার প্রসারিত: https://stackoverflow.com/a/53236027/9986657


1
এটি উত্তর চিহ্নিত করা উচিত। আমি এটিকে কেবল এইচটিএমএল এবং শরীরে রাখার চেষ্টা করেছি কিন্তু এটি আইওএস 13.2 এ কাজ করে নি। এইটা কাজ করে.
আর ওএমএস

এটি নিজে থেকে আইওএস 13 এ কাজ করে না, তবে এই কোডের সাথে মিশ্রণে এটি পুরোপুরি রিঅ্যাক্ট অ্যাপের জন্য জুম করতে টোকা দেয়। document.getElementById('root').addEventListener('click', () => {})
সের্গেই

অ্যাপল আইওএস 13 টি জুম করতে আলতো চাপুন, আপনি কীভাবে বলতে পারেন যে এটি iOS13 এ কাজ করে না?
ওজেন

15

আপনি যদি একটি সংস্করণ যা প্রয়োজন jQuery এর ছাড়া কাজ করে , আমি পরিবর্তিত Wouter Konecny এর উত্তর (এটিও পরিবর্তন দ্বারা তৈরি করা হয়েছে এই সারকথা দ্বারা জোহান Sundström ভ্যানিলা জাভাস্ক্রিপ্ট ব্যবহার করতে)।

function preventZoom(e) {
  var t2 = e.timeStamp;
  var t1 = e.currentTarget.dataset.lastTouch || t2;
  var dt = t2 - t1;
  var fingers = e.touches.length;
  e.currentTarget.dataset.lastTouch = t2;

  if (!dt || dt > 500 || fingers > 1) return; // not double-tap

  e.preventDefault();
  e.target.click();
}

তারপরে একটি ইভেন্ট হ্যান্ডলার যুক্ত করুন touchstartযা এই ফাংশনটিকে কল করে:

myButton.addEventListener('touchstart', preventZoom); 

3
উজ্জ্বল। কেবল এটি উল্লেখ করতে চেয়েছিলাম যে এটিকে কল করার জন্য আমার একটি অ্যাডভেন্টলিস্টনার যুক্ত করা দরকার। myButton.addEventListener('touchstart', preventZoom);
মার্টিন জাকুবিক

11

আপনি CSS বৈশিষ্ট্য নির্ধারণের উচিত touch-actionকাছে noneএই অন্য উত্তর বর্ণনা অনুযায়ী https://stackoverflow.com/a/42288386/1128216

.disable-doubletap-to-zoom {
    touch-action: none;
}

1
এটি কাজ করে ... তবে আমি যদি জুমিং অক্ষম করতে চাই, তবে অন্যান্য স্পর্শ ইভেন্টগুলি ছেড়ে যাই? আমার কাছে একটি বড় টেবিল রয়েছে এবং এটি স্ক্রোলিং অক্ষম করে।
ফ্রেনকিবি

2
আপনি যদি কেবল ডাবল-ট্যাপ জুম থেকে মুক্তি পেতে চান তবে আপনার মানটি 'টাচ-অ্যাকশন: ম্যানিপুলেট' এ সেট করা উচিত; এটি এখনও প্যানিং এবং চিমটি-জুমিংয়ের অনুমতি দেবে। গুরুত্বপূর্ণ দ্রষ্টব্য: এটি ডাবল-ট্যাপ জুম বাস্তবায়নের জন্য প্রবর্তিত ক্লিক বিলম্ব ব্রাউজারগুলি থেকে মুক্তি পেতে সহায়তা করে। দেখতে developer.mozilla.org/en-US/docs/Web/CSS/touch-action
cschuff

কোন এইচটিএমএল ট্যাগে এই শ্রেণিটি যুক্ত করা উচিত?
রাজওয়ান জামফির

আমি মনে করি আপনি এটিকে যে কোনও উপাদানটিতে যুক্ত করতে পারেন যা আপনি ব্যবহারটি জুম করতে চান না। উদাহরণস্বরূপ, আমার ক্ষেত্রে আমি চাইনি যে ব্যবহারকারী আমার পৃষ্ঠার কোনও অংশ জুম করুন, তাই আমি এটি বডি ট্যাগে যুক্ত করেছি।
জোনাথন মোরালেস ভেলিজ

2
* {
    -ms-touch-action: manipulation;
    touch-action: manipulation;
}

টাচ স্ক্রিনগুলিতে জুম করতে ডাবল আলতো চাপুন। ইন্টারনেট এক্সপ্লোরার অন্তর্ভুক্ত।


1

সরল ডিফল্ট ব্যবহারকে প্রতিরোধ click, dblclickবাtouchend ঘটনা জুম কার্যকারিতা নিষ্ক্রিয় করা হবে।

আপনার যদি ইতিমধ্যে এই ইভেন্টগুলির একটিতে কলব্যাক থাকে তবে কেবল একটি কল করুন event.preventDefault()


1
এটি আমার পক্ষে কাজ করেছে। আমি একটি বোতামে আমার নিজস্ব টাচস্টার্ট ইভেন্টটি সংজ্ঞায়িত করছিলাম এবং আমি জুম ফাংশনটি অক্ষম করতে চেয়েছিলাম।
রিক গিউলি


0

এটি 'দেহের' উপাদানগুলিতে ডাবল ট্যাপ জুম প্রতিরোধ করবে এটি অন্য কোনও নির্বাচককে পরিবর্তন করা যেতে পারে

$('body').bind('touchstart', function preventZoom(e){
            var t2 = e.timeStamp;
            var t1 = $(this).data('lastTouch') || t2;
            var dt = t2 - t1;
            var fingers = e.originalEvent.touches.length;
            $(this).data('lastTouch', t2);
            if (!dt || dt > 500 || fingers > 1){
                return; // not double-tap
            }
            e.preventDefault(); // double tap - prevent the zoom
            // also synthesize click events we just swallowed up
            $(e.target).trigger('click');

});

তবে এটি আমার ক্লিক ইভেন্টটিকে একাধিকবার ক্লিক করার পরে ট্রিগার হতে বাধা দিয়েছে যাতে একাধিক ক্লিকগুলিতে ইভেন্টগুলি ট্রিগার করতে আমাকে অন্য ইভেন্টকে আবদ্ধ করতে হয়

$('.selector').bind('touchstart click', preventZoom(e) {    
    e.stopPropagation(); //stops propagation
    if(e.type == "touchstart") {
      // Handle touchstart event.
    } else if(e.type == "click") {
      // Handle click event.
    }
});

টাচস্টার্টে আমি কোডটি যুক্ত করে জুমটি রোধ করতে এবং একটি ক্লিক ট্রিগার করে।

$('.selector').bind('touchstart, click', function preventZoom(e){
            e.stopPropagation(); //stops propagation
            if(e.type == "touchstart") {
                // Handle touchstart event.
                var t2 = e.timeStamp;
                var t1 = $(this).data('lastTouch') || t2;
                var dt = t2 - t1;
                var fingers = e.originalEvent.touches.length;
                $(this).data('lastTouch', t2);


                if (!dt || dt > 500 || fingers > 1){
                    return; // not double-tap
                }

                e.preventDefault(); // double tap - prevent the zoom
                // also synthesize click events we just swallowed up
                $(e.target).trigger('click');

            } else if(e.type == "click") {
                // Handle click event.
               "Put your events for click and touchstart here"
            }

 });

-1

আমি ধরে নিলাম যে এতে আমার <div>পাঠ্য, স্লাইডার এবং বোতামগুলির সাথে একটি ইনপুট ধারক ক্ষেত্র রয়েছে এবং এতে দুর্ঘটনাজনিত ডাবল-ট্যাপগুলি বাধা দিতে চাই <div>। নিম্নলিখিতগুলি ইনপুট অঞ্চলে জুম করতে বাধা দেয় না এবং এটি আমার <div>অঞ্চলের বাইরে ডাবল-ট্যাপ করে এবং জুম করার সাথে সম্পর্কিত নয় । ব্রাউজার অ্যাপের উপর নির্ভর করে বিভিন্নতা রয়েছে।

আমি এটি চেষ্টা করেছিলাম।

(1) আইওএসে সাফারি এবং অ্যান্ড্রয়েডে ক্রোমের জন্য এবং এটি পছন্দের পদ্ধতি। স্যামসুংয়ের ইন্টারনেট অ্যাপ ব্যতীত কাজ করে, যেখানে এটি ডাবল-ট্যাপগুলি সম্পূর্ণরূপে অক্ষম করে না <div>, তবে কমপক্ষে এমন উপাদানগুলিতে ট্যাপগুলি পরিচালনা করে। এটি ইনপুট এবং ইনপুট return falseব্যতীত ফিরে আসে ।textrange

$('selector of <div> input area').on('touchend',disabledoubletap);

function disabledoubletap(ev) {

    var preventok=$(ev.target).is('input[type=text],input[type=range]');

    if(preventok==false) return false; 
}

(২) অ্যান্ড্রয়েডে অন্তর্নির্মিত ইন্টারনেট অ্যাপ্লিকেশনের জন্য (5.1, স্যামসুং), ডাবল-ট্যাপগুলি <div>বাধা দেয় তবে জুম করতে বাধা দেয় <div>:

$('selector of <div> input area').on('touchstart touchend',disabledoubletap);

(3) অ্যান্ড্রয়েড 5.1-এ ক্রোমের জন্য, ডাবল-ট্যাপকে একেবারেই অক্ষম করে, জুমিং বাধা দেয় না এবং অন্যান্য ব্রাউজারগুলিতে ডাবল-ট্যাপ সম্পর্কে কিছুই করে না। এর ডাবল-ট্যাপ-ইনহিবিটিং <meta name="viewport" ...>বিরক্তিকর, কারণ <meta name="viewport" ...>ভাল অনুশীলন বলে মনে হচ্ছে।

<meta name="viewport" content="width=device-width, initial-scale=1, 
          maximum-scale=5, user-scalable=yes">

-2

সিএসএস টাচ-ইভেন্টগুলি ব্যবহার করে: সম্পূর্ণরূপে সমস্ত স্পর্শ ইভেন্টগুলি নেয় না takes কারওরও যদি এই সমস্যা হয় তবে কেবল এটি এখানে রেখে এই সমাধানটি পেতে আমাকে 2 ঘন্টা সময় নিয়েছে এবং এটি CSS এর একমাত্র লাইন। https://developer.mozilla.org/en-US/docs/Web/CSS/touch-action


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.