পদ্ধতিগুলির সাথে কীভাবে একটি jQuery প্লাগইন তৈরি করবেন?


191

আমি একটি জিকুয়েরি প্লাগইন লিখতে চেষ্টা করছি যা এটির জন্য ব্যবহৃত বস্তুর অতিরিক্ত ফাংশন / পদ্ধতি সরবরাহ করবে। আমি অনলাইনে যে সমস্ত টিউটোরিয়াল পড়েছি (গত ২ ঘন্টা ধরে ব্রাউজ করে চলেছি) এর মধ্যে সর্বাধিক, কীভাবে বিকল্পগুলি যুক্ত করা যায়, তবে অতিরিক্ত ফাংশন নয় include

আমি যা করতে চাই তা এখানে:

// ডিমেট ডিভটি ডিভের জন্য প্লাগইন কল করে একটি বার্তা ধারক হতে

$("#mydiv").messagePlugin();
$("#mydiv").messagePlugin().saySomething("hello");

বা এই লাইন বরাবর কিছু। এখানে যা ফুটে উঠেছে তা এখানে: আমি প্লাগইন কল করি, তারপরে আমি সেই প্লাগইনটির সাথে যুক্ত একটি ফাংশন বলি। আমি এটি করার কোনও উপায় খুঁজে পাচ্ছি না এবং আমি অনেকগুলি প্লাগইন এর আগে দেখেছি।

প্লাগইনটির জন্য আমার এখন পর্যন্ত যা আছে তা এখানে:

jQuery.fn.messagePlugin = function() {
  return this.each(function(){
    alert(this);
  });

  //i tried to do this, but it does not seem to work
  jQuery.fn.messagePlugin.saySomething = function(message){
    $(this).html(message);
  }
};

আমি কীভাবে এমন কিছু অর্জন করতে পারি?

ধন্যবাদ!


18 নভেম্বর, 2013 আপডেট করুন: আমি হরির নিম্নলিখিত মন্তব্যগুলি এবং উক্তির সঠিক উত্তরটি পরিবর্তন করেছি।

উত্তর:


310

JQuery প্লাগইন অনুমোদনের পৃষ্ঠা অনুসারে ( http://docs.jquery.com/Plugins/Authoring ) jQuery এবং jQuery.fn নেমস্পেসগুলি কাদা না করাই ভাল। তারা এই পদ্ধতির পরামর্শ দেয়:

(function( $ ){

    var methods = {
        init : function(options) {

        },
        show : function( ) {    },// IS
        hide : function( ) {  },// GOOD
        update : function( content ) {  }// !!!
    };

    $.fn.tooltip = function(methodOrOptions) {
        if ( methods[methodOrOptions] ) {
            return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));
        } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {
            // Default to "init"
            return methods.init.apply( this, arguments );
        } else {
            $.error( 'Method ' +  methodOrOptions + ' does not exist on jQuery.tooltip' );
        }    
    };


})( jQuery );

মূলত আপনি আপনার ফাংশনগুলি একটি অ্যারেতে সংরক্ষণ করেন (মোড়ানোর ফাংশনটির জন্য স্কোপযুক্ত) এবং পরামিতিটি কোনও স্ট্রাক্ট (বা নাল) হয়ে থাকলে একটি ডিফল্ট পদ্ধতিতে ("init" এখানে ফিরে যাওয়া) যদি প্যারামিটারটি একটি স্ট্রিং হয় তবে একটি এন্ট্রি পরীক্ষা করুন।

তারপরে আপনি পদ্ধতিগুলি কল করতে পারেন ...

$('div').tooltip(); // calls the init method
$('div').tooltip({  // calls the init method
  foo : 'bar'
});
$('div').tooltip('hide'); // calls the hide method
$('div').tooltip('update', 'This is the new tooltip content!'); // calls the update method

জাভাস্ক্রিপ্টস "আর্গুমেন্ট" ভেরিয়েবল হ'ল পাস হওয়া সমস্ত আর্গুমেন্টের একটি অ্যারে তাই এটি ফাংশন প্যারামিটারগুলির স্বেচ্ছাসেবী দৈর্ঘ্যের সাথে কাজ করে।


2
এই পদ্ধতিটি আমি ব্যবহার করি। আপনি methods .fn.tooltip ('পদ্ধতির নাম', প্যারাম) এর মাধ্যমেও স্ট্যাটিকভাবে পদ্ধতিগুলিতে কল করতে পারেন;
Rake36

1
খুব সুবিধাজনক আর্কিটেকচার। আমি init পদ্ধতিটি কল করার আগে এই লাইনটিও যুক্ত করেছি: this.data('tooltip', $.extend(true, {}, $.fn.tooltip.defaults, methodOrOptions));তাই এখন আমি যখনই শুরু করার পরে চাই তখন বিকল্পগুলিতে অ্যাক্সেস করতে পারি।
ivkremer

16
আমার মতো যে কেউ প্রথমে বলেছিলেন "আর্গুমেন্টগুলি পরিবর্তনশীল কোথা থেকে এসেছে" - বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / রেফারেন্স / - - আমি জেএসকে চিরকাল ব্যবহার করেছি এবং এটি কখনই জানতাম না। প্রতিদিনই আপনি কিছু নতুন শিখছেন!
স্ট্রিটলোগিক্স

2
@ ডিআইএইচ, আমি এই সাথে আপনার সাথে আছি। এই পদ্ধতির দুর্দান্ত মনে হচ্ছে, তবে এটি আপনাকে অন্য কোথাও থেকে আপনার বিশ্বব্যাপী সেটিংসে অ্যাক্সেস দেয় না init
স্টিফেন কলিন্স 19

