2012-09-05 65 views
1

完美有效的HTML是好的,不僅因爲它對瀏覽器更好,而且因爲未通過驗證可能表示代碼有其他錯誤。因此,我盡我所能輸出完全有效並符合標準(X)的HTML。如今,在檢查我的網頁與validator,我發現了以下問題:有效的HTML或乾淨的代碼?

線84,列162:引用不存在的ID「is_special」

...在以下方面:

<tr> 
    <td> 
     <label for="is_special">Show in Special Offers:</label> 
    </td> 
    <td> 
     <input type="radio" id="is_special_1" name="is_special" value="1" /> 
     <label for="is_special_1">Yes</label> 
     <input type="radio" id="is_special_0" name="is_special" 
      value="0" checked="checked" /> 
     <label for="is_special_0">No</label> 
    </td> 
    <td> 
    </td> 
</tr> 

導致此謬論的代碼如下:

protected function wrap_html_edit ($_html) 
{ 
    $name = $this->name; 
    $eh_label = escape_html ($this->label); 
    if (isset ($this->validation_error)) 
     $eh_validation = '<div class="error">' . 
      escape_html ($this->validation_error) . '</div>'; 
    else 
     $eh_validation = ''; 
    return "<tr><td><label for=\"$name\">$eh_label:</label></td>" . 
      "<td>$_html</td><td>$eh_validation</td></tr>"; 
} 

實質上,此方法將HTML用於表單控件,並將其嵌入表格中。該方法屬於所有控件的父類,實際的HTML由子類的受保護方法生成。但是,wrap_html_edit()期望子類方法只返回一個表單輸入元素。這很容易通過以下方式之一來解決,每個方法都有自己的問題:

  1. 重構所有內容。 問題:時間。努力。錢。
  2. 覆蓋子類中的wrap_html_edit()(其中一些已經做了,但出於更明智的原因),並將代碼複製到那裏,只更改最後一條語句。 問題:嚴重的代碼重複情況。
  3. 將成員變量添加到包含要指向標籤的ID的子類中。當它爲空時,標籤不會被創建。 問題:另一個成員變量,其他人不需要。
  4. 由於只有一個控件類出現此問題,因此請使用get_class()查詢當前類,如果匹配,則不要創建標籤。 問題:糟糕,不好的代碼味道。如果課程名稱發生變化怎麼辦或者,如果問題控制將被繼承?
  5. 爲ID指定一個單選按鈕「is_special」。 問題:當用戶點擊標籤時,其中一個單選按鈕將被選中。這顯然不是用戶期望的。
  6. 將無線電按鈕包裹在某種不可見的其他控件中。 問題:什麼是無形控制? <fieldset />將需要一些CSS不可見。我不確定標籤是否可以指向任何不是表單控件的東西。如果可以,<div />實際上是一個完美的解決方案。

所有這些解決方案都有其缺點。雖然排名第五,如果它是可行的,實際上是在這種特殊情況下非常貼合,但仍上漲了以下假設性的問題:


當你的頁面,以完全符合標準的唯一辦法就是寫一些醜陋的代碼(或重構所有內容),你會這樣做嗎?或者你會離開不適當的HTML並且贊成乾淨的代碼?

+0

在目前的情況下,我會添加'id =「is_special」'屬性到關聯的'td'標籤,這將使html完全有效,非常合乎邏輯。 – Leri

+3

我認爲你在這裏設置了一個錯誤的選擇。乾淨的代碼無法生成有效的HTML。這只是你的代碼不是它。 100%驗證是一個很好的目標,但它並不總是現實。 –

+1

總是要遵守,那麼你也可以確保在各種瀏覽器上不會出現奇怪的改變/行爲。 – Brian

回答

0

標籤用於表單輸入元素。在這種情況下,您的第一個標籤不引用任何表單輸入元素。我將標籤轉換爲H4標籤。你可以改變它爲任何你想要的:

protected function wrap_html_edit ($_html) 
{ 
    $name = $this->name; 
    $eh_label = escape_html ($this->label); 
    if (isset ($this->validation_error)) 
     $eh_validation = '<div class="error">' . 
      escape_html ($this->validation_error) . '</div>'; 
    else 
     $eh_validation = ''; 
    return "<tr><td><h4>$eh_label:</h4></td>" . 
      "<td>$_html</td><td>$eh_validation</td></tr>"; 
} 
+0

標籤旨在管理重點。當用戶點擊標籤時,相應的表單控件獲得焦點並開始從鍵盤接收用戶輸入。大多數的孩子班級都會返回一個表格控件,並且標籤對這些控件很好。爲了有效的HTML,使用標題替換標籤會破壞該功能。 – Septagram

1

這是一個實用性的問題。我總是喜歡優秀的代碼(HTML),但是如果出現這種情況,那是不可能的,或者在約束條件下(如時間)不合理的情況,以及具有「壞」代碼的後果(如果有的話)很小,那麼它可能有意義忽略這個問題,至少目前是這樣。也許你可以稍後回來並解決它。