2010-03-25 67 views
3

我想清理我的xhtml驗證 - 我通過W3C驗證器運行我的頁面。對於一些莫名其妙的原因,它不是通過輸入字段具有自動完成=「關閉」屬性:autocomplete屬性未通過XHTML 1.0過渡驗證,爲什麼?

<input name="kwsearch" id="sli_search_1" type="text" autocomplete="off" onfocus="if(this.defaultValue==this.value) this.value='';" 
      onblur="if(this.value=='')this.value=this.defaultValue;" class="searchbox" value="Search" /> 

我使用這個文檔類型:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 

而這正是驗證錯誤:

410行81列:沒有屬性「自動完成」

... li_search_1「type =」text「autocomplete =」off「onfocus =」if(this.defaultValue == thi ...

我認爲W3C可以這麼做 - 但是,也許它仍然處於「提交」階段? http://www.w3.org/Submission/web-forms2/#autocomplete

想法?

回答

5

Web窗體規範與HTML 4/XHTML無關。可惜的是,autocomplete不會通過驗證。

我認爲在關閉自動完成的情況下實現有效的HTML 4/XHTML的唯一方法是使用JavaScript在頁面加載時添加屬性。糟透了,我知道 - 但我認爲這是唯一的方法。

+0

頁面加載是否足夠早,以便瀏覽器尚未填寫表單呢?我記得閱讀一篇關於動態添加'autocomplete'的文章,不幸的是我不記得結論是什麼。 – Boldewyn 2010-03-25 14:47:47

+0

@Boldewyn該死的好問題!共識似乎在DOMLoad,至少根據這個:http://avatraxiom.livejournal.com/97999.html – 2010-03-25 14:58:34

1

W3C鏈接是用於Web表單的東西,而不是核心XHTML。有可能爲Web表單拉入額外的DTD並獲取頁面進行驗證。

5

自動完成是HTML5 attribute,因此如果您需要它,請使用HTML5文檔類型聲明。

+0

沒錯,Web窗體2.0已被納入HTML5! – 2011-04-18 21:19:17

+0

或者,如果您發送的是'application/xhtml + xml'(XHTML5),則根本不需要文檔類型! – Hawken 2013-11-02 05:46:13

0

如果你需要自動完成(瀏覽器都支持它),然後嘗試在這個XHTML 1.1以下擴展您的文檔類型,如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [ <!ATTLIST form autocomplete (on|off) #IMPLIED> ]>

0

我只是撞壞了對瀏覽器和之間的這種衝突的刺激性標準。我最終通過運行javascript on the page,而不是等待window.onLoad$(document).ready()繞過它,將屬性添加到類no-browser-autocomplete的所有元素。然後我通過我的應用程序刪除autocomplete="off"並添加此類。

很明顯,在沒有運行javascript的瀏覽器環境中,這會失敗。

我在頁面而不是dom就緒塊中執行它的原因是,如果您等待dom準備好,瀏覽器已經自動完成它,至少在Firefox中(我正在測試它) 。

所以,這是在我的應用程序佈局的JavaScript文件包括我的一個開始:

//this needs to run BEFORE all of the loaded/ready events fire, that's why it's not in the dom.ready function 
$(".no-browser-autocomplete").attr("autocomplete", "off"); 

$(function(){ 
    //dom ready 
});