完美有效的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()
期望子類方法只返回一個表單輸入元素。這很容易通過以下方式之一來解決,每個方法都有自己的問題:
- 重構所有內容。 問題:時間。努力。錢。
- 覆蓋子類中的
wrap_html_edit()
(其中一些已經做了,但出於更明智的原因),並將代碼複製到那裏,只更改最後一條語句。 問題:嚴重的代碼重複情況。 - 將成員變量添加到包含要指向標籤的ID的子類中。當它爲空時,標籤不會被創建。 問題:另一個成員變量,其他人不需要。
- 由於只有一個控件類出現此問題,因此請使用
get_class()
查詢當前類,如果匹配,則不要創建標籤。 問題:糟糕,不好的代碼味道。如果課程名稱發生變化怎麼辦或者,如果問題控制將被繼承? - 爲ID指定一個單選按鈕「is_special」。 問題:當用戶點擊標籤時,其中一個單選按鈕將被選中。這顯然不是用戶期望的。
- 將無線電按鈕包裹在某種不可見的其他控件中。 問題:什麼是無形控制?
<fieldset />
將需要一些CSS不可見。我不確定標籤是否可以指向任何不是表單控件的東西。如果可以,<div />
實際上是一個完美的解決方案。
所有這些解決方案都有其缺點。雖然排名第五,如果它是可行的,實際上是在這種特殊情況下非常貼合,但仍上漲了以下假設性的問題:
當你的頁面,以完全符合標準的唯一辦法就是寫一些醜陋的代碼(或重構所有內容),你會這樣做嗎?或者你會離開不適當的HTML並且贊成乾淨的代碼?
在目前的情況下,我會添加'id =「is_special」'屬性到關聯的'td'標籤,這將使html完全有效,非常合乎邏輯。 – Leri
我認爲你在這裏設置了一個錯誤的選擇。乾淨的代碼無法生成有效的HTML。這只是你的代碼不是它。 100%驗證是一個很好的目標,但它並不總是現實。 –
總是要遵守,那麼你也可以確保在各種瀏覽器上不會出現奇怪的改變/行爲。 – Brian