2010-01-12 10 views
69

Soy un usuario de jQuery bastante nuevo que busca extender un plugin jQuery existente que hace aproximadamente el 75% de lo que necesito. Intenté hacer mi tarea en esto. He comprobado las siguientes preguntas sobre stackoverflow:La mejor manera de extender un plugin de jQuery

he read up en el método de extender. Sin embargo, toda esta tarea me ha dejado confundido. Estoy trabajando con el complemento fullcalendar y necesito modificar algunos de los comportamientos, así como agregar nuevos ganchos para eventos. ¿Estoy atrapado en hacer esto en el cierre del complemento en sí? ¿Me estoy perdiendo algo obvio?

Lo ideal sería que pudiéramos separar nuestro código del código del complemento para permitir una posible actualización. Cualquier ayuda sería muy apreciada, especialmente sugerencias sobre dónde me falta información u opiniones sobre si las soluciones ya presentadas en otras preguntas sobre desbordamiento de pila tienen sentido. Para mí, se contradicen entre sí y todavía me siento confundido.

+0

justkt, ¿Se puede publicar un código de ejemplo de cómo se extendió el plugin fullcalendar? Actualmente estoy tratando de hacer lo mismo pero me estoy quedando perplejo y no puedo llamar a ninguna de las funciones que supuestamente agregué. –

+0

@MattMcCormick - ¿Intentó la respuesta aceptada que se detalla a continuación? – justkt

+0

Ah, estaba incluyendo .prototype. No lo necesitaba. Ahora solo tengo $ .extend (true, $ .fullCalendar, extensionMethods); ¡y funciona! Idealmente, me gustaría ampliar el objeto Evento, pero eso no es espacio de nombres, así que no veo cómo eso sería posible. Esto funciona por ahora sin embargo. –

Respuesta

79

yo sólo tenía el mismo problema al intentar extender plugins jQuery UI, y aquí está la solución que encontré (que se encuentra a través de jquery.ui.widget.js):

 

(function($) { 
/** 
* Namespace: the namespace the plugin is located under 
* pluginName: the name of the plugin 
*/ 
    var extensionMethods = { 
     /* 
     * retrieve the id of the element 
     * this is some context within the existing plugin 
     */ 
     showId: function(){ 
      return this.element[0].id; 
     } 
    }; 

    $.extend(true, $[ Namespace ][ pluginName ].prototype, extensionMethods); 


})(jQuery); 

esperanza que esta ayuda, por favor pregunte Si tienes alguna pregunta.

+2

Entonces, para aclarar, si quisiera extender la autocompleta de jQuery UI, entonces el 'Namespace' sería" ui "y el' pluginName' sería "autocompletar"? –

+1

Creo que respondí mi propia pregunta. Encontré en la fuente de autocompletar donde se llama a 'jQuery.widget (" ui.autocomplete ", ...)', y en el origen del widget donde se divide en ".", Donde el espacio de nombres es el índice 0 y el pluginName es el índice 1. En otras palabras, parece que tenía razón. :) –

+4

@Jared - Terminé tomando su consejo aquí para extender la autocompletar de jQuery UI. Describo mis objetivos aquí: http://www.matthuggins.com/articles/extending-jquery-uis-autocomplete-to-improve-success, y tengo el código completo aquí: https://github.com/mhuggins/ jquery-ui-autocomplete-consejos. Si tienes alguna sugerencia para mejorar, ¡me encantaría escucharlos! –

2
$.fn.APluginName=function(param1,param2) 
{ 
    return this.each(function() 
    { 
     //access element like 
     // var elm=$(this); 
    }); 
} 

// sample plugin 
$.fn.DoubleWidth=function() 
    { 
    return this.each(function() 
     { 
     var _doublWidth=$(this).width() * 2; 
     $(this).width(_doubleWidth); 
     }); 
    } 

//

<div style="width:200px" id='div!'>some text</div> 

// usando el plugin de encargo

$('#div1').DoubleWidth(); 

/// por encima de tipo escrito de utilidades suele trabajar de elementos DOM ////// ///////// utilidades personalizadas