4
এই কৌশলটি নিয়ে একটি বড় সমস্যা আছে! এটি নির্বাচকের প্রতিটি উপাদানগুলির জন্য নতুন উদাহরণ তৈরি করে না যেমন আপনি মনে করেন যে আপনি করছেন, পরিবর্তে এটি কেবলমাত্র নির্বাচকের সাথে যুক্ত একটি একক উদাহরণ তৈরি করে। একটি সমাধানের জন্য আমার উত্তর দেখুন ।
কেভিন জুরকোভস্কি

56

অতিরিক্ত পদ্ধতি সহ প্লাগিন তৈরি করার জন্য আমি যে প্যাটার্নটি ব্যবহার করেছি তা এখানে। আপনি এটি ব্যবহার করুন:

$('selector').myplugin( { key: 'value' } );

অথবা, সরাসরি কোনও পদ্ধতিতে ডাকতে,

$('selector').myplugin( 'mymethod1', 'argument' );

উদাহরণ:

;(function($) {

    $.fn.extend({
        myplugin: function(options,arg) {
            if (options && typeof(options) == 'object') {
                options = $.extend( {}, $.myplugin.defaults, options );
            }

            // this creates a plugin for each element in
            // the selector or runs the function once per
            // selector.  To have it do so for just the
            // first element (once), return false after
            // creating the plugin to stop the each iteration 
            this.each(function() {
                new $.myplugin(this, options, arg );
            });
            return;
        }
    });

    $.myplugin = function( elem, options, arg ) {

        if (options && typeof(options) == 'string') {
           if (options == 'mymethod1') {
               myplugin_method1( arg );
           }
           else if (options == 'mymethod2') {
               myplugin_method2( arg );
           }
           return;
        }

        ...normal plugin actions...

        function myplugin_method1(arg)
        {
            ...do method1 with this and arg
        }

        function myplugin_method2(arg)
        {
            ...do method2 with this and arg
        }

    };

    $.myplugin.defaults = {
       ...
    };

})(jQuery);

9
jquery-ui হিসাবে একই প্যাটার্ন, আমি সমস্ত যাদু স্ট্রিং পছন্দ করি না তবে অন্য কোনও উপায় আছে!
redsquare

8
এটি জিনিসগুলি করার একটি অ-মানক উপায়ের মতো বলে মনে হচ্ছে - শৃঙ্খলাবদ্ধ ফাংশনগুলির মতো এর চেয়ে সহজ কিছু আছে কি? ধন্যবাদ!
যুবাল কর্মী

2
@ ইউভাল - সাধারণত jQuery প্লাগইনগুলি jQuery বা কোনও মান দেয়, প্লাগইন নিজেই দেয় না। এই কারণে আপনি যখন প্লাগইন শুরু করতে চান তখন পদ্ধতির নামটি প্লাগইনটিতে আর্গুমেন্ট হিসাবে পাস হয়। আপনি যে কোনও সংখ্যক আর্গুমেন্ট পাস করতে পারেন তবে আপনাকে ফাংশন এবং যুক্তি পার্সিং সামঞ্জস্য করতে হবে। সম্ভবত আপনি যেমন দেখিয়েছেন তেমন একটি অনামী অবজায় সেট করা ভাল।
tvanfosson

1
;আপনার প্রথম লাইনে অর্থ কী ? দয়া করে আমাকে ব্যাখ্যা করুন :)
GusDeCooL

4
@ গুসডিকুল এটি ঠিক নিশ্চিত করে যে আমরা একটি নতুন বিবৃতি শুরু করছি যাতে আমাদের ফাংশন সংজ্ঞাটিকে অন্য কারও খারাপভাবে ফর্ম্যাট করা জাভাস্ক্রিপ্টের পক্ষে যুক্তি হিসাবে ব্যাখ্যা করা যায় না (অর্থাত্ প্রাথমিক পেরেনটি কোনও ফাংশন আহ্বান অপারেটর হিসাবে নেওয়া হয় না)। দেখুন stackoverflow.com/questions/7365172/...
tvanfosson

35

এই পদ্ধতির সম্পর্কে কী:

jQuery.fn.messagePlugin = function(){
    var selectedObjects = this;
    return {
             saySomething : function(message){
                              $(selectedObjects).each(function(){
                                $(this).html(message);
                              });
                              return selectedObjects; // Preserve the jQuery chainability 
                            },
             anotherAction : function(){
                               //...
                               return selectedObjects;
                             }
           };
}
// Usage:
$('p').messagePlugin().saySomething('I am a Paragraph').css('color', 'red');

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

আপনি কোডটি এখানে পরীক্ষা করে খেলতে পারেন ।

সম্পাদনা করুন: jQuery শৃঙ্খলাবদ্ধতার শক্তি সংরক্ষণের জন্য আপডেট হওয়া কোড।


1
এটি দেখতে কেমন তা বোঝার জন্য আমি কিছুটা কষ্ট করে যাচ্ছি। ধরে নিলাম যে আমার কাছে এমন কোড রয়েছে যা এই প্রথম চালানোর সময় কার্যকর করা দরকার, আমি প্রথমে আমার কোডটিতে এটি শুরু করতে হবে - এরকম কিছু: $ ('পি')। মেসেজপ্লাগিন (); তারপরে কোডের পরে আমি ফাংশনটি বলতে চাই কিছু এই জাতীয় '(' পি ')। মেসেজপ্লাগিন () .সায়মথিং (' কিছু '); এটি কি প্লাগইনটিকে পুনরায় আরম্ভ করবে না এবং তারপরে ফাংশনটি কল করবে? এটি ঘের এবং বিকল্পগুলির সাথে দেখতে কেমন হবে? আপনাকে অনেক ধন্যবাদ. -yuval
ইউভাল Karmi

