2012-04-17 63 views
4

我從jQuery的1.3.2升級到1.6.4,並發現了一些東西,在現有的代碼不工作 -.attr()相關的東西在jquery升級1.3.2之後停止工作到1.6.4,還有什麼可以打破的?

  1. 禁用的東西 -

    $(selector).attr("disabled","");

  2. 察看單選按鈕是否檢查 -

    if($(selector).attr('checked'))

我檢查了版本發行版1.4,1.51.6的向後不兼容性,發現只提到了問題#2,但未提及上述問題#1。所以我擔心,像問題#1,我可以找到更多的問題與我現有的代碼。我想我錯過了http://blog.jquery.com/2011/05/03/jquery-16-released/的「數據屬性的案例映射」部分。請有人解釋一下。

來源 - Upgrading from jQuery 1.3.2 to jQuery 1.5 (or 1.4)

更新

我還與適當prop更換attr有點困惑。我已閱讀.prop() vs .attr()和其他一些問題。我到目前爲止所閱讀的任何地方,在大多數情況下,我都需要這樣做。但是哪些是少數情況呢?有人可以提供一些代碼示例或情況嗎?我如何在現有的代碼中找到這種情況?它提到我也看過https://stackoverflow.com/a/6057122/351903說 -

你真的需要小心的就是不整個應用程序

待辦事項混合相同屬性 使用的這些事情我現在需要將attr替換爲prop,以防這些線路工作正常嗎?

$(selector).attr("id") 

更新#2
假設在我現有的代碼,我有一個像下面幾行(我猜直接影響到UI控件的行爲或狀態),但目前還沒有檢查,看是否該元素被選中與否 -

這是有

$(selector).attr("checked","checked"); //setting 

但是,這是不是有

if($(selector).attr("checked")) //checking 

即使現在設置正在工作,我還應該在設置代碼中將attr更換爲prop嗎?

更新#3
有沒有從那裏我能得到某種屬性的列表,它直接影響到UI控件的某些屬性的一些地方?我仍然困惑於決定用什麼屬性來替換屬性。是否有其他人對這個jQuery版本感到相同,或者我只有一個:D?

更新#4
看起來,在這兩個版本之間的某處(1.3.2至1.6.4),jQuery的製作元素的選擇更加嚴格。

詳細
在模塊中,有以下HTML -

<div id="60table"> 
    <div> 
     <input type="CHECKBOX" id="60_1" value="1" name="data[reportsInfo][Campaign][2752]"> 
     <label for="60_1">23 apr new campaign 1</label> 
    </div> 
    <div> 
     <input type="CHECKBOX" id="60_2" value="1" name="data[reportsInfo][Campaign][2753]"> 
     <label for="60_2">23 apr new campaign 2</label> 
    </div> 
    <div> 
     <input type="CHECKBOX" id="60_3" value="1" name="data[reportsInfo][Campaign][2707]"> 
     <label for="60_3">2nd camp added</label> 
    </div> 
</div> 

與jQuery 1.3.2,下面回到投入的實際計數 -

$("#60table INPUT[type='checkbox']").length 