(function($){ 
    var _someLocalVar; 
    $.Afunction=function(param1,param2) { 
    // do something 
    } 
})(jquery); 

// acceso por encima util como

$.Afunction(); 

// este tipo de utils generalmente extender javascript

+1

Eso no es lo que pregunta, pregunta si es mejor extender un plugin ya existente de una manera que permita actualizar el El plugin subyacente está usando como base al agregar la funcionalidad que quiere encima. – prodigitalson

3

he encontrado que con una gran cantidad de plugins los métodos están protegidos/privado (es decir, en el ámbito cierres) Si necesita modificar la funcionalidad de los métodos/funciones, entonces no tiene suerte a menos que esté dispuesto a hacerlo. Ahora bien, si no necesita cambiar ninguno de estos métodos/funciones, puede usar $.extend($.fn.pluginName, {/*your methods/properties*/};

Otra cosa que he acabado haciendo antes es simplemente usar el complemento como una propiedad de mi complemento en lugar de intentar extenderlo.

Lo que realmente se reduce a todo es cómo se codifica el complemento que desea extender.

+0

En la extensión principal, todo lo que quiero hacer, pero en algunos casos es agregar controladores de eventos a los elementos DOM creados dentro del complemento. En otros casos, debo anular el comportamiento dentro de los métodos existentes. Cuanto más leo, menos veo una manera limpia de hacer esto. ¿Algún otro pensamiento? – justkt

+0

Bueno, si esos métodos son los que están en la API pública (que no parecen ser) entonces podrías usar el método que mencioné arriba para reemplazar la definición de la función. Aparte de eso, no hay una manera limpia. Tendrás que bifurcarlo para tus usos y piratearlo. – prodigitalson

+2

@prodigitalson public * API;) – Nikhil

15

Tuve el mismo problema y vine aquí, luego la respuesta de Jared Scott me inspiró.

(function($) { 

    var fullCalendarOrg = $.fn.fullCalendar; 

    $.fn.fullCalendar = function(options) { 
     if(typeof options === "object") { 
      options = $.extend(true, options, { 
       // locale 
       isRTL: false, 
       firstDay: 1, 
       // some more options 
      }); 
     } 

     var args = Array.prototype.slice.call(arguments,0); 
     return fullCalendarOrg.apply(this, args); 
    } 

})(jQuery); 
1

Mi enfoque en la reescritura de plugins jQuery ha sido trasladar métodos y variables que necesitan ser visitada a las opciones de bloque y llamar a la 'extender'

// in the plugin js file 
$.jCal = function (target, opt) { 
    opt = $.extend({ 
     someFunctionWeWantToExpose: function() { 
      // 'this' refers to 'opt', which is where are our required members can be found 
     } 
    } 

    // do all sorts of things here to initialize 

    return opt; // the plugin initialisation returns an extended options object 
} 


////// elsewhere ///// 

var calendar = $("#cal1").jCal(); 
calendar.someFunctionWeWantToExpose(); 
1

ejemplo similar a la respuesta Jared Scott`s , pero haciendo una copia del objeto original prototipo da la posibilidad de llamar al método de los padres:

(function($) { 

    var original = $.extend(true, {}, $.cg.combogrid.prototype); 

    var extension = { 
     _renderHeader: function(ul, colModel) { 
      original._renderHeader.apply(this, arguments); 

      //do something else here... 
     } 
    }; 

    $.extend(true, $.cg.combogrid.prototype, extension); 

})(jQuery); 
0

jQuery Widget se puede ampliar usando jQuery Widget Factory.

(function ($) { 
    "use strict"; 

    define([ 
     "jquery", 
     "widget" 
    ], function ($, widget) { 
     $.widget("custom.yourWidget", $.fn.fullCalendar, { 
      yourFunction: function() { 
       // your code here 
      } 
     }); 

     return $.custom.yourWidget; 
    }); 
}(jQuery)); 

Salida jQuery Documentación para obtener más información:
Widget Factory API
Extending Widgets with the Widget Factory

Cuestiones relacionadas