2014-04-05 163 views
0

你好,我有一個菜單,我想刪除活動的類,並將其添加到我單擊的元素....這是我的想法,但它不能很好地工作...動態添加/刪除類

<div id="header2"> 
      <div class="menu"> 
       <ul> 
        <li id="menu_1" onclick="abrirPag('home.html')">Home</li> 
        <li id="menu_2" onclick="abrirPag('calendario_2014.html')">Calendário</li> 
        <li id="menu_3" onclick="abrirPag('classificacao_2014.html')">Classificação</li> 
        <li id="menu_4" onclick="abrirPag('equipes_2014.html')">Equipes</li> 
        <li id="menu_5" onclick="abrirPag('recordes.html')">Recordes</li> 
        <li id="menu_6" onclick="abrirPag('regulamento_2014.html')">Regulamento</li> 
       </ul> 
      </div> 
     </div> 

的Onload函數對類活性添加到第一個項目:

window.onload=function() { 
var containermenu = document.getElementById("header2"); 
var navitemmenu = containermenu.querySelector(".menu ul li"); 
var identmenu = navitemmenu.id.split("_")[1]; 
navitemmenu.parentNode.setAttribute("data-current",identmenu); 
navitemmenu.setAttribute("class","active"); 

函數來改變類:

function abrirPag(valor){ 
var currentmenu = this.parentNode.getAttribute("data-current"); 
document.getElementById("menu_" + currentmenu).removeAttribute("class"); 
var identmenu = this.id.split("_")[1]; 
this.setAttribute("class","tabActiveHeader"); 
this.parentNode.setAttribute("data-current",identmenu); 

當我點擊任何元素時出現以下錯誤:「Uncaught TypeError:無法調用方法'getAttribute'undefined」

有人可以幫助我嗎?

+0

@Teemu我收回我的建議。我很抱歉。 – Jonn

回答

1

內聯處理函數中的this值將是window對象而不是元素。您需要通過this才能獲得該功能。

<li id="menu_1" onclick="abrirPag(this, 'home.html')">Home</li> 

然後引用它作爲第一個元素。

function abrirPag(elem, valor){ 
    var currentmenu = elem.parentNode.getAttribute("data-current"); 
    document.getElementById("menu_" + currentmenu).className = ""; 
    var identmenu = elem.id.split("_")[1]; 

    elem.className = "tabActiveHeader"; 
    elem.parentNode.setAttribute("data-current",identmenu); 
} 

我也改變它使用.className屬性,而不是.get/setAttribute()用於獲取和設置的類。

+0

感謝一個贓物餅乾!工作很棒! – pradorod

2

您可以使用DOM班級列表添加刪除類

var element = document.getElementById("someId"); 
//Use add to add a class 
element.classList.add("active"); 
//use remove to remove a class 
element.classList.remove("active"); 

您將需要一個polyfill把它用在IE < 10和一些上了年紀的瀏覽器版本。

從所有其他菜單中刪除,並添加到當前做的餅乾怪獸建議,也元素傳遞給你的函數

function abrirPag(ele,valor){ 
    var current = document.getElementsByClassName("tabActiveHeader"); 
    if(current[0]){ 
     current[0].classList.remove("tabActiveHeader"); 
    } 
    ele.classList.add("tabActiveHeader"); 
} 
+0

夫婦筆記。 'if(current)'將始終爲'true',因爲'gEBCN'將始終返回一個集合。此外,當您從用於匹配它的元素中刪除類時,返回的集合將被重新索引。如果總是隻有一個這樣的元素*(這意味着它可能是一個ID)*它會沒事的,儘管'break'會很好。如果該類可以有多個,則可能會出現問題。 –

+0

...但帶有polyfill鏈接的'.classList'爲+1。 –

+0

哦沒有事件想想 –

-1

這是一個技巧:使用jQuery,你將有一個更容易的生活:

$("#header2 .menu li a").on("click", function(e) { 
    e.preventDefault(); 
    var index = $("#header2 .menu li a").index(this); 
    $("#header2 .menu li a").removeClass("active").parent().parent().data("current", index); 
    $(this).addClass("active"); 
    $(".content").text($(this).attr("href")); 
}); 

this Fiddle I've created看看!

+1

這裏有一個提示。不要建議緩慢,臃腫的代碼庫來解決簡單的問題。 –

+1

不久前,我對[此鏈接]回覆了一個「use-jQuery」評論(http://meta.stackexchange.com/questions/45176/when-is-use-jquery-not-a-valid-answer-一個JavaScript問題)...我的意思是,這些在這裏提出問題的人很可能是爲生活編碼,他們有時間表和老闆呼吸脖子,沒有時間學習使用整個圖書館,只是爲了完成一個簡單的任務。在帖子中有一個嘗試的解決方案,爲什麼不只是修復它的錯誤,然後,也許作爲獎金,提供一些完全不同的解決方案... – Teemu

+0

首先,他是巴西人,我也是,所以我正在開發一種新的個人足球的網站,從頭開始,我給他一個提示,使用最常用的庫來做這件事,所以他會清理很多他的代碼。我沒有說「使用jQuery」,除此之外,我已經爲他創建了一個代碼,並且如果他喜歡,他也可以用它來玩這個代碼。這不是一個簡單的問題,不幸的是,在純JavaScript跨瀏覽器中使用class屬性並不那麼簡單。我是一個Javascript迷,如果你看到我的答案,我通常會製作純JavaScript代碼來幫助這些人。但在特定情況下(...) – Buzinas