ইভেন্ট.প্রিভেন্টডেফল্ট () (jQuery ব্যবহার করে) বলছে এমন শ্রোতাকে কীভাবে আনবাইন্ড করবেন?


128

জিকুরি টগল ডিফল্টরূপে ডিফল্ট () প্রতিরোধ কল করে, তাই ডিফল্টগুলি কাজ করে না। আপনি একটি চেকবক্স ক্লিক করতে পারবেন না, আপনি কোনও লিঙ্ক ইত্যাদি ক্লিক করতে পারবেন না ইত্যাদি

ডিফল্ট হ্যান্ডলারটি পুনরুদ্ধার করা সম্ভব?


আপনি কিছু উদাহরণ কোড দিতে পারেন?
জোজো

4
শিরোনামে প্রশ্ন একটি দুর্দান্ত এক! খুব খারাপ আসলে আসল প্রশ্ন নয় ... আমি এখানে খুঁজে পেতে আশা করছিলাম, তার উত্তর দেওয়ার পরে কীভাবে (যদি সম্ভব হয় তবে) এর প্রভাবটি আমরা 'আনসেট' করতে পারি preventDefault। বর্তমানে এই প্রশ্নটি আসলে 'আমি কীভাবে কোনও ইভেন্ট শ্রোতার সাথে jQuery যুক্ত করব না?'।
স্টিজন ডি উইট

উত্তর:


80

আমার ক্ষেত্রে:

$('#some_link').click(function(event){
    event.preventDefault();
});

$('#some_link').unbind('click'); ডিফল্ট ক্রিয়াটি পুনরুদ্ধার করার একমাত্র পদ্ধতি হিসাবে কাজ করেছিল।

যেমনটি এখানে দেখা গেছে: https://stackoverflow.com/a/1673570/211514


2
যদি এই উপাদানটির আরেকটি ক্লিক হ্যান্ডলার থাকে তবে আপনি সংযুক্ত সমস্ত ইভেন্ট
আনবাইন্ড করুন

56

এটি মোটামুটি সহজ

ধরা যাক আপনার মতো কিছু করুন

document.ontouchmove = function(e){ e.preventDefault(); }

এখন এটিকে আসল পরিস্থিতিতে ফেরাতে নীচে করুন ...

document.ontouchmove = function(e){ return true; }

এই ওয়েবসাইট থেকে ।


এই সমাধানটি $ ('# a_link') এর পরে কাজ করে না click আনবাইন্ড ফাংশন ব্যবহার করুন।
ডেনিস মকারস্কি

2
আপনার সরবরাহিত লিঙ্কটি নষ্ট হয়ে গেছে।
সারিবদ্ধ

16

এটি পুনরুদ্ধার করা সম্ভব নয় preventDefault()তবে আপনি যা করতে পারেন তা এটি কৌশল:

<div id="t1">Toggle</div>
<script type="javascript">
$('#t1').click(function (e){
   if($(this).hasClass('prevented')){
       e.preventDefault();
       $(this).removeClass('prevented');
   }else{
       $(this).addClass('prevented');
   }
});
</script>

আপনি যদি আরও এক ধাপ এগিয়ে যেতে চান তবে আপনি ইভেন্টটি ট্রিগার করতে ট্রিগার বোতামটিও ব্যবহার করতে পারেন।


আমি বেশ নিশ্চিত যে এটি - আমি সম্প্রতি একটি ডিজাইনে এটি করেছি। প্রথমে একটি বোতামের একটি ক্লিকের উপরে আমি টাচমোভ ইভেন্টে e.preventDefault যুক্ত করে আইফোনটিতে স্ক্রোলটি রোধ করেছিলাম এবং তারপরে অ্যানিমেশনটি সম্পন্ন করার পরে আমি সত্য ফিরে এসেছি এবং এটি একটি কবজির মতো কাজ করেছে।
শিয়ালবাগগা

11
function DoPrevent(e) {
  e.preventDefault();
  e.stopPropagation();
}

// Bind:
$(element).on('click', DoPrevent);

// UnBind:
$(element).off('click', DoPrevent);

এটি আমার পক্ষে যেভাবে কাজ করেছে তা হ'ল: document (দস্তাবেজ)। অফ ('টাচমোভ'); document (দস্তাবেজ) .অন ('টাচমোভ', ফাংশন () true সত্য প্রত্যাবর্তন;});
রোজারভিলা

