Ich habe ein Problem mit der Klickfunktion. Ich habe diese Demo von jsfiddle.net erstellt.

In dieser Demo sehen Sie, dass es Smile-Buttons gibt. Wenn Sie auf diese Schaltflächen klicken, wird zu diesem Zeitpunkt eine Registerkarte geöffnet. Wenn Sie im Registerkartenbereich auf die rote Schaltfläche klicken, funktioniert die Registerkarte nicht. Es ist ein Fehler aufgetreten.

Jeder kann mir hier helfen, was ist das Problem und was ist die Lösung?

Die Registerkarte ist wie folgt normalisiert: Demo

var response = '<div class="icon_b">
            <div class="clickficon"></div>
                <div class="emicon-menu MaterialTabs">
                    <ul>
                        <li class="tab active"><a href="#starks-panel1"> TAB1</a></li>
                        <li class="tab"> <a href="#lannisters-panel1"> TAB2</a></li>
                        <li class="tab"> <a href="#targaryens-panel1"> TAB3</a><span></span></li>
                    </ul>
                    <div class="panels">
                        <div id="starks-panel1" class="panel pactive"> a </div> 
                        <div id="lannisters-panel1" class="panel"> b </div>
                        <div id="targaryens-panel1" class="panel"> c </div>
                    </div>
                </div>
            </div>';

$(document).ready(function () {

    function showProfileTooltip(e, id) {
        //send id & get info from get_profile.php 
        $.ajax({
            url: '/echo/html/',
            data: {
                html: response,
                delay: 0
            },
            method: 'post',
            success: function (returnHtml) { 
                e.find('.user-container').html(returnHtml).promise().done(function () {
                    $('.emoticon').addClass('eactive');
                });
            }
        });

    }
    $('body').on('click', '.emoticon', function(e) {
    var id = $(this).find('.emoticon_click').attr('data-id');
    showProfileTooltip($(this), id);
});
    $(this).on( "click", function() {
  $(this).find('.user-container').html("");
});
var componentHandler = function() {
  'use strict';

  var registeredComponents_ = [];
  var createdComponents_ = [];

  function findRegisteredClass_(name, opt_replace) {
    for (var i = 0; i < registeredComponents_.length; i++) {
      if (registeredComponents_[i].className === name) {
        if (opt_replace !== undefined) {
          registeredComponents_[i] = opt_replace;
        }
        return registeredComponents_[i];
      }
    }
    return false;
  }

  function upgradeDomInternal(jsClass, cssClass) {
    if (cssClass === undefined) {
      var registeredClass = findRegisteredClass_(jsClass);
      if (registeredClass) {
        cssClass = registeredClass.cssClass;
      }
    }

    var elements = document.querySelectorAll('.' + cssClass);
    for (var n = 0; n < elements.length; n++) {
      upgradeElementInternal(elements[n], jsClass);
    }
  }

  function upgradeElementInternal(element, jsClass) {
    if (element.getAttribute('data-upgraded') === null) {
      element.setAttribute('data-upgraded', '');
      var registeredClass = findRegisteredClass_(jsClass);
      if (registeredClass) {
        createdComponents_.push(new registeredClass.classConstructor(element));
      } else {
        createdComponents_.push(new window[jsClass](element));
      }
    }
  }

  function registerInternal(config) {
    var newConfig = {
      'classConstructor': config.constructor,
      'className': config.classAsString,
      'cssClass': config.cssClass
    };

    var found = findRegisteredClass_(config.classAsString, newConfig);

    if (!found) {
      registeredComponents_.push(newConfig);
    }

    upgradeDomInternal(config.classAsString);
  }

  return {
    upgradeDom: upgradeDomInternal,
    upgradeElement: upgradeElementInternal,
    register: registerInternal
  };
}();




function MaterialTabs(element) {
  'use strict';
  this.element_ = element;
  this.init();
}

MaterialTabs.prototype.Constant_ = {
  MEANING_OF_LIFE: '42',
  SPECIAL_WORD: 'HTML5',
  ACTIVE_CLASS: 'pactive'
};
MaterialTabs.prototype.CssClasses_ = {
  SHOW: 'materialShow',
  HIDE: 'materialHidden'
};

MaterialTabs.prototype.initTabs_ = function(e) {
  'use strict';
  this.tabs_   = this.element_.querySelectorAll('.tab');
  this.panels_ = this.element_.querySelectorAll('.panel');
  for (var i=0; i < this.tabs_.length; i++) {
    new MaterialTab(this.tabs_[i], this); 
  }
};

MaterialTabs.prototype.resetTabState_ = function() {
  for (var k=0; k < this.tabs_.length; k++) {
    this.tabs_[k].classList.remove('pactive');
  }  
};

MaterialTabs.prototype.resetPanelState_ = function() {
  for (var j=0; j < this.panels_.length; j++) {
    this.panels_[j].classList.remove('pactive');
  } 
};

function MaterialTab (tab, ctx) {  
  if (tab) {
    var link = tab.querySelector('a');

    link.addEventListener('click', function(e){
      e.preventDefault();
      var href = link.href.split('#')[1];
      var panel = document.querySelector('#' + href);
      ctx.resetTabState_();
      ctx.resetPanelState_();
      tab.classList.add('pactive');
      panel.classList.add('pactive');
    });   

  }
};


MaterialTabs.prototype.init = function() {
  if (this.element_) {
    this.initTabs_();
  }
}


window.addEventListener('load', function() {
  componentHandler.register({
    constructor: MaterialTabs,
    classAsString: 'MaterialTabs',
    cssClass: 'MaterialTabs'
  });
});
});
3
innovation 9 Sept. 2015 im 17:03

2 Antworten

Ich habe Ihren Code debuggt und dies ist das Ergebnis:

Sie fügen die "Registerkarte" unter hinzu. Jedes Mal, wenn Sie in dieses Div klicken, fängt dieser Code es ab:

$('body').on('click', '.emoticon', function(e) {       
    var id = $(this).find('.emoticon_click').attr('data-id');
    showProfileTooltip($(this), id);
});

Und so werden die "tab" wieder von Grund auf neu aufgebaut.

1
pinturic 9 Sept. 2015 im 15:11

Wenn wir die erste und vollständige Antwort um eine Funktion erweitern möchten:

Schließen Sie alle Registerkarten, wenn Sie außerhalb des Bereichs der Registerkarten oder Symbole klicken

Wir müssen nur

  • füge ein Ereignis hinzu, z. zum Körper
  • und überprüfen Sie, ob der Klick nicht auf Klassenelemente ".emoticon" war

Es gibt ein Arbeitsbeispiel, das diesen Hook enthält:

$('body').on( "click", function(e) {
    // if clicked in the EMOTICON world... 
    var isParentEmotion = $(e.toElement).parents(".emoticon").length > 0 ;
    if(isParentEmotion){
        return; // get out
    }
    // else hide them
    $('body').find('.user-container').html("");
});
2
Community 23 Mai 2017 im 11:52