2015-02-23 98 views
0

我有以下JavaScript代碼。我試圖在選擇表單域中實現隱藏/顯示通用功能。讓我們舉個例子。假設我有一個select域,其值爲「none」,「auth」,「other」,如果用戶選擇「auth」,則顯示另一個表單域。對於不同的選擇領域,我可能會在很多地方出現這種情況。因此,我寫了下面profile_field_toggler在JavaScript中傳遞代碼作爲函數參數,並且該代碼使用函數中定義的變量

function escapeJquerySelectorStr(str) { 
    if (str) { 
    return str.replace(/([ #;?&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1');  
    } 
    return str; 
} 

function profile_field_toggler (cotroller_id, reciever_id, block_code) { 
    parsed_controller_id = "#"+escapeJquerySelectorStr(cotroller_id); 
    parsed_reciever_id = "#"+escapeJquerySelectorStr(reciever_id); 
    selected = jQuery(parsed_controller_id + " option:selected").val(); 
    if(block_code()) { 
    jQuery(parsed_reciever_id).removeClass("hide"); 
    } else { 
    jQuery(parsed_reciever_id).addClass("hide"); 
    } 
} 

這個功能在這裏,我撥打電話到即profile_field_toggler通用功能。泛型函數的最後一個參數接受條件代碼,所以我將它傳遞給selected == "auth"以下的調用。但selected沒有在這個調用範圍,因此它不會工作(因爲我想引用泛型函數中選定的變量)。那我該如何解決這個問題呢?請注意,我必須僅在呼叫方中保留諸如selected == "auth"selected != "xyz"selected == "undefined"的條件,因爲它們可能會有所不同。

jQuery(document).ready(function() { 
    profile_field_toggler("base[remove_option]", "general_passwordassword_block", function() {selected == "auth"}); 
}); 

任何想法如何解決這個問題?

+0

你確定你不會讓這個有點太複雜嗎? – adeneo 2015-02-23 17:44:44

+0

@adeneo,感謝您的支持。我可能會同意你的意見。但這不是重點。我在這裏只是一個虛擬代碼,而實際的實現是基於類似的問題。因此,讓我們找到問題的解決方案:) – JVK 2015-02-23 17:49:34

+0

將*條件*保留爲字符串,然後調用'eval()'?我假設在調用'selected'時處於調用函數範圍。 – 2015-02-23 17:52:09

回答

0

閉包只能訪問自己範圍內的變量,但絕對不會(也不能)知道最終調用它的函數的範圍。

在這個特殊的例子中 - 或許「block_code」應該被選作參數。

0

它看起來很奇怪,但我找到了解決方案。看來你只能在來自調用者的調用中傳遞selected,即使它在通用函數中定義,它也可以工作。看一下這個。我剛剛添加return,以便可以評估條件。它的工作。我測試了所有不同的條件,它正在工作..甜,但很奇怪。

jQuery(document).ready(function() { 
    profile_field_toggler("base[remove_option]", "general_passwordassword_block", function() {return(selected == "auth")}); 
}); 
+0

這並不奇怪。它的作用是因爲你使用了所有的全局變量,這通常不是最好的想法。 – Pointy 2015-02-23 22:51:02

相關問題