9

কিছু ক্ষেত্রে * আপনি প্রথমে return falseপরিবর্তে এটি করতে পারেন e.preventDefault(), তারপরে আপনি যখন ডিফল্টটিতে পুনরুদ্ধার করতে চান return true

* অর্থ যখন আপনি ইভেন্টটি বুদবুদ করতে আপত্তি করেন না এবং আপনি এর e.stopPropagation()সাথে একসাথে ব্যবহার করবেন নাe.preventDefault()

আরো দেখুন অনুরূপ প্রশ্ন (এছাড়াও স্ট্যাক ওভারফ্লো মধ্যে)

বা চেকবক্সের ক্ষেত্রে আপনার এমন কিছু থাকতে পারে:

$(element).toggle(function(){
  $(":checkbox").attr('disabled', true);
  },
function(){
   $(":checkbox").removeAttr('disabled');
}) 

9

আপনি ডিফল্ট ক্রিয়াটি পুনরুদ্ধার করতে পারেন (এটি যদি এইচআরইএফ অনুসরণ করে তবে):

window.location = $(this).attr('href');


2
আইডিয়াগুলি সঠিক ছিল তবে বাক্সের বাইরে থাকা কোডটি আমার পক্ষে কাজ করে না (যদি না এটি কেবল জ্যাকুয়েরিতে কেবল একটি বাক্য গঠন পরিবর্তন হয়) তবে আমি ব্যবহার করেছি: উইন্ডো.লোকেশন = $ (এটি) .attr ('href');
মোডিকা

3

যদি এটি কোনও লিঙ্ক হয় তবে $(this).unbind("click");লিঙ্কটি ক্লিক করা পুনরায় সক্ষম হবে এবং ডিফল্ট আচরণ পুনরুদ্ধার হবে।

এটি কীভাবে কাজ করে তা প্রদর্শনের জন্য আমি একটি ডেমো জেএস ফিডাল তৈরি করেছি :

এখানে জেএস ফিডলের কোডটি রয়েছে:

এইচটিএমএল:

<script src="https://code.jquery.com/jquery-1.10.2.js"></script>
<a href="http://jquery.com">Default click action is prevented, only on the third click it would be enabled</a>
<div id="log"></div>

javascript:

<script>
var counter = 1;
$(document).ready(function(){
$( "a" ).click(function( event ) {
  event.preventDefault();

  $( "<div>" )
    .append( "default " + event.type + " prevented "+counter )
    .appendTo( "#log" );

    if(counter == 2)
    {
        $( "<div>" )
    .append( "now enable click" )
    .appendTo( "#log" );

    $(this).unbind("click");//-----this code unbinds the e.preventDefault() and restores the link clicking behavior
    }
    else
    {
        $( "<div>" )
    .append( "still disabled" )
    .appendTo( "#log" );
    }
    counter++;
});
});
</script>

2

এই কোডটি পরীক্ষা করুন, আমি মনে করি আপনার সমস্যার সমাধান করুন:

event.stopPropagation();

উল্লেখ


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

2

নেমস্পেস ব্যবহার করে এটি করার সর্বোত্তম উপায়। এটি একটি নিরাপদ এবং সুরক্ষিত উপায়। এখানে .rb হ'ল নেমস্পেস যা নিশ্চিত করে যে আনবাইন্ড ফাংশন সেই নির্দিষ্ট কীডাউনটিতে কাজ করে তবে অন্যের উপরে নয়।

$(document).bind('keydown.rb','Ctrl+r',function(e){
            e.stopImmediatePropagation();
            return false;
        });

$(document).unbind('keydown.rb');

ref1: http://idodev.co.uk/2014/01/safely-binding- to-events- using-namespaces-in-jquery/

রেফ 2: http://jqfundamentals.com/chapter/events



1

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

ইভেন্ট প্রবাহের যে কোনও পর্যায়ে প্রতিরোধ ডিফল্ট () কে কল করা ইভেন্টটিকে বাতিল করে দেয়, এর অর্থ হ'ল ইভেন্টের ফলস্বরূপ বাস্তবায়নের দ্বারা সাধারণত গৃহীত কোনও ডিফল্ট ক্রিয়াকলাপ ঘটবে না।

