JQuery টানুন এবং ড্রপ সহ ক্লিক ইভেন্ট প্রতিরোধ করা


86

আমার পৃষ্ঠায় এমন উপাদান রয়েছে যা jQuery এর সাথে টেনে আনে। এই উপাদানগুলির কি ক্লিক ইভেন্ট রয়েছে যা অন্য পৃষ্ঠায় নেভিগেট করে (উদাহরণস্বরূপ সাধারণ লিঙ্কগুলি)।

ক্লিকের ফলে এ জাতীয় উপাদানটি ড্র্যাগ এবং স্থিতি স্থিতি না রেখে এড়াতে গুলি চালানো থেকে রোধ করার সর্বোত্তম উপায় কী?

আমার বাছাইযোগ্য উপাদানগুলির সাথে এই সমস্যা আছে তবে সাধারণ ড্রাগ এবং ড্রপের জন্য সমাধান নেওয়া ভাল বলে মনে করি।

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


উত্তর:


89

এমন একটি সমাধান যা আমার পক্ষে ভালভাবে কাজ করেছে এবং এর জন্য কোনও সময়সীমা দরকার নেই: (হ্যাঁ আমি কিছুটা পেডেন্টিক ;-)

টেনে আনতে শুরু করার সাথে আমি উপাদানটিতে একটি চিহ্নিতকারী শ্রেণি যুক্ত করি, যেমন 'নোক্লিক'। উপাদানটি ফেলে দেওয়া হলে, ক্লিক ইভেন্টটি ট্রিগার করা হয় - আরও স্পষ্টভাবে যদি টেনে আনার সমাপ্তি ঘটে, আসলে এটি কোনও বৈধ লক্ষ্যে ফেলে দেওয়া হবে না। ক্লিক হ্যান্ডলারে আমি উপস্থিত থাকলে চিহ্নিতকারী শ্রেণিটি সরিয়ে ফেলি, অন্যথায় ক্লিকটি স্বাভাবিকভাবে পরিচালিত হয়।

$('your selector').draggable({
    start: function(event, ui) {
        $(this).addClass('noclick');
    }
});

$('your selector').click(function(event) {
    if ($(this).hasClass('noclick')) {
        $(this).removeClass('noclick');
    }
    else {
        // actual click event code
    }
});

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

4
এটি আমার সমাধানের দিকে নিয়ে যায়, আমি কেবল ক্লাসের পরিবর্তে jQuery ডেটা ফাংশনটি ব্যবহার করি। ধন্যবাদ
উইলিয়াম

4
কিন্তু ব্রাউজার যখন ইভেন্ট
ছাড়বে ততবার

