2012-09-03 154 views
1

我在html中有一個冗長的表單,有些<input>有一個叫dependancy的類。我有一個使用jQuery來選擇<form>元素的函數。像這樣:jquery .not()不是從jquery中刪除元素對象

form = module.find('#formContainer').find('form'); 

form現在包含一個HTML,我已確保它包含它通過輸出form到控制檯。現在,我想刪除form中的類別dependancy中包含的一些元素。我想我可以使用jQuery的。不是()像這樣:

disabledFormElements = form.find('.dependency'); 
cleanForm = form.not(disabledFormElements); 

當我輸出disabledFormElements到控制檯,它只顯示我想刪除的元素。唉,類dependancy的元素不會從form中刪除。根據jQuery文檔,您可以將各種類型傳遞給.not()方法,並且它應該可以工作。爲什麼.not()函數不能從jQuery form中刪除元素?

我加入HTML表單,使之更加明確:

<div id="formContainer"> 

<form id="customText" accept-charset="UTF-8"> 
    <div class="row equal-field-heights"> 
    <div class="four columns"> 
     <fieldset> 
     <legend>Is this for a Bar or Bat Mitzvah?</legend> 
    <div class="four columns"> 
     <label for="radio1"> 
     <input class="dependency" name="gender" type="radio" id="radio1" value="m" checked onclick="changeGender('m')">Bar 
     </label> 

    </div> 

    <div class="four columns"> 
    <label for="radio2"> 
    <input class="dependency" name="gender" type="radio" id="radio2" value="f" onclick="changeGender('f')">Female 
    </label> 
    </div> 

    <input type="hidden" name="as_he_she_steps" id="as_he_she_steps" value="he steps" /> 
    . 
    . 
    . 
    . 
</form> 
</div> 
+0

你想實際從DOM('remove()')中刪除元素,還是隻從jQuery對象('not()')中排除它們的引用? –

+0

從jQuery對象中排除它們的引用。我不關心DOM。謝謝。 – ariestav

+0

@Frederic由於某種原因你的答案現在缺席?我看到他們,但現在他們消失了。 – ariestav

回答

1

你的誤解是這樣的:

form = module.find('#formContainer').find('form'); 

創建一個只包含實際form元素,而不是他們的後裔/孩子一個jQuery對象。如果formContainer中只有一個表單對象,那麼這個jQuery對象只包含一個DOM元素。

因此,當您嘗試從.not()中刪除項目時,jQuery對象中的任何內容都不會被匹配,因此不會刪除任何內容。

如果你想包含表單中的所有對象jQuery對象,你可以這樣做:

form = module.find("#formContainer form *"); 

而且,如果你想然後刪除匹配類的所有項目,你可以這樣做:

form = module.find("#formContainer form *").not(".dependancy"); 
+0

是的,你是對的。它只是檢索一個DOM元素。我使用該代碼選擇表單,因爲最終在我的腳本中,我將一個方法應用於名爲.serializeObject()的元素,該元素將序列化表單。但是我不希望它序列化那些是特定類的元素。 – ariestav

+0

@ariestav - 如果序列化代碼只需要父表單元素,那麼在調用序列化之前,您必須從DOM中物理刪除'.dependancy'元素,否則必須修改序列化以跳過所需的元素。您無法按照您嘗試的方式修復它。將來,在你的問題中描述你真正的問題要好得多,所以我們一定會幫你解決的。 – jfriend00

+0

感謝您的建議。你是對的,並且請接受我的道歉,因爲首先不清楚。 – ariestav

0

你應該使用這個除了.dependancy類元素來選擇。

cleanForm = form.not(".dependancy"); 

如果上面的代碼是行不通的嘗試:

cleanForm = $(form).not(".dependancy"); 

或者交替使用:

cleanForm = $(form).find(":not(.dependancy)"); 

希望這會有所幫助。

+0

感謝Kundan,我嘗試了第一個和第二個建議,當我向控制檯輸出'cleanForm'時,我仍然可以看到類「dependency」的元素。我試着將'dependancy'的拼寫更新爲'depenedency' – ariestav

0

not()過濾出與其參數匹配的元素,並從其餘元素構建新的 jQuery對象。它不會原地修改原始的jQuery對象。

我原來的答覆是一種誤導,因爲路過的find()not()結果總是會返回一個jQuery對象具有相同的內容原來,自從find()回報後代這雖然不是我們的情況下,原集的一部分元素。

我會建議你使用:not()選擇到你要找的<form>元素在一個圍棋賽:

var form = module.find("#formContainer form:not(.dependency)"); 
+0

我嘗試了'cleanForm = form.not('。dependancy');'當我輸出'cleanForm'到控制檯時它仍然包含'.dependancy'元素。 – ariestav

+0

@ariestav,嘗試更新的答案中的單個選擇器。它給你什麼? *(注意我用正確的'dependency'替代'dependancy'。)* –

0

這個怎麼樣?

module.find('#formContainer').find('form').each(function(i, f){ 
    form = $(f); 
    form.html(form.children().not(".dependancy")); 
});