2015-09-09 375 views
3

我有一個單擊功能的問題。我從jsfiddle.net創建了這個demojquery選項卡不工作

在這個演示中,你可以看到有微笑按鈕。當你點擊這些按鈕時,一個標籤將在那個時候打開。如果你點擊標籤區域的紅色按鈕,那麼標籤不起作用,出現問題。

任何人都可以幫助我這裏什麼是問題和解決方案是什麼?

該選項卡規範這樣的工作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' 
    }); 
}); 
}); 
+0

究竟是不是在這裏工作或者是什麼地方出了錯?不知道應該發生什麼。 –

+0

@LakmalCaldera請親愛的檢查演示,然後單擊一個微笑圖標,然後你看到選項卡區域,然後單擊TAB2,看看它不顯示'

b
' – innovation

+0

@LakmalCaldera我添加了問題標籤示例請檢查我嗎? – innovation

回答

2

updated and working version

我們要做的就是將目標移動到與圖標相同的水平(幾乎像標籤和內容)。取而代之的是:

<div class="emoticon"> 
    <div class="emoticon_click" data-id="1"> 
     <img src="http://megaicons.net/static/img/icons_sizes/8/178/512/emoticons-wink-icon.png" width="30px" height="30px"> 
      <div class="user-container" data-upgraded></div> 
    </div> 

</div> 

我們需要這個

<div class="emoticon"> 
    <div class="emoticon_click" data-id="1"> 
     <img src="http://megaicons.net/static/img/icons_sizes/8/178/512/emoticons-wink-icon.png" width="30px" height="30px"> 
      // not a child 
      <!--<div class="user-container" data-upgraded></div>--> 
    </div> 
    // but sibling 
    <div class="user-container" data-upgraded></div>  
</div> 

如果這是新的HTML的配置,我們可以改變處理器

  1. 目標點擊DIV "emoticon_click"
  2. 更改兄弟(非子)div「用戶容器」的內容

舊代碼被替換

$('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(""); 
}); 

現將此替代:

//$('body').on('click', '.emoticon', function(e) { 
$('body').on('click', '.emoticon_click', function(e) { 
    // clear all user container at the begining of this click event 
    $('body').find('.user-container').html(""); 

    // find id 
    var id = $(this).attr('data-id'); 

    // find the parent, which also contains sibling 
    // user-container 
    var parent = $(this).parent() 

    // let the target be initiated 
    showProfileTooltip($(parent), id); 
}); 

$(this).on("click", function() { 
    //$(this).find('.user-container').html(""); 
}); 

檢查它在action here

注:真有趣注意是在這Answer by pinturic

+1

非常感謝你的回答親愛的。我現在很開心。但如何通過點擊任何地方關閉div? – innovation

+0

親愛的Radim,'.user-container'永遠保持開放。如何在點擊其他區域時關閉它? – innovation

+0

那麼,你應該把事件掛在任何應該觸發該事件的元素上,但不要放在圖標或標籤上。這纔是重點。想象一下,你有區域「頭」(圖標和標籤)和「身體」下面...所以下面的部分應該有該事件點擊...它有幫助嗎?換句話說......你的方法並不是那麼糟糕。真的不。除了...事件點擊不能也在圖標和標籤本身... –

1

我一直在調試代碼,這是結果:

要添加在「標籤」;任何時候,你該div這個代碼攔截它內點擊:

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

,因此「標籤」從頭開始重新建造。

2

如果我們想用的功能,延長the first and complete answer:如果單擊該選項卡或圖標

的區域之外

關閉所有標籤

,我們只需要

  • 加一些事件,例如身體
  • ,做檢查,如果點擊是不是「.emoticon」類元素

a working example,包含此掛鉤:

$('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(""); 
});