但是,現在與jQuery 1.6.4,上述返回0(請注意,輸入的位置像#60table> div>輸入,不直接在#60table下)。我必須做$("#60table").find("INPUT[type='checkbox']").length才能得到正確的號碼。

由於這個原因,下面的現有代碼停止升級後的工作,雖然我更換了attrprop - 在舊的代碼後,沒有更多的工作

$("#60table INPUT[type='checkbox']").attr('checked', $("#60").attr("checked")); //I replaced the attr by prop here 

所以,我仍然得到新問題升級。

把賞金
因爲 -

  • 元素選擇邏輯沒有更多的工作 -我不知道是否有可能是有些不工作更加規範。以更新4爲例,當輸入的位置是#60table > div > input時,選擇$("#60table INPUT[type='checkbox']")這樣的選擇是不正確的。如果是這樣,那麼我的項目中可能存在的其他一些常見錯誤可能已經打破。

  • 更好地解釋所有替換屬性與prop -我需要更清楚地區分何時使用prop替代attr,以及更多示例。按照喬恩的答案 -

如果它直接影響到UI控件使用 道具的行爲或狀態;否則使用attr。

我在哪裏可以得到某種屬性的列表的直接影響UI部件

+1

你應該用'.prop(「checked」,true)'替換'.attr(「checked」,「checked」)''。我不確定你的意思是「即使檢查正在工作」。 – Jon 2012-04-17 09:15:17

+0

對不起,我的意思是說即使設置正在工作 – 2012-04-17 09:19:53

回答

9

的問題是不相關的數據的情況下,映射屬性在所有的某些屬性,它只是由於屬性/屬性API的演變:

過去,jQuery並沒有在 屬性和屬性之間繪製清晰的線條。通常,DOM屬性表示從文檔中檢索到的DOM信息的狀態,例如標記中的 值屬性。 DOM 屬性表示文檔的動態狀態;例如,如果用戶點擊上面的輸入元素並鍵入def .prop(「value」)爲abcdef,但.attr(「value」)仍爲abc。

在大多數情況下,瀏覽器將屬性值作爲該屬性的初始值 ,但作爲託運或 禁用有異常語義布爾屬性等。

至於失蹤等相關重大的變動,這應該足以搜索你的代碼爲attr用途和使用prop適當更換;鑑於attr在大多數情況下傾向於使用,大多數呼叫通常應該被替換。

更新:讓我們定義適當

的核心思想是,元素具有HTML 屬性<input name="foo" disabled>具有的屬性iddisabled; id有一個值,而disabled沒有。其中一個屬性直接影響UI小部件的一個屬性,即瀏覽器呈現以表示此元素(從桌面應用程序控件的意義上說,輸入框已禁用)。所以經驗法則是:

如果它直接影響到UI控件使用prop的行爲或狀態;否則使用attr

在你提到的例子中,id是一個抽象數量,它不直接影響任何元素的行爲或狀態;因此您應該繼續使用attr

更新2:

我應該還是更換ATTR在設置代碼來支撐,即使 設置現在的工作?

是的,你應該因爲jQuery的文檔是這麼說的。正如您在問題中提到的那樣,混合propattr可能會導致問題行爲。

更新3:

有沒有從那裏我能得到某種 屬性的列表,它直接影響到UI控件的某些屬性的一些地方?我是 仍然有混淆決定哪些屬性取代attr prop。

不是。這裏適用的經驗法則是,如果某件事是布爾值,那麼prop很可能是訪問它的正確方法。

更新4:

看起來,在這兩個版本(1.3.2至1.6.4 ),jQuery的製造元件選擇用更嚴格的介於兩者之間。

它實際上是Sizzle,它負責解析匹配元素從選擇器(jQuery comes with Sizzle built-in)。我不知道變化的行爲會有什麼變化,但罪魁禍首是你的數字開頭的idThis is not valid HTML 4.01,但由於某種原因,它也會在Sizzle中發揮作用。解決方法很簡單:不要用數字開始id

,你發現了(兩個分手的選擇和使用.find)的其他解決方法是有效的,因爲在選擇的形式#id的特殊情況下,jQuery的directly callsgetElementById,而不是調用灒。

+0

感謝您的答案。請閱讀我的問題中的**更新**部分。 – 2012-04-17 08:22:31

+0

@SandeepanNath:更新了答案,看看。 – Jon 2012-04-17 09:00:16

+0

再次感謝。最後一個問題,現在我認爲可能是一個愚蠢的問題。請檢查**更新#2 **。 – 2012-04-17 09:08:26

1

要回答你的更新#4:

ID屬性should not start with digits

之所以$('#60table')作品是因爲裏面多數民衆贊成優化爲document.getElementById('#60table')通常工作在瀏覽器中,抗議下:)

的jQuery但是,當您開始使用組合表達式(例如$('#60table input[...]'))時,Sizzle引擎會運行,這會對其查詢使用更嚴格的規則。

希望有所幫助。

相關問題