6
শ্রেণি বা ডেটা সেট করা বাঁচাতে ক্লিক ইভেন্ট হ্যান্ডলারে আপনি এটিও ব্যবহার করতে পারেন: if (! $ (এটি) .is ('।
Ui

4
ওহো, আপনি কি stop: function(event, ui) { $(this).removeClass('noclick'); }টেনে নেবার যোগ্য হ্যান্ডলারটি চান না? অন্যথায় প্রতিটি ড্রাগ-এন-ড্রপ অন্য কোথাও 'আপনার নির্বাচক'-এর উপরের ক্লিকটিকে ব্যর্থ করবে না।
বব স্টেইন

41

সমাধান হ'ল ক্লিক হ্যান্ডলার যুক্ত করা যা ক্লিকের প্রসারিত করতে টানতে শুরু করতে পারে drag এবং তারপরে ড্রপ সঞ্চালনের পরে সেই হ্যান্ডলারটি সরান। ক্লিক প্রতিরোধ কাজ করতে শেষ ক্রিয়াটি কিছুটা বিলম্বিত হওয়া উচিত।

বাছাইয়ের জন্য সমাধান:

...
.sortable({
...
        start: function(event, ui) {
            ui.item.bind("click.prevent",
                function(event) { event.preventDefault(); });
        },
        stop: function(event, ui) {
            setTimeout(function(){ui.item.unbind("click.prevent");}, 300);
        }
...
})

টেনে আনার জন্য সমাধান:

...
.draggable({
...
        start: function(event, ui) {
            ui.helper.bind("click.prevent",
                function(event) { event.preventDefault(); });
        },
        stop: function(event, ui) {
            setTimeout(function(){ui.helper.unbind("click.prevent");}, 300);
        }
...
})

4
মনে এই আমার জন্য ক্লিক ঘটনা প্রতিরোধ করতে পারে না, jQuery 1.9.1 এবং jquery.ui 1.10.3 ব্যবহার তোমার
হারুন

4
অদ্ভুত যে আপনি নিজের প্রশ্নের উত্তর দিয়েছেন, এবং এটি কাজ করছে না, শাশা লওল।

@ নীচে এই উত্তরটি কাজ করে: http://stackoverflow.com/a/4572831/119765
লোল

আরেকটি সহজ উত্তর - শুধু জায়গা তম jQuery এর .click () হ্যান্ডলার পর .draggable () stackoverflow.com/questions/18032136/...
JxAxMxIxN

4
যদি আপনি 'ক্লোন' মানের সাথে অ্যাট্রিবিউট হেল্পারটি পাস করেন তবে এটি ইভেন্টটিকে টেনে এড়ানো বাছাই করা আইটেমটিতে
চালিত করা

12

আমার একই সমস্যা ছিল এবং একাধিক পদ্ধতির চেষ্টা করেছিলাম এবং কেউই আমার পক্ষে কাজ করেনি।

সমাধান 1

$('.item').click(function(e)
{            
    if ( $(this).is('.ui-draggable-dragging') ) return false;
});  

আমার জন্য কিছুই করে না টেনে আনার পরে আইটেমটি ক্লিক করা হচ্ছে।

সমাধান 2 (টম ডি বোয়ার দ্বারা)

$('.item').draggable(
{   
    stop: function(event, ui) 
    {
         $( event.originalEvent.target).one('click', function(e){ e.stopImmediatePropagation(); } );
    }
});

এটি ঠিক কাজ করে তবে একটি ক্ষেত্রে ব্যর্থ হয়- যখন আমি পূর্ণস্ক্রিন অনক্লিক হয়ে যাচ্ছিলাম:

var body = $('body')[0];     
req = body.requestFullScreen || body.webkitRequestFullScreen || body.mozRequestFullScreen;
req.call(body); 

সমাধান 3 (সাশা ইয়ানোভেটস দ্বারা)

 $('.item').draggable({
        start: function(event, ui) {
            ui.helper.bind("click.prevent",
                function(event) { event.preventDefault(); });
        },
        stop: function(event, ui) {
            setTimeout(function(){ui.helper.unbind("click.prevent");}, 300);
        }
})

এটি আমার পক্ষে কাজ করে না।

সমাধান 4 - একমাত্র একমাত্র ঠিক কাজ করেছে

$('.item').draggable(
{   
});
$('.item').click(function(e)
{  
});

হ্যাঁ, এটি- সঠিক অর্ডারটি কৌশলটি কার্যকর করে you প্রথমে আপনাকে ড্রাগ্যাগেবল () এরপরে বাঁধতে হবে (তারপরে) ইভেন্টটি ক্লিক করুন। এমনকি যখন আমি ক্লিক () ইভেন্টে ফুলস্ক্রিন টগলিং কোড রেখেছি তখনও টেনে আনার সময় এটি ফুলস্ক্রিনে যায় নি। আমার জন্য একদম সঠিক!


4
আমার জন্য কাজ করা একমাত্র (আইই 11 / এজ এ) সমাধান 4 ছিল Thanks ধন্যবাদ!
সাইমন

4
# 4 ক্লাস বা ভেরিয়েবল ব্যবহার না করেই আমার জন্য সঠিক এবং সহজ সমাধান।
ইলেক্ট্রোটাইপ 1

11

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


9

আমি সত্যিই টাইমার ব্যবহার বা প্রতিরোধ করতে পছন্দ করি না, তাই আমি যা করেছি তা হ'ল:

var el, dragged

el = $( '#some_element' );

el.on( 'mousedown', onMouseDown );
el.on( 'mouseup', onMouseUp );
el.draggable( { start: onStartDrag } );

onMouseDown = function( ) {
  dragged = false;
}

onMouseUp = function( ) {
  if( !dragged ) {
    console.log('no drag, normal click')
  }
}

onStartDrag = function( ) {
  dragged = true;
}

রকসোলিড ..


এটি আমার জন্য সেরা সমাধান ছিল। Jquery.ui.touch.punch.js ব্যবহার করে একটি মোবাইল ওয়েব ব্রাউজারে jquery UI বাছাইযোগ্য এমন কাজ করতে ক্লিক ইভেন্টগুলি পেতে আমার সমস্যা হয়েছিল তবে এটি এটিকে মোটামুটি মার্জিতভাবে সমাধান করেছে।
গডস্মিথ

3

lex82 এর সংস্করণ তবে .সোর্টেবল () এর জন্য

 start: function(event, ui){
 ui.item.find('.ui-widget-header').addClass('noclick');
 },

এবং আপনার কেবল প্রয়োজন হতে পারে:

 start: function(event, ui){
 ui.item.addClass('noclick');
 },

এবং আমি টগলটির জন্য যা ব্যবহার করছি তা এখানে:

$("#datasign-widgets .ui-widget-header").click(function(){
if ($(this).hasClass('noclick')) {
$(this).removeClass('noclick');

}
else {
$(this).next().slideToggle();
$(this).find('.ui-icon').toggleClass("ui-icon-minusthick").toggleClass("ui-icon-plusthick");
}
});

4
এটি প্রদর্শিত হয় যে jquery UI সাজানো হচ্ছে এমন আইটেমটিতে 'ui- বাছাইযোগ্য-সহায়ক' শ্রেণি যুক্ত করে। সুতরাং, আপনি 'নকল ক্লিক' ক্লাসটি ছেড়ে দিতে পারেন এবং ($ (এটি) .হেসক্লাস ('ইউআই-বাছাইযোগ্য-সহায়ক')) করতে পারেন। সেভাবে আরও পরিশ্রুত
ম্যাট দে লিওন

3

ডিফল্ট প্রতিরোধ না করেই সাশার উত্তরের একটি সম্ভাব্য বিকল্প:

var tmp_handler;
.sortable({
        start : function(event,ui){
            tmp_handler = ui.item.data("events").click[0].handler;
            ui.item.off();
        },
        stop : function(event,ui){
            setTimeout(function(){ui.item.on("click", tmp_handler)}, 300);
        },

3

JQuery UI- এ, টেনে নিয়ে যাওয়া উপাদানগুলিকে "ui-draggable-ખેંચীকরণ" শ্রেণি দেওয়া হয়।
তাই আমরা ক্লিক করতে হবে কি না তা নির্ধারণ করতে এই ক্লাসটি ব্যবহার করতে পারি, কেবল ইভেন্টটি দেরি করে।
আপনার "স্টার্ট" বা "স্টপ" কলব্যাক ফাংশন ব্যবহার করার দরকার নেই, কেবল করুন:

$('#foo').on('mouseup', function () {
    if (! $(this).hasClass('ui-draggable-dragging')) {
        // your click function
    }
});

এটি "মাউসডাউন" বা "ক্লিক" এর পরিবর্তে "মাউসআপ" থেকে ট্রিগার করা হয়েছে - সুতরাং কিছুটা বিলম্ব রয়েছে, নিখুঁত হতে পারে না - তবে এখানে প্রস্তাবিত অন্যান্য সমাধানগুলির চেয়ে এটি সহজ।


1

এটি এবং কয়েকটি থ্রেড পড়ার পরে এটিই ছিল আমার সমাধান।

var dragging = false;
$("#sortable").mouseover(function() {
    $(this).parent().sortable({
        start: function(event, ui) {
            dragging = true;
        },
        stop: function(event, ui) {
            // Update Code here
        }
    })
});
$("#sortable").click(function(mouseEvent){
    if (!dragging) {
        alert($(this).attr("id"));
    } else {
        dragging = false;
    }
});

1

আমার ক্ষেত্রে এটি এর মতো কাজ করেছে:

$('#draggable').draggable({
  start: function(event, ui) {
    $(event.toElement).one('click', function(e) { e.stopPropagation(); });
  }
});

0

আপনি ইভেন্ট.প্রিভেন্টডিফল্ট () ব্যবহার করে লিঙ্কটি অক্ষম করার চেষ্টা করেছেন; শুরু ইভেন্টে এবং এটিকে পুনরায় সক্ষম করে টেনে আনতে থামাতে ইভেন্ট বা ড্রপ ইভেন্টটি আনবাইন্ড ব্যবহার করে?


0

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

স্পষ্টতই এটি "টেনে আনার পরে ক্লিকের ক্রিয়া সংজ্ঞায়িত করুন" বিধি লঙ্ঘন করে, সুতরাং একটি কর্মক্ষেত্র হিসাবে আমি বিক্রয়কর্মে উপাদানটির ক্রিয়াকলাপটিকে "onDblClick" ট্রিগার করতে পুনরায় সংজ্ঞায়িত করেছি এবং ধারক ডিভের জন্য এই কোডটি ব্যবহার করেছি:

$(this).draggable({
        zIndex: 999,
        revert: true,
        revertDuration: 0,
        start: function(event, ui) {
                   $(this).addClass('noclick');
                }
});

$(this).click(function(){
    if( $(this).hasClass('noclick'))
    {
        $(this).removeClass('noclick');
    }
    else
    {
        $(this).children(":first").trigger('dblclick');
    }
});

পিতামাতার ক্লিক ইভেন্টটি মূলত ব্যবহারকারীর অভিজ্ঞতা অক্ষত রেখে শিশু উপাদানকে ডাবল-ক্লিক করার প্রয়োজনীয়তাটি গোপন করে।


0

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

var dragging = true; 

$(this).click(function(){
  if(!dragging){
    do str...
  }
});

$(this).draggable({
  start: function(event, ui) {
      dragging = true;
  },

  stop: function(event, ui) {
      setTimeout(function(){dragging = false;}, 300);
  }

});

0

আমার জন্য সহায়ক হিসাবে বিকল্পগুলিতে সহায়তাকারীকে সহায়তা করতে সহায়তা করেছেন:

.sortable({
   helper : 'clone', 
   start:function(), 
   stop:function(),
   .....
});

ক্লোনিং ডোম উপাদানটিকে টেনে নিয়ে যাওয়া ইভেন্টটির বুবলি আটকাতে দেখে মনে হচ্ছে। আমি কোনও ইভেন্টপ্রোপেশন, বুদবুদ ইত্যাদি এড়াতে পারিনি This এটি ছিল আমার পক্ষে একমাত্র কার্যকরী সমাধান।


0

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

var mousePos = [0,0];
function startClick()
{
    mousePos = [event.clientX,event.clientY];
}
        
function endClick()
{
    if ( event.clientX != mousePos[0] && event.clientY != mousePos[1] )
    {
        alert( "DRAG CLICK" );
    }
    else
    {
        alert( "CLICK" );
    }
}
<img src=".." onmousedown="startClick();" onmouseup="endClick();" />

হ্যা আমি জানি. সবচেয়ে পরিষ্কার উপায় নয়, তবে আপনি ধারণাটি পাবেন।


0

সবচেয়ে সহজ এবং শক্তিশালী সমাধান? আপনার ড্রাগেবলের উপরে কেবল স্বচ্ছ উপাদান তৈরি করুন।

.click-passthrough {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  background: transparent;
}

element.draggable({        
        start: function () {

        },
        drag: function(event, ui) {
            // important! if create the 'cover' in start, then you will not see click events at all
                  if (!element.find('.click-passthrough').length) {
                      element.append("<div class='click-passthrough'></div>");
                  }
        },
        stop: function() {
          // remove the cover
          element.find('.click-passthrough').remove();
        }
    });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.