2011-06-12 73 views
1

我正在尋找更改某些表格標題的方法。其中一些標題包含額外的HTML代碼,如換行符。更改表格標題

這是表中的頁面(頁面源)的典型設置:

<table class="awesometable" style="width: 100%; margin-right: 0;"> 
    <tr> 
     <th style="background: red; color: white;">Male<br /> contestant</th> 
     <th style="background: red; color: white;">Female<br /> contestant</th> 
    </tr> 
</table> 

Male<br /> contestantFemale<br /> contestant(以及一系列其它輕微的變化的)應當被改變成簡單的符號等

使用document.body.innerHTML.replace()用新節點替換整個DOM,這是不受歡迎的,並且還可以更改其他實例,即表頭中的文本也是純文本,並且不應該更改,儘管這很少見,只是一個小問題。

使用選擇性nodeType == 3在附加換行符上失敗。

歡迎任何想法,代碼示例(在這裏或在,例如,jsfiddle)總是首選。謝謝。

+2

使用'在表頭元素上的innerHTML'只有... – 2011-06-12 18:39:31

+1

@Felix'innerHTML'在表格中有(yup,你猜對了)IE的問題。 http://www.quirksmode.org/dom/w3c_html.html#t03 – 2011-06-12 18:53:58

+0

@Matt:據我所知,這只是一個問題,當你想添加或刪除表中的行。應該可以更換單元格的文本(雖然沒有經過測試)。 – 2011-06-12 18:57:48

回答

2

我建議使用jQuery只是因爲它是如此多的友好與DOM的時候。還要注意,它可能稍微快一點 - 如果你有一張大桌子,這可能很重要 - 在完成對字符串的所有操作之前,不要指定innerHTML。即將innerHTML的值存儲在一個變量中,運行replace函數,然後將結果放回innerHTML。 (請注意,我將用<br>替換<br />。至少在Chrome中,innerHTML會將XHTML封閉的單個標記轉換爲有效的HTML,這裏是<br>。)

這裏有一個更具擴展性的方法(jsFiddle Example):

var replacements = [ 
    ["Male<br>contestant", "♂"], 
    ["Female<br>contestant", "♀"] 
]; 

function runReplacement() { 
    $(".awesometable th").each(function() { 
    var $this = $(this); 
    var ih = $this.html(); 
    $.each(replacements, function(i, arr) { 
     ih = ih.replace(arr[0], arr[1]); 
    }); 
    $this.html(ih); 
    }); 
} 

除了上面,你可以只忽略每個單元的<br>部分使用.text()代替.html()(如更換「Malecontestant」,而不是「男性<br>參賽者」)。 Example here

編輯:

以及用於校正的例子如下:

var headers = document.getElementsByTagName("th"); 
for (var i = 0; i < headers.length; i++) { 
    headers[i].innerHTML = headers[i].innerHTML.replace("Male<br>contestant", "♂") 
          .replace("Female<br>contestant", "♀"); 
} 

對於愚蠢等着眼於簡潔(70個字符短,忽略多餘的空白):

$("th").each(function(){$(this).html($(this).html() 
.replace("Male<br>contestant","♂").replace("Female<br>contestant","♀"));}); 
+0

你意識到jQuery的* html()*方法只是innerHTML(如Alex所建議的)?而Headshota的答案是在4行代碼中完成的? – RobG 2011-06-12 22:44:17

+1

@RobG在jQuery上,我推薦它,因爲他可能使用DOM。此外,問題內容決定了魔術字符串的數組,因此將其聲明爲最高。此外,jQuery的'html()'assign會移除元素節點 - 這是一個問題 - 並處理空白。無論如何,我假設你已經意識到'innerHTML.replace'不會爲'innerHTML'分配任何東西(它只是替換字符串,但沒有什麼可以捕獲結果)。而且JavaScript不使用字符串連字符。而'innerHTML'則將XHTML單一標籤轉換爲HTML對應標籤(例如'
#=>
'')。 – brymck 2011-06-12 23:54:47

+0

Bryan - 如果您爲jQuery的html()提供了一個字符串,它將**通過爲其innerHTML屬性指定一個新值來更改該節點的innerHTML - 讀取代碼(第1.6.1行中的第5649行)。它所做的唯一的任何後果它包裝它try..catch中,如果失敗,刪除所有內容*然後*設置innerHTML屬性。 – RobG 2011-06-13 05:54:04

1

試試這個:

var headers = document.getElementsByTagName('th'); 
    headers[0].innerHTML = '&#x2642;'; 
    headers[1].innerHTML = '&#x2640;'; 

顯示概念。最好給各個單元格分配一個id或class來標識它們,而不是使用內容。你也可以這樣做:

var cell, headers = document.getElementsByTagName('th'); 

    for (var i=0, iLen=headers.length; i<iLen; i++) { 
    cell = headers[i]; 

    if (cell.innerHTML.match('Male')) { 
     cell.innerHTML = '&#x2642;'; 
    } 
     else if (cell.innerHTML.match('Female')) { 
     cell.innerHTML = '&#x2640;'; 
    }  
    } 
+0

-1?那很好笑!這是所有答案中最簡單,最快速的答案,不需要圖書館。無論如何,從我+1。 – RobG 2011-06-12 22:39:27

+1

它也不起作用。 – brymck 2011-06-12 23:55:51

+0

布賴恩我不能幫助你沒有詳細的信息。什麼不工作,你有任何錯誤? – Headshota 2011-06-13 05:29:08

1

什麼東西的問題,像

function replace(text) 
{ 
    return text.replace('Male', '♂').replace('Female', '♀'); 
} 

var ths = document.getElementById('myTable').getElementsByTagName('th'), 
    i = ths.length, 
    th, text; 
while (i-- && (th = ths[i], text = th.innerText)) 
{ 
    if (text) 
    { 
     // IE, Safari, Chrome, Opera 
     th.innerText = replace(text); 
    } 
    else 
    { 
     // Everything but IE <9 
     th.textContent = replace(th.textContent); 
    } 
} 

按照要求,的jsfiddle:http://jsfiddle.net/mattball/4EwGt/

是,innerText || textContent是一個PITA。


我要更換整個頭部,Male<br /> contestantFemale<br /> contestant,不只是第一個字,並嘗試全在你的榜樣不起作用。似乎只刪除換行符,不改變文本。

使用該替換功能來代替:

function replace(text) 
{ 
    return text.replace('Male\ncontestant', '♂') 
     .replace('Female\ncontestant', '♀'); 
} 

演示:http://jsfiddle.net/mattball/8W3cM/

+0

我想要替換整個標題「男性
參賽者」和「女性
參賽選手」,而不僅僅是第一個單詞,並且在您的示例中嘗試整體不起作用。似乎只刪除換行符,不改變文本。 – Oroboros 2011-06-12 19:13:45

+0

看我的編輯。它絕對適用於Chrome,但我不確定IE是否會將'
'轉換爲'innerText'中的'\ n'。 – 2011-06-12 19:17:16

+0

在Chrome中確實有效,在Safari中不起作用,這很奇怪。無論如何,Bryan的代碼也適用於Safari。謝謝。 – Oroboros 2011-06-12 19:29:00