0

My question deals with the inheritance of this and how to potentially prevent the events this from overriding my functions this. So below is some sudo-code to help me explain. Basically I have events that are going to have to call other functions from my function, but the this keyword is overwritten by the event.

;(function($, window, document, undefined) {
    // default values for plugin
 var multiText = "multiText", defaults = {};

    function multiTextPlugin(element, options) {
  this.element                   = element;

  defaults['element']            = element;

  this.settings                  = $.extend({}, defaults, options);
  this._defaults                 = defaults;
  this._name                     = multiText;

        this.init();
    }

    $.extend(multiTextPlugin.prototype, {
        // initialization plugin
        init: function() {
         // Build Iniital HTML
         this.buildSVG();
         $(defaults.element).append(this.multiTextHTML('initial'));

         // store HTML for events
         defaults['html'] = this.multiTextHTML('');

         // addEvents
         this.addEvents();

        },

        buildSVG: function(){
         // create svg
         var svg = '<svg class="defs-only" xmlns="http://www.w3.org/2000/svg" width="0" height="0"><defs>';
         // define plus sign path
         svg += '<g id="plus"> <path class="plus" d="M11 5.75v1.5q0 .312-.22.53t-.53.22H7v3.25q0 .312-.22.53t-.53.22h-1.5q-.312 0-.53-.22T4 11.25V8H.75q-.312 0-.53-.22T0 7.25v-1.5q0-.312.22-.53T.75 5H4V1.75q0-.312.22-.53T4.75 1h1.5q.312 0 .53.22t.22.53V5h3.25q.312 0 .53.22t.22.53z" /> </g>';
         // define check path
         svg += '<g id="check"><path class="check" d="M13.055 4.422q0 .312-.22.53l-6.718 6.72q-.22.22-.53.22t-.532-.22l-3.89-3.89q-.22-.22-.22-.532t.22-.53l1.06-1.063q.22-.22.532-.22t.53.22l2.298 2.305L10.71 2.83q.22-.22.53-.22t.532.22l1.062 1.06q.22.22.22.532z" /></g>';
         // define close sign path
   svg += '<g id="close"><path class="close" d="M10.14 10.328q0 .312-.218.53L8.86 11.922q-.22.22-.53.22t-.532-.22L5.5 9.625 3.205 11.92q-.22.22-.53.22t-.532-.22L1.08 10.86q-.22-.22-.22-.532t.22-.53L3.377 7.5 1.08 5.203q-.22-.22-.22-.53t.22-.532l1.062-1.06q.22-.22.53-.22t.532.22L5.5 5.375 7.8 3.08q.22-.22.53-.22t.532.22l1.062 1.06q.22.22.22.532t-.22.53L7.625 7.5l2.297 2.297q.22.22.22.53z" /></g>';
   // close svg definitions
   svg += '</defs></svg>';

   $('body').append(svg);
        },

        multiTextHTML: function(objClass){
         var html = '<div class="multi-text-container '+objClass+'">';
           // build default button / checkbox
           html += '<label><input type="checkbox" class="default-choice-checkbox" value="first_checkbox">';
          html += '<span class="default-choice">';
          html += '<svg class="icon"><use xlink:href="#check"/></svg>';
          html += '</span></label>'
          // input text box
          html += '<input name="fieldSettings_choices_text" class="input-element" type="text" data-default="false">';
          // add button
          html += '<button name="add" class="add-choice" type="button" title="Add a choice."><svg class="icon"><use xlink:href="#plus"/></svg></button>';
          // remove button
     html += '<button name="remove" class="remove-choice" type="button" title="Remove this choice."><svg class="icon" viewBox="0 0 20 20"><use xlink:href="#close"/></svg></button>';
   html += '</div>';

   return html;
        },

        addEvents:function(){
         $('.default-choice-checkbox').click(this.defaultChoice);
            $('.add-choice').click(this.addNewMultiText);
            $('.remove-choice').click(this.removeThisMultiText);
        },

        removeEventListeners:function(){
         $('.default-choice-checkbox,  .add-choice, .remove-choice').unbind('click');
        },

        defaultChoice: function(){
            if(this.checked){
             $('.default-choice').addClass('active');
            } else {
             $('.default-choice').removeClass('active');
            }
        },

        addNewMultiText: function(event){
         var html = defaults.html;
         $(html).appendTo($(defaults.element));
         console.log(this);
          // How do I call the removeEventListeners function above Normally it would this.removeEventListeners 
          // here this is replaced by the event 
          
        },


        removeThisMultiText: function(event){
         $(this).parent().remove();
        },
    });

    // prevent multiple instantiations
    $.fn[multiText] = function(options) {
        return this.each(function() {
            if (!$.data(this, "plugin_" + multiText)) {
                $.data(this, "plugin_" +
                    multiText, new multiTextPlugin(this, options));
            }
        });
    };

})(jQuery, window, document);


$(function(){
    $('.multi-text-outerContainer').multiText({});
});
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}.defs-only{display:none}.multi-text-container{width:100%;float:left;margin-bottom:20px}.multi-text-container button,.multi-text-container input[type=checkbox]{border:1px solid #ccc;background:#eee;color:#333;padding:10px;float:left}.multi-text-container input[type="checkbox"]{display:none}.multi-text-container .default-choice{display:block;float:left;height:44px;padding:10px;border:1px solid #ccc;border-radius:5px 0 0 5px;margin:0;background:#eee;color:#6f6f6f}.multi-text-container .default-choice.active{background:#5cb85c;border:1px solid #357935;color:#163216}.multi-text-container input[type="text"]{float:left;padding:10px;height:44px;font-size:14px;width:200px}.multi-text-container .remove-choice{border-radius:0 5px 5px 0;margin:0;color:#fff;background:#d9534f;border:1px solid #a02622;color:#4c1210}.multi-text-container .add-choice{background:#5bc0de;border:1px solid #2390b0;color:#124a5b}.icon{display:inline-block;width:20px;height:20px;background-color:transparent;background-repeat:no-repeat;background-position:center;border:0;fill:currentColor}.check,.plus,.close{fill:currentColor;transform:scale(1.5)}.plus,.close{transform:translate(2px, 1.5px) scale(1.5)}
/*# sourceMappingURL=multiText.css.map */
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<div class="multi-text-outerContainer">
</div>
Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
David J. Davis
  • 906
  • 7
  • 20
  • You are aware that `defaults` is not instance-specific, but rather static? – Bergi Apr 04 '16 at 17:07
  • I don't see what this has to do with inheritance. – Bergi Apr 04 '16 at 17:08
  • I don't see how this is a duplicate, if you can point me to the duplicate I would look at it. – David J. Davis Apr 04 '16 at 17:15
  • the inherited this inside of the event isn't the same as the class. I need to know how to call my class functions from inside of the event since I can't use the this keyword anymore. – David J. Davis Apr 04 '16 at 17:16
  • 1
    I was able to figure it out, it was a duplicate didn't realize what i was looking for. Your link did help thank you @Bergi – David J. Davis Apr 04 '16 at 17:23
  • I apologize for the duplicate question as well. – David J. Davis Apr 04 '16 at 17:25
  • `this` is not inherited, it's a context set up by the call to the respective function. I was confused by your terminology :-) – Bergi Apr 04 '16 at 17:35
  • No need to apologize, it's our fault if you could not find the existing question easily :-) Of course it's hard when people don't exactly know what they are looking for. – Bergi Apr 04 '16 at 17:36

0 Answers0