1
যদিও jQuery এর শৃঙ্খলাবদ্ধতার দৃষ্টান্তগুলিকে বাছাই করে।
tvanfosson

সম্ভবত এটি সেরা উত্তর হওয়া উচিত
ড্রাগগফ

3
প্রতিবার আপনি বার্তা প্লাগইনকে কল করুন () এটি এই দুটি ফাংশন দিয়ে একটি নতুন অবজেক্ট তৈরি করবে, না?
w00t

4
এই পদ্ধতির মূল সমস্যাটি হ'ল $('p').messagePlugin()যদি আপনি যে দুটি ফাংশন ফিরে পান তার মধ্যে একটির কল না করে এটি অনুসরণযোগ্যতা সংরক্ষণ করতে পারে না ।
জোশুয়া বামব্রিক

18

বর্তমানে নির্বাচিত উত্তরের সমস্যাটি হ'ল আপনি নির্বাচকের প্রতিটি উপাদানটির জন্য কাস্টম প্লাগইনের একটি নতুন উদাহরণ তৈরি করছেন না যেমন আপনি মনে করেন যে আপনি করছেন ... আপনি কেবলমাত্র একটি একক উদাহরণ তৈরি করছেন এবং এতে যাচ্ছেন সুযোগ হিসাবে নির্বাচক নিজেই।

আরও গভীর ব্যাখ্যার জন্য এই ঝাঁকুনি দেখুন ।

পরিবর্তে, আপনাকে jQuery.Ech ব্যবহার করে নির্বাচকের মাধ্যমে লুপ করতে হবে এবং নির্বাচকের প্রতিটি উপাদানগুলির জন্য কাস্টম প্লাগইনের একটি নতুন উদাহরণ ইনস্ট্যান্ট করতে হবে।

এখানে কীভাবে:

(function($) {

    var CustomPlugin = function($el, options) {

        this._defaults = {
            randomizer: Math.random()
        };

        this._options = $.extend(true, {}, this._defaults, options);

        this.options = function(options) {
            return (options) ?
                $.extend(true, this._options, options) :
                this._options;
        };

        this.move = function() {
            $el.css('margin-left', this._options.randomizer * 100);
        };

    };

    $.fn.customPlugin = function(methodOrOptions) {

        var method = (typeof methodOrOptions === 'string') ? methodOrOptions : undefined;

        if (method) {
            var customPlugins = [];

            function getCustomPlugin() {
                var $el          = $(this);
                var customPlugin = $el.data('customPlugin');

                customPlugins.push(customPlugin);
            }

            this.each(getCustomPlugin);

            var args    = (arguments.length > 1) ? Array.prototype.slice.call(arguments, 1) : undefined;
            var results = [];

            function applyMethod(index) {
                var customPlugin = customPlugins[index];

                if (!customPlugin) {
                    console.warn('$.customPlugin not instantiated yet');
                    console.info(this);
                    results.push(undefined);
                    return;
                }

                if (typeof customPlugin[method] === 'function') {
                    var result = customPlugin[method].apply(customPlugin, args);
                    results.push(result);
                } else {
                    console.warn('Method \'' + method + '\' not defined in $.customPlugin');
                }
            }

            this.each(applyMethod);

            return (results.length > 1) ? results : results[0];
        } else {
            var options = (typeof methodOrOptions === 'object') ? methodOrOptions : undefined;

            function init() {
                var $el          = $(this);
                var customPlugin = new CustomPlugin($el, options);

                $el.data('customPlugin', customPlugin);
            }

            return this.each(init);
        }

    };

})(jQuery);

আর কাজ বেহালার

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

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

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

উদাহরণস্বরূপ, এটি দ্বিতীয় ফেডলটিতে কৌশলটি ব্যবহার করে সমস্ত বিকল্পের বস্তুর একটি অ্যারে ফেরত দেবে। এটি প্রথমটিতে অপরিবর্তিত ফিরে আসত।

$('div').customPlugin();
$('div').customPlugin('options'); // would return an array of all options objects

এইভাবে আপনাকে প্রথম ফিডলে অপশন অবজেক্টে অ্যাক্সেস করতে হবে এবং কেবল কোনও একক বস্তু ফিরিয়ে আনবে, সেগুলির একটি অ্যারে নয়:

var divs = $('div').customPlugin();
divs.customPlugin('options'); // would return a single options object

$('div').customPlugin('options');
// would return undefined, since it's not a cached selector

আমি উপরের কৌশলটি ব্যবহার করার পরামর্শ দেব, বর্তমানে নির্বাচিত উত্তর থেকে একটি নয়।


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

jQuery এর chainability এই পদ্ধতি ব্যবহার করে কাজ করছে না ... $('.my-elements').find('.first-input').customPlugin('update'‌​, 'first value').end().find('.second-input').customPlugin('update', 'second value'); returns Cannot read property 'end' of undefinedjsfiddle.net/h8v1k2pL
অ্যালেক্স জি

16

উইজেট কারখানা চালু হওয়ার সাথে সাথে jQuery এটিকে অনেক সহজ করে তুলেছে ।

উদাহরণ:

$.widget( "myNamespace.myPlugin", {

    options: {
        // Default options
    },

    _create: function() {
        // Initialization logic here
    },

    // Create a public method.
    myPublicMethod: function( argument ) {
        // ...
    },

    // Create a private method.
    _myPrivateMethod: function( argument ) {
        // ...
    }

});

আরম্ভ:

$('#my-element').myPlugin();
$('#my-element').myPlugin( {defaultValue:10} );

পদ্ধতি কলিং:

$('#my-element').myPlugin('myPublicMethod', 20);