ইভেন্টটি বাতিলযোগ্য কিনা তা পরীক্ষা করতে আপনি ইভেন্ট ক্যানস্যাবল ব্যবহার করতে পারেন। একটি অ-বাতিলযোগ্য ইভেন্টের জন্য কন্ট্রোল ডেডফল্ট () কল করার কোনও প্রভাব নেই।

window.onKeydown = event => {
    /*
        if the control button is pressed, the event.ctrKey 
        will be the value  [true]
    */

    if (event.ctrKey && event.keyCode == 83) {
        event.preventDefault();
        // you function in here.
    }
}

0

আমার কিছু সমস্যা হয়েছে যখন কেবলমাত্র কিছু কাস্টম অ্যাকশন (অন্যথায় কোনও ফর্মের অক্ষম ইনপুট ক্ষেত্রগুলি সক্ষম করুন) শেষ হওয়ার পরে আমার ডিফল্ট ক্রিয়া দরকার। আমি ডিফল্ট ক্রিয়া (জমা ()) একটি নিজস্ব, পুনরাবৃত্ত ফাংশন (ডসউবমিট ()) এ গুটিয়ে রেখেছি।

var prevdef=true;
var dosubmit=function(){
    if(prevdef==true){
        //here we can do something else first//
        prevdef=false;
        dosubmit();
    }
    else{
        $(this).submit();//which was the default action
    }
};

$('input#somebutton').click(function(){dosubmit()});

1
সাধারণ দ্রষ্টব্য: কিছু কোডার মনে করেন if (predef == true)যে আরও স্পষ্ট, আপনি বিনা কারণে আপনার জেএস কোডে 7 টি অক্ষর যুক্ত করছেন। if (prevdef)যেমন পাঠযোগ্য। এছাড়াও, আপনি কোনও রিডান্ট্যান্ট বেনাম ইভেন্ট হ্যান্ডলার যুক্ত করেছেন যখন কোনও পরামিতিগুলি পাস না করা .click(dosubmit)একই কাজ করে .click(function(){dosubmit()})
কোডিং গেছে

0

একটি বুলিয়ান ব্যবহার করুন:

let prevent_touch = true;
document.documentElement.addEventListener('touchmove', touchMove, false);
function touchMove(event) { 
    if (prevent_touch) event.preventDefault(); 
}

অন্যকে অনুমতি দেওয়ার সময় কিছু 'পৃষ্ঠায়' স্ক্রোলিং / জুম করা রোধ করতে আমি এটি একটি প্রগতিশীল ওয়েব অ্যাপে ব্যবহার করি।


0

আপনি 2 ক্লাস গঠন করতে পারেন। আপনি তার একটিতে আপনার জেএস স্ক্রিপ্ট সেট করার পরে, আপনি যখন আপনার স্ক্রিপ্টটি অক্ষম করতে চান, আপনি কেবল এই ফর্মটি থেকে বাইন্ডেড স্ক্রিপ্ট সহ ক্লাসটি মুছবেন।

এইচটিএমএল:

<form class="form-create-container form-create"> </form>   

জাতীয়

$(document).on('submit', '.form-create', function(){ 
..... ..... ..... 
$('.form-create-container').removeClass('form-create').submit();

});


-10

আমি নিশ্চিত না আপনি কী বোঝাতে চেয়েছেন: তবে এখানে একটি অনুরূপ (এবং সম্ভবত একই) সমস্যার সমাধান রয়েছে ...

আমি প্রায়শই আইটেমগুলি বাধা দেওয়ার জন্য প্রতিরোধক ডিফল্ট () ব্যবহার করি। তবে: এটি বাধা দেওয়ার একমাত্র পদ্ধতি নয় ... প্রায়শই আপনি কেবল "প্রশ্ন" চান যা অনুসরণ করে আচরণটি আগের মতো চলতে পারে বা বন্ধ হয়ে যায়। সাম্প্রতিক ক্ষেত্রে আমি নিম্নলিখিত সমাধানটি ব্যবহার করেছি:

$("#content").on('click', '#replace', (function(event){ return confirm('Are you sure you want to do that?') }));

মূলত, "প্রতিরোধের ডিফল্ট" বলতে অন্য কিছু করা এবং কিছু করা বোঝায়: "নিশ্চিতকরণ" ব্যবহারের জন্য ডিজাইন করা হয়েছে ... ভাল - নিশ্চিতকরণের জন্য!

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