व्यवहार-संलग्न कार्यों को दो बार संलग्न होने से कैसे रोका जाए?


11

मेरा एक व्यवहार है जो onकुछ चेकबॉक्स में जुड़ता है।

(function($) { 
  Drupal.behaviors.mymodule = {
    attach: function (context, settings) {

      $('.skip-line', context).on('change', function(){
        // some code
        if ( confirm(Drupal.t('Apply to all languages?')) ) {
          // applying...
        }
      });
    }
  };
})(jQuery);

यह बहुत अच्छी तरह से काम करता है, लेकिन चेकबॉक्स AJAX के लोड वाले हिस्से में हैं। यदि मैं फॉर्म के उस हिस्से को पुनः लोड करता हूं, तो उन पर क्लिक करने से दो बार पुष्टि पॉपअप हो जाती है। अब, मुझे पता है कि मैं फ़ंक्शन के अंदर परीक्षण कर सकता हूं यदि यह पहली बार है जब इसे कॉल किया जाता है, लेकिन मैं यह सुनिश्चित करना पसंद करूंगा कि यह केवल एक बार मेरे तत्व में जोड़ा जाता है, और इस प्रकार केवल एक बार बुलाया जाता है। मैं उसे कैसे कर सकता हूँ?

जवाबों:


20

once()समारोह है कि, उदाहरण के साथ मदद मिलेगी

(function($) { 
   Drupal.behaviors.mymodule = {
    attach: function (context, settings) {

      $('.skip-line', context).once('mymodule').on('change', function(){
        // some code
        if ( confirm(Drupal.t('Apply to all languages?')) ) {
          // applying...
        }
      });
    }
  };
})(jQuery);

कई संदर्भों में से एक


2
धन्यवाद। एक जादू की तरह काम किया। मुझे लगता है कि इन क्षणों में से एक है जब मैं बस Google को ठीक से पूछने में विफल रहता हूं। मैंने दो बार रोकने और कई को रोकने के बारे में पूछा । अगर केवल मैंने इसे एक बार करने के बारे में पूछा है ...
Mołot

1
@ Mołot लेकिन आपकी टिप्पणी के लिए धन्यवाद अनुक्रमित किया जा रहा है, मुझे यह तब मिला जब मैंने कई को रोकने के लिए खोज की: -D
frazras

7

इसे प्राप्त करने के लिए आपको एक बार () फ़ंक्शन का उपयोग करना होगा। से यह पेज

Drupal.behaviors.myModule = {
  attach: function (context, settings) {
    $('element', context).once('myModule', function () {
     // any behavior is now applied once
    });
  }
};

फ़ंक्शन के लिए दिया गया स्ट्रिंग "myModule" jQuery के चयन से मेल खाने वाले तत्वों पर एक मार्कर के रूप में सेट किया गया है, इसलिए अगली बार जब इसे कहा जाता है तो यह उन्हें अनदेखा कर देता है। यदि आप एक बार कार्य करने के लिए अलग-अलग उद्देश्यों के लिए एक बार कॉल करते हैं, तो एक ही स्ट्रिंग का उपयोग न करें, अन्यथा आप इसके उद्देश्य को हरा सकते हैं।


आपके स्पष्टीकरण के लिए धन्यवाद :) स्वीकृत क्लाइव के उत्तर के रूप में उनके कोड ने मेरे लिए सीधे काम किया और आपकी नहीं, लेकिन मुझे आपका विवरण बेहतर लगा।
मोलॉट 11

2

यहाँ एक उदाहरण है जो फ़्राज़रेस के उत्तर पर विस्तार करता है:

var searchPagesFoundationAccordionInit = false;
Drupal.behaviors.searchPagesFoundationAccordionInit = {
  attach: function (context, settings) {
    // Attempt to resolve behavior being called multiple times per page load.
    if (context !== document) {
      return;
    }
    if (!searchPagesFoundationAccordionInit) {
      searchPagesFoundationAccordionInit = true;
    }
    else {
      return;
    }

    // Check if component exists.
    if ($('.view-style--search-page .search-section__sidebar .accordion').length > 0) {
     // Code here.
    }
  }
};

इस समाधान ने मेरे लिए काम किया। मुझे कुछ तत्व को कार्रवाई से जोड़ने की आवश्यकता नहीं है। मुझे सिर्फ एक फंक्शन चलाना है। Drupal.behaviors.checkOnce = { attach: function (context, settings) { if (context === document) { check(); } function check() { //code } } };इस मामले में check()फ़ंक्शन केवल एक बार चलेगा, जब संदर्भ एक होगाdocument
वादिम सुदरीकोव

1

आप यह भी कर सकते हैं:

(function ($, Drupal, drupalSettings) {
    'use strict';
Drupal.behaviors.someThing = {
        attach: function (context) {
            if (context === document) {
               console.log('called inside'); // Once <-- 
            }
            console.log('called outside'); // can be manny manny  <-- 
         },
    };
})(jQuery, Drupal, drupalSettings);

यह मेरे लिए बहुत अच्छा काम करता है
महताब आलम

0

यहां एक फ़ंक्शन है जो एक बार चलता है:

(function($, Drupal) {

  var initialized;

  function init() {
    if (!initialized) {
      initialized = true;
      // Add your one-time only code here
    }
  }

  Drupal.behaviors.someKey = {
    attach: function() {
      init();
    }
  };

}(jQuery, Drupal));

स्रोत: https://www.drupal.org/forum/support/module-development-and-code-questions/2018-06-15/run-js-funtion-once-not-attach-once#commentment654121

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.