(এইভাবে jQuery UI গ্রন্থাগারটি তৈরি করা হয়েছে))


@ daniel.sedlaysk a) "খুব খারাপ আর্কিটেকচার" - এটি jQuery এর স্ট্যান্ডার্ড উইজেট আর্কিটেকচার খ) "সংকলনের সময় অখণ্ডতার জন্য পরীক্ষা করা হয়েছে" - জাভাস্ক্রিপ্ট একটি গতিশীল ভাষা গ) "টাইপস্ক্রিপ্ট" - wha?
ইয়ারিন


সেটাই শুদ্ধ মায়া, মিঃ সেডলেসেক।
mystrdat

প্রতি দস্তাবেজ: এই সিস্টেমটিকে উইজেট কারখানা বলা হয় এবং jQuery UI 1.8 এর অংশ হিসাবে jQuery.widget হিসাবে প্রকাশিত হয়; তবে, এটি jQuery UI- এর স্বাধীনভাবে ব্যবহার করা যেতে পারে। JQuery UI ছাড়া $। উইজেটটি কীভাবে ব্যবহৃত হয় ?
এয়ারএন 57575

13

একটি সহজ পদ্ধিতি হল নেস্টেড ফাংশনগুলি ব্যবহার করা। তারপরে আপনি এগুলি কোনও অবজেক্ট-ভিত্তিক ফ্যাশনে চেইন করতে পারেন। উদাহরণ:

jQuery.fn.MyPlugin = function()
{
  var _this = this;
  var a = 1;

  jQuery.fn.MyPlugin.DoSomething = function()
  {
    var b = a;
    var c = 2;

    jQuery.fn.MyPlugin.DoSomething.DoEvenMore = function()
    {
      var d = a;
      var e = c;
      var f = 3;
      return _this;
    };

    return _this;
  };

  return this;
};

এবং এখানে এটি কল কিভাবে হয়:

var pluginContainer = $("#divSomeContainer");
pluginContainer.MyPlugin();
pluginContainer.MyPlugin.DoSomething();
pluginContainer.MyPlugin.DoSomething.DoEvenMore();

যদিও সাবধান। এটি তৈরি না হওয়া পর্যন্ত আপনি নেস্টেড ফাংশনটি কল করতে পারবেন না। সুতরাং আপনি এটি করতে পারবেন না:

var pluginContainer = $("#divSomeContainer");
pluginContainer.MyPlugin();
pluginContainer.MyPlugin.DoSomething.DoEvenMore();
pluginContainer.MyPlugin.DoSomething();

ডওভেনমোর ফাংশনটিও বিদ্যমান নেই কারণ ডোসোমিং ফাংশনটি এখনও চালানো হয়নি যা ডওভেনমোর ফাংশন তৈরি করার জন্য প্রয়োজনীয়। বেশিরভাগ jQuery প্লাগইনগুলির জন্য, আপনার কাছে কেবলমাত্র নেস্টেড ফাংশনগুলির একটি স্তর থাকবে যা আমি এখানে দেখিয়েছি দুটি হিসাবে নয়।
কেবলমাত্র নিশ্চিত হয়ে নিন যে যখন আপনি নেস্টেড ফাংশনগুলি তৈরি করেন যখন প্যারেন্ট ফাংশনে অন্য কোনও কোড কার্যকর হওয়ার আগে আপনি তাদের প্যারেন্ট ফাংশনটির শুরুতে এই ফাংশনগুলি সংজ্ঞায়িত করেন।

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


2
এটি দুর্দান্ত - আমি কেবল আশ্চর্য হই যে কেন jQuery নামগুলি প্লাগিন ('পদ্ধতি') প্যাটার্ন হিসাবে নামগুলি কল করার পক্ষে বলে মনে হচ্ছে?
w00t

6
এটা কাজ করে না. আপনি যদি দুটি পৃথক পাত্রে প্লাগইনটি প্রার্থনা করেন তবে অভ্যন্তরীণ ভেরিয়েবলগুলি ওভাররাইড হয়ে যায় (নাম _ এটি)
এমব্রোচ

ব্যর্থ: প্লাগইন কনটেনার.মাইপ্লাগিন.ডোএভেনমোর () অনুমতি দেয় না।
পল সুইটজ

9

আমি এটি jQuery প্লাগইন বয়লারপ্লেট থেকে পেয়েছি

JQuery প্লাগইন বয়লারপ্লেটে বর্ণিত , পুনরায় প্রকাশ করুন

// jQuery Plugin Boilerplate
// A boilerplate for jumpstarting jQuery plugins development
// version 1.1, May 14th, 2011
// by Stefan Gabos

// remember to change every instance of "pluginName" to the name of your plugin!
(function($) {

    // here we go!
    $.pluginName = function(element, options) {

    // plugin's default options
    // this is private property and is accessible only from inside the plugin
    var defaults = {

        foo: 'bar',

        // if your plugin is event-driven, you may provide callback capabilities
        // for its events. execute these functions before or after events of your
        // plugin, so that users may customize those particular events without
        // changing the plugin's code
        onFoo: function() {}

    }

    // to avoid confusions, use "plugin" to reference the
    // current instance of the object
    var plugin = this;

    // this will hold the merged default, and user-provided options
    // plugin's properties will be available through this object like:
    // plugin.settings.propertyName from inside the plugin or
    // element.data('pluginName').settings.propertyName from outside the plugin,
    // where "element" is the element the plugin is attached to;
    plugin.settings = {}

    var $element = $(element), // reference to the jQuery version of DOM element
    element = element; // reference to the actual DOM element

    // the "constructor" method that gets called when the object is created
    plugin.init = function() {

    // the plugin's final properties are the merged default and
    // user-provided options (if any)
    plugin.settings = $.extend({}, defaults, options);

    // code goes here

   }

   // public methods
   // these methods can be called like:
   // plugin.methodName(arg1, arg2, ... argn) from inside the plugin or
   // element.data('pluginName').publicMethod(arg1, arg2, ... argn) from outside
   // the plugin, where "element" is the element the plugin is attached to;

   // a public method. for demonstration purposes only - remove it!
   plugin.foo_public_method = function() {

   // code goes here

    }

     // private methods
     // these methods can be called only from inside the plugin like:
     // methodName(arg1, arg2, ... argn)

     // a private method. for demonstration purposes only - remove it!
     var foo_private_method = function() {

        // code goes here

     }

     // fire up the plugin!
     // call the "constructor" method
     plugin.init();

     }

     // add the plugin to the jQuery.fn object
     $.fn.pluginName = function(options) {

        // iterate through the DOM elements we are attaching the plugin to
        return this.each(function() {

          // if plugin has not already been attached to the element
          if (undefined == $(this).data('pluginName')) {

              // create a new instance of the plugin
              // pass the DOM element and the user-provided options as arguments
              var plugin = new $.pluginName(this, options);

              // in the jQuery version of the element
              // store a reference to the plugin object
              // you can later access the plugin and its methods and properties like
              // element.data('pluginName').publicMethod(arg1, arg2, ... argn) or
              // element.data('pluginName').settings.propertyName
              $(this).data('pluginName', plugin);

           }

        });

    }

})(jQuery);

তোমার পদ্ধতি বিরতি jQuery এর chaining: $('.first-input').data('pluginName').publicMethod('new value').css('color', red);আয় Cannot read property 'css' of undefined jsfiddle.net/h8v1k2pL/1
অ্যালেক্স জি

@ অ্যালেক্সজি এই উদাহরণটি দিয়েছিল আপনি এটি যোগ করবেন return $elementতাই এই উদাহরণে আপনি এটি পাল্টাবেন plugin.foo_public_method = function() {/* Your Code */ return $element;}স্যালিমকে ধন্যবাদ আমাকে সাহায্য করার জন্য ... github.com/AndreaLombardo/BootSideMenu/pull/34
CrandellWS

6

খুব দেরী হয়েছে তবে এটি একদিন কাউকে সাহায্য করতে পারে।

আমি একই পরিস্থিতিতে ছিলাম, কিছু পদ্ধতির সাথে একটি jQuery প্লাগইন তৈরি করেছি এবং কিছু নিবন্ধ এবং কিছু টায়ার পড়ার পরে আমি একটি jQuery প্লাগইন বয়লারপ্লেট তৈরি করি ( https://github.com/acanimal/jQuery- প্লাগিন- বয়লারপ্লেট )।

তদ্ব্যতীত, আমি এটির সাথে ট্যাগগুলি পরিচালনা করার জন্য একটি প্লাগইন বিকাশ করি ( https://github.com/acanimal/tagger.js ) এবং একটি দুটি ব্লগ পোস্ট লিখেছিলাম ধাপে ধাপে একটি jQuery প্লাগইন ( HTTP: // আকুরিয়াসানিমাল তৈরি) expla com / ব্লগ / 2013/01/15 / জিনিস-আমি-শিখানো-তৈরি-এ-জেকুরি-প্লাগইন-অংশ-i / )।


একটি সেরা হিসাবে jQuery প্লাগইন তৈরি সম্পর্কে আমি সম্ভবত সেরা পোস্টটি পেরিয়ে এসেছি - ধন্যবাদ;)
ডেক্স ডেভ

5

আপনি করতে পারেন:

(function($) {
  var YourPlugin = function(element, option) {
    var defaults = {
      //default value
    }

    this.option = $.extend({}, defaults, option);
    this.$element = $(element);
    this.init();
  }

  YourPlugin.prototype = {
    init: function() { },
    show: function() { },
    //another functions
  }

  $.fn.yourPlugin = function(option) {
    var arg = arguments,
        options = typeof option == 'object' && option;;
    return this.each(function() {
      var $this = $(this),
          data = $this.data('yourPlugin');

      if (!data) $this.data('yourPlugin', (data = new YourPlugin(this, options)));
      if (typeof option === 'string') {
        if (arg.length > 1) {
          data[option].apply(data, Array.prototype.slice.call(arg, 1));
        } else {
          data[option]();
        }
      }
    });
  };
});

এইভাবে আপনার প্লাগইনগুলি আপনার উপাদানটিতে ডেটা মান হিসাবে সংরক্ষণ করা হয়।

//Initialization without option
$('#myId').yourPlugin();

//Initialization with option
$('#myId').yourPlugin({
  // your option
});

// call show method
$('#myId').yourPlugin('show');

3

ট্রিগার ব্যবহার সম্পর্কে কী? এগুলি ব্যবহার করে কেউ কি কোনও ত্রুটি জানেন? সুবিধাটি হ'ল সমস্ত অভ্যন্তরীণ ভেরিয়েবলগুলি ট্রিগারগুলির মাধ্যমে অ্যাক্সেসযোগ্য এবং কোডটি খুব সহজ।

Jsfiddle দেখুন ।

ব্যবহারের উদাহরণ

<div id="mydiv">This is the message container...</div>

<script>
    var mp = $("#mydiv").messagePlugin();

    // the plugin returns the element it is called on
    mp.trigger("messagePlugin.saySomething", "hello");

    // so defining the mp variable is not needed...
    $("#mydiv").trigger("messagePlugin.repeatLastMessage");
</script>

প্লাগ লাগানো

jQuery.fn.messagePlugin = function() {

    return this.each(function() {

        var lastmessage,
            $this = $(this);

        $this.on('messagePlugin.saySomething', function(e, message) {
            lastmessage = message;
            saySomething(message);
        });

        $this.on('messagePlugin.repeatLastMessage', function(e) {
            repeatLastMessage();
        });

        function saySomething(message) {
            $this.html("<p>" + message + "</p>");
        }

        function repeatLastMessage() {
            $this.append('<p>Last message was: ' + lastmessage + '</p>');
        }

    });

}

1
cf. তোমার মন্তব্য. আমি এখানে দেখছি কেবলমাত্র সমস্যাটি হল ইভেন্ট সিস্টেমটির অপব্যবহার। কোনও ক্রিয়াকলাপ ডেকে আনার জন্য খাঁটি ইভেন্টগুলি ব্যবহার করা একেবারে সাধারণ; এটি ওভারকিলের মতো মনে হয় এবং সহজেই ভেঙে যেতে পারে। সাধারণত, আপনি একটি প্রকাশনা-সাবস্ক্রাইব ফ্যাশনে ইভেন্টগুলি ব্যবহার করবেন, উদাহরণস্বরূপ, একটি ফাংশন প্রকাশিত করে যে "ক" শর্তটি এসেছে। "এ" তে আগ্রহী অন্যান্য সংস্থাগুলি "এ" ঘটেছে বলে বার্তাটি শোনেন, তারপরে কিছু করুন। আপনি এটির পরিবর্তে পুশ "কমান্ড" হিসাবে ব্যবহার করছেন বলে মনে করছেন, তবে ধরে নিচ্ছেন কেবল একজন শ্রোতা রয়েছেন। আপনার সতর্কতা শ্রোতাদের যোগ (অন্যদের) দ্বারা নষ্ট না হওয়া সম্পর্কে আপনি যত্নবান হতে চাই।
tvanfosson

@ টিভানফসন আপনার মন্তব্যের জন্য ধন্যবাদ। আমি বুঝতে পারি যে এটি সাধারণ কৌশল নয় এবং যদি কেউ ঘটনাক্রমে ইভেন্ট শ্রোতাদের যুক্ত করে তবে এটি সমস্যার কারণ হতে পারে, তবে যদি এটি প্লাগইনটির নামে নামকরণ করা হয় তবে এটি খুব কমই সম্ভাবনা। পারফরম্যান্স সম্পর্কিত কোনও সমস্যা সম্পর্কে আমি জানি না, তবে কোডটি নিজেই অন্যান্য সমাধানগুলির চেয়ে আমার কাছে অনেক সহজ বলে মনে হচ্ছে, তবে আমি কিছু মিস করছি।
ইস্তভান উজ্জ্বল-ম্যাসেজেরোস

3

এখানে আমি আর্গুমেন্ট সহ সহজ প্লাগইন তৈরির পদক্ষেপগুলির পরামর্শ দিতে চাই।

(function($) {
  $.fn.myFirstPlugin = function(options) {
    // Default params
    var params = $.extend({
      text     : 'Default Title',
      fontsize : 10,
    }, options);
    return $(this).text(params.text);
  }
}(jQuery));

$('.cls-title').myFirstPlugin({ text : 'Argument Title' });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1 class="cls-title"></h1>

এখানে, আমরা ফাংশন paramsব্যবহার করে বিকল্পগুলির ডিফল্ট মান সেট করা এবং সেট করা ডিফল্ট অবজেক্ট যুক্ত করেছি extend। অতএব, যদি আমরা ফাঁকা যুক্তি পাস করি তবে এটি ডিফল্ট মান নির্ধারণ করবে অন্যথায় এটি সেট হয়ে যাবে।

আরও পড়ুন: কীভাবে JQuery প্লাগইন তৈরি করবেন


হাই গোপাল জোশী, দয়া করে পরবর্তী স্তরটির jquery প্লাগইন তৈরি করুন। আমরা আপনার প্রয়োজনীয় উত্তর আশা করি।
সার্থী কার্তিক

হ্যালো @SakthiKarthik, cource অফ আমি নতুন টিউটোরিয়াল শীঘ্রই আমার ব্লগে প্রকাশ করব
গোপাল জোশী

1
হাই @ শক্তিার্থিক, আপনি পরের স্তরের জেকারি
গোপাল জোশী

2

আর একবার চেষ্টা কর:

$.fn.extend({
"calendar":function(){
    console.log(this);
    var methods = {
            "add":function(){console.log("add"); return this;},
            "init":function(){console.log("init"); return this;},
            "sample":function(){console.log("sample"); return this;}
    };

    methods.init(); // you can call any method inside
    return methods;
}}); 
$.fn.calendar() // caller or 
$.fn.calendar().sample().add().sample() ......; // call methods

1

এটির আমার খালি-হাড়ের সংস্করণ এখানে। আগে পোস্ট করা পোস্টগুলির মতো, আপনি এই জাতীয় কল করবেন:

$('#myDiv').MessagePlugin({ yourSettings: 'here' })
           .MessagePlugin('saySomething','Hello World!');

অথবা সরাসরি উদাহরণটি অ্যাক্সেস করুন @ plugin_MessagePlugin

$elem = $('#myDiv').MessagePlugin();
var instance = $elem.data('plugin_MessagePlugin');
instance.saySomething('Hello World!');

MessagePlugin.js

;(function($){

    function MessagePlugin(element,settings){ // The Plugin
        this.$elem = element;
        this._settings = settings;
        this.settings = $.extend(this._default,settings);
    }

    MessagePlugin.prototype = { // The Plugin prototype
        _default: {
            message: 'Generic message'
        },
        initialize: function(){},
        saySomething: function(message){
            message = message || this._default.message;
            return this.$elem.html(message);
        }
    };

    $.fn.MessagePlugin = function(settings){ // The Plugin call

        var instance = this.data('plugin_MessagePlugin'); // Get instance

        if(instance===undefined){ // Do instantiate if undefined
            settings = settings || {};
            this.data('plugin_MessagePlugin',new MessagePlugin(this,settings));
            return this;
        }

        if($.isFunction(MessagePlugin.prototype[settings])){ // Call method if argument is name of method
            var args = Array.prototype.slice.call(arguments); // Get the arguments as Array
            args.shift(); // Remove first argument (name of method)
            return MessagePlugin.prototype[settings].apply(instance, args); // Call the method
        }

        // Do error handling

        return this;
    }

})(jQuery);

1

নিম্নলিখিত প্লাগইন-কাঠামোটি jQuery-data() ব্যবহার করে অভ্যন্তরীণ প্লাগইন-পদ্ধতি / -সেটিংসগুলিতে ( jQuery- চেনিবিলিটি সংরক্ষণের সময়) একটি সার্বজনীন ইন্টারফেস সরবরাহ করতে:

(function($, window, undefined) { 
  const defaults = {
    elementId   : null,
    shape       : "square",
    color       : "aqua",
    borderWidth : "10px",
    borderColor : "DarkGray"
  };

  $.fn.myPlugin = function(options) {
    // settings, e.g.:  
    var settings = $.extend({}, defaults, options);

    // private methods, e.g.:
    var setBorder = function(color, width) {        
      settings.borderColor = color;
      settings.borderWidth = width;          
      drawShape();
    };

    var drawShape = function() {         
      $('#' + settings.elementId).attr('class', settings.shape + " " + "center"); 
      $('#' + settings.elementId).css({
        'background-color': settings.color,
        'border': settings.borderWidth + ' solid ' + settings.borderColor      
      });
      $('#' + settings.elementId).html(settings.color + " " + settings.shape);            
    };

    return this.each(function() { // jQuery chainability     
      // set stuff on ini, e.g.:
      settings.elementId = $(this).attr('id'); 
      drawShape();

      // PUBLIC INTERFACE 
      // gives us stuff like: 
      //
      //    $("#...").data('myPlugin').myPublicPluginMethod();
      //
      var myPlugin = {
        element: $(this),
        // access private plugin methods, e.g.: 
        setBorder: function(color, width) {        
          setBorder(color, width);
          return this.element; // To ensure jQuery chainability 
        },
        // access plugin settings, e.g.: 
        color: function() {
          return settings.color;
        },        
        // access setting "shape" 
        shape: function() {
          return settings.shape;
        },     
        // inspect settings 
        inspectSettings: function() {
          msg = "inspecting settings for element '" + settings.elementId + "':";   
          msg += "\n--- shape: '" + settings.shape + "'";
          msg += "\n--- color: '" + settings.color + "'";
          msg += "\n--- border: '" + settings.borderWidth + ' solid ' + settings.borderColor + "'";
          return msg;
        },               
        // do stuff on element, e.g.:  
        change: function(shape, color) {        
          settings.shape = shape;
          settings.color = color;
          drawShape();   
          return this.element; // To ensure jQuery chainability 
        }
      };
      $(this).data("myPlugin", myPlugin);
    }); // return this.each 
  }; // myPlugin
}(jQuery));

এখন আপনি এই সিনট্যাক্সটি ব্যবহার করে প্লাগইন ডেটা বা সম্পর্কিত উপাদান অ্যাক্সেস বা সংশোধন করার জন্য অভ্যন্তরীণ প্লাগইন-পদ্ধতিগুলি কল করতে পারেন:

$("#...").data('myPlugin').myPublicPluginMethod(); 

যতক্ষণ আপনি myPublicPluginMethod()jQuery- শৃঙ্খলাবদ্ধতার আপনার প্রয়োগের অভ্যন্তর থেকে বর্তমান উপাদানটিকে (এটি) ফিরিয়ে দিন ততক্ষণ সংরক্ষণ করা হবে - সুতরাং নিম্নলিখিত কাজগুলি:

$("#...").data('myPlugin').myPublicPluginMethod().css("color", "red").html("...."); 

এখানে কয়েকটি উদাহরণ দেওয়া হয়েছে (বিশদটি এই ঝাঁকুনির জন্য দেখুন ):

// initialize plugin on elements, e.g.:
$("#shape1").myPlugin({shape: 'square', color: 'blue', borderColor: 'SteelBlue'});
$("#shape2").myPlugin({shape: 'rectangle', color: 'red', borderColor: '#ff4d4d'});
$("#shape3").myPlugin({shape: 'circle', color: 'green', borderColor: 'LimeGreen'});

// calling plugin methods to read element specific plugin settings:
console.log($("#shape1").data('myPlugin').inspectSettings());    
console.log($("#shape2").data('myPlugin').inspectSettings());    
console.log($("#shape3").data('myPlugin').inspectSettings());      

// calling plugin methods to modify elements, e.g.:
// (OMG! And they are chainable too!) 
$("#shape1").data('myPlugin').change("circle", "green").fadeOut(2000).fadeIn(2000);      
$("#shape1").data('myPlugin').setBorder('LimeGreen', '30px');

$("#shape2").data('myPlugin').change("rectangle", "red"); 
$("#shape2").data('myPlugin').setBorder('#ff4d4d', '40px').css({
  'width': '350px',
  'font-size': '2em' 
}).slideUp(2000).slideDown(2000);              

$("#shape3").data('myPlugin').change("square", "blue").fadeOut(2000).fadeIn(2000);   
$("#shape3").data('myPlugin').setBorder('SteelBlue', '30px');

// etc. ...     

0

এটি ব্যবহার করে আসলে "সুন্দর" উপায়ে কাজ করা যায় defineProperty। "দুর্দান্ত" এর অর্থ ()প্লাগইন নেমস্পেস ব্যবহার না করে বা স্ট্রিং দ্বারা ফাংশনটির নাম পাস না করে।

সামঞ্জস্যতা নীট: defineProperty আইই 8 এবং নীচের মতো প্রাচীন ব্রাউজারগুলিতে কাজ করে না। ক্যাভেট: $.fn.color.blue.apply(foo, args) কাজ করবে না, আপনার ব্যবহার করা দরকার foo.color.blue.apply(foo, args)

function $_color(color)
{
    return this.css('color', color);
}

function $_color_blue()
{
    return this.css('color', 'blue');
}

Object.defineProperty($.fn, 'color',
{
    enumerable: true,
    get: function()
    {
        var self = this;

        var ret = function() { return $_color.apply(self, arguments); }
        ret.blue = function() { return $_color_blue.apply(self, arguments); }

        return ret;
    }
});

$('#foo').color('#f00');
$('#bar').color.blue();

জেএসফিডাল লিংক


0

Jquery স্ট্যান্ডার্ড অনুযায়ী আপনি নিম্নলিখিত হিসাবে প্লাগইন তৈরি করতে পারেন:

(function($) {

    //methods starts here....
    var methods = {
        init : function(method,options) {
             this.loadKeywords.settings = $.extend({}, this.loadKeywords.defaults, options);
             methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
             $loadkeywordbase=$(this);
        },
        show : function() {
            //your code here.................
        },
        getData : function() {
           //your code here.................
        }

    } // do not put semi colon here otherwise it will not work in ie7
    //end of methods

    //main plugin function starts here...
    $.fn.loadKeywords = function(options,method) {
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(
                    arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not ecw-Keywords');
        }
    };
    $.fn.loadKeywords.defaults = {
            keyName:     'Messages',
            Options:     '1',
            callback: '',
    };
    $.fn.loadKeywords.settings = {};
    //end of plugin keyword function.

})(jQuery);

কিভাবে এই প্লাগইন কল?

1.$('your element').loadKeywords('show',{'callback':callbackdata,'keyName':'myKey'}); // show() will be called

তথ্যসূত্র: লিঙ্ক


0

আমি মনে করি এটি আপনাকে সাহায্য করতে পারে ...

(function ( $ ) {
  
    $.fn.highlight = function( options ) {
  
        // This is the easiest way to have default options.
        var settings = $.extend({
            // These are the defaults.
            color: "#000",
            backgroundColor: "yellow"
        }, options );
  
        // Highlight the collection based on the settings variable.
        return this.css({
            color: settings.color,
            backgroundColor: settings.backgroundColor
        });
  
    };
  
}( jQuery ));

উপরের উদাহরণে আমি একটি সহজ jquery হাইলাইট প্লাগইন তৈরি করেছিলাম I আমি একটি নিবন্ধ ভাগ করেছিলাম যাতে আমি কীভাবে আপনার নিজস্ব jQuery প্লাগইন তৈরি করতে বেসিক থেকে অগ্রিম সম্পর্কে আলোচনা করেছি । আমার মনে হয় আপনার এটি পরীক্ষা করা উচিত ... http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/


0

ডিবাগিংয়ের উদ্দেশ্যে সতর্কতা পদ্ধতি থাকার জন্য একটি ছোট প্লাগ-ইন নিম্নলিখিত। এই কোডটি jquery.debug.js ফাইলে রাখুন: জেএস:

jQuery.fn.warning = function() {
   return this.each(function() {
      alert('Tag Name:"' + $(this).prop("tagName") + '".');
   });
};

এইচটিএমএল:

<html>
   <head>
      <title>The jQuery Example</title>

      <script type = "text/javascript" 
         src = "http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>

      <script src = "jquery.debug.js" type = "text/javascript"></script>

      <script type = "text/javascript" language = "javascript">
         $(document).ready(function() {
            $("div").warning();
            $("p").warning();
         });
      </script> 
   </head>

   <body>
      <p>This is paragraph</p>
      <div>This is division</div>
   </body>

</html>

0

এখানে আমি এটি কীভাবে করছি:

(function ( $ ) {

$.fn.gridview = function( options ) {

    ..........
    ..........


    var factory = new htmlFactory();
    factory.header(...);

    ........

};

}( jQuery ));


var htmlFactory = function(){

    //header
     this.header = function(object){
       console.log(object);
  }
 }

-2

আপনি যা করেছেন তা মূলত নতুন পদ্ধতি দ্বারা jQuery.fn.messagePlugin অবজেক্টকে প্রসারিত করা । যা দরকারী তবে আপনার ক্ষেত্রে নয়।

আপনাকে এই কৌশলটি ব্যবহার করতে হবে

function methodA(args){ this // refers to object... }
function saySomething(message){ this.html(message);  to first function }

jQuery.fn.messagePlugin = function(opts) {
  if(opts=='methodA') methodA.call(this);
  if(opts=='saySomething') saySomething.call(this, arguments[0]); // arguments is an array of passed parameters
  return this.each(function(){
    alert(this);
  });

};

তবে আপনি যা চান তা আপনি অর্জন করতে পারেন যার অর্থ mean ("# মাইডিভ") করার একটি উপায় রয়েছে message ("# মায়াদিভ")। আমার বন্ধু সে লগিনগুলি নিয়ে লিখতে শুরু করেছিল এবং কীভাবে আপনার ক্রিয়াকলাপগুলির সাথে তাদের প্রসারিত করা যায় তা এখানে তার ব্লগের লিঙ্ক is

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