2010-12-14 51 views
2

這裏是我的CSS類:的JavaScript修改CSS類屬性,而只知道類的名字

.my-css-class-name 
{ 
    display: block; 
} 

而且我一個元素在我的網頁上使用這個類。我想修改這個元素的「顯示」屬性。
我很樂意通過獲取該元素的句柄,然後修改我需要的,但我不知道該元素的名稱 - 它是隨機生成的(這是第三方擴展)。

所以我想我必須得到「.my-css-class-name」的句柄並直接修改該屬性。
如何到達那裏,跨瀏覽器(主要的)解決方案?

編輯#1:
我正在尋找與新瀏覽器的兼容性。

+0

使用任何JavaScript框架? Jquery,Mootools等? – DeaconDesperado 2010-12-14 14:30:54

+0

它是以一種精心製作的正則表達式可以捕獲的方式隨機生成的嗎? – 2010-12-14 14:30:59

+0

@DeaconDesperado我不知道js框架,儘管我知道這個元素是由jQuery生成的。 – Poni 2010-12-14 14:38:06

回答

3

繼在評論你的反應,如果元素是由Jquery生成,那麼該庫很可能已安裝。您可以嘗試通過Jquery選擇它並更改require屬性。

$(document).ready(function(){  
$('.my-class-name').css('display', 'block'); 
}); 

用'block'代替你需要的任何設置。

如果包含jquery它應該做你想要的頁面加載。您也可以將其附加到其他事件。

$(document).ready(function(){ 
$('.my-class-name').click(classClicked); 
}) 

function classClicked(){ 
$(this).css('display','block') 
} 
+0

+1由於似乎已經安裝了jQuery,所以這是一條可行的路線,儘管您不一定認爲'$'與jQuery相關聯。爲了安全起見,我會使用完整的'jQuery'變量,或者將代碼包裝在'(function($){/ * jQuery code * /})(jQuery)中;' – user113716 2010-12-14 14:52:37

+0

+1 + A。好的想法,解決了我的問題。謝謝! – Poni 2010-12-14 15:08:35

+0

感謝您的幫助帕特里克,我經常忘記在發佈JQ時提及別名,因爲在框架主頁上的許多示例只是默認使用它。 – DeaconDesperado 2010-12-14 15:21:44

5

那麼,從理論上講,這很容易。

document.getElementsByClassName("my-css-class-name")[0].style.display = "something"; 

情況下你需要IE瀏覽器的兼容性:

/* 
    Developed by Robert Nyman, http://www.robertnyman.com 
    Code/licensing: http://code.google.com/p/getelementsbyclassname/ 
*/ 
var getElementsByClassName = function (className, tag/* "a","div",... */, elm/*parent*/){ 
    if (document.getElementsByClassName) { 
     getElementsByClassName = function (className, tag, elm) { 
      elm = elm || document; 
      var elements = elm.getElementsByClassName(className), 
       nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null, 
       returnElements = [], 
       current; 
      for(var i=0, il=elements.length; i<il; i+=1){ 
       current = elements[i]; 
       if(!nodeName || nodeName.test(current.nodeName)) { 
        returnElements.push(current); 
       } 
      } 
      return returnElements; 
     }; 
    } 
    else if (document.evaluate) { 
     getElementsByClassName = function (className, tag, elm) { 
      tag = tag || "*"; 
      elm = elm || document; 
      var classes = className.split(" "), 
       classesToCheck = "", 
       xhtmlNamespace = "http://www.w3.org/1999/xhtml", 
       namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null, 
       returnElements = [], 
       elements, 
       node; 
      for(var j=0, jl=classes.length; j<jl; j+=1){ 
       classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]"; 
      } 
      try { 
       elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null); 
      } 
      catch (e) { 
       elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null); 
      } 
      while ((node = elements.iterateNext())) { 
       returnElements.push(node); 
      } 
      return returnElements; 
     }; 
    } 
    else { 
     getElementsByClassName = function (className, tag, elm) { 
      tag = tag || "*"; 
      elm = elm || document; 
      var classes = className.split(" "), 
       classesToCheck = [], 
       elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag), 
       current, 
       returnElements = [], 
       match; 
      for(var k=0, kl=classes.length; k<kl; k+=1){ 
       classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)")); 
      } 
      for(var l=0, ll=elements.length; l<ll; l+=1){ 
       current = elements[l]; 
       match = false; 
       for(var m=0, ml=classesToCheck.length; m<ml; m+=1){ 
        match = classesToCheck[m].test(current.className); 
        if (!match) { 
         break; 
        } 
       } 
       if (match) { 
        returnElements.push(current); 
       } 
      } 
      return returnElements; 
     }; 
    } 
    return getElementsByClassName(className, tag, elm); 
}; 

getElementsByClassName("my-css-class-name")[0].style.display = "something"; 
+0

chrome + ie + ff? (即將檢查)。 – Poni 2010-12-14 14:41:07

+0

@Poni:Chrome + FF會接受一個簡單的'document.getElementsByClassName(「somenamehere」)' – thejh 2010-12-14 14:45:06

+0

使用jQuery,因爲它已經安裝anywy。不管怎麼說,還是要謝謝你! – Poni 2010-12-14 15:09:04

0

一些較新的瀏覽器支持document.getElementsByClassName開箱的。舊的瀏覽器不需要,你必須使用一個循環遍歷頁面元素的函數。

0

靈活的getElementsByClassName函數支持不支持本機函數的瀏覽器版本,因爲建議的jh可能是您正在尋找的。至少它會起作用。但是,對於您正在做的事情,查看document.styleSheets屬性可能很有用。通過這條路線,您可以直接更改CSS規則,如果它在不同瀏覽器中一致地工作,則會是更好的路線。不幸的是,在這方面的瀏覽器兼容性是遠遠一致,如下所示:http://www.quirksmode.org/dom/w3c_css.html

如果你仍然有興趣,看看這個問題:Changing a CSS rule-set from Javascript