2013-04-29 114 views
1

我有一個功能addText(),它有3個變量(textInput, type, rowID)。我宣佈他們沒有var關鍵字(這樣它們可以在函數之外使用?)。我有我創造了這樣多的複選框:函數如何使用來自其他函數的變量?

<td><input type="checkbox" name="CB" id="monitor_'+rowID+'"/></td> 

然後,我有這個功能,這需要使用這3個變量:

function monitoring(rowID, number, type) { 
    var $check = $('#status_table #monitor_' + rowID); 
    $('#test').append($check); 
    if($check.is(':checked')) { 
     $.post('/request', { 
      inputText: number, 
      key_pressed: type 
     }).done(function (reply) { 
      if(reply == "on") { 
       $('#test').append("on"); 
      } else { 
       $('#test').append("off"); 
      } 
     }); 
    } 
    return; 
} 

該功能將在這裏稱爲:

$('#status_table #monitor_'+rowID).each(function(rowID, textInput, type){ 
    monitoring(rowID, textInput, type); 
}); 

注意:inputText是發佈到某處的變量。

問題:

  1. 這是正確的方法來調用與變量選擇?

    $('#status_table #monitor_'+rowID)

  2. 我應該通過變量兩次(在選擇器功能和監測功能兩者),第二組的碼?

  3. 如何正確傳遞變量?

  4. 選擇器是否正確?或者我應該將$('#status_table #monitor_'+rowID).each(function(){})更改爲$('#status_table tr').each(function(){})

5. ADDED:在哪裏以及如何調用函數「monitoring」?我把它放在addText下面(參考下面的代碼),但它沒有任何意義,因爲只有當點擊「添加」按鈕時纔會執行函數。此外,由於我的選擇器是一個變量,我想確保它可以對所有選中的複選框執行相同的操作。我怎樣才能做到這一點?

我試過了,但當我檢查複選框時,我的代碼根本沒有任何反應。

編輯:

這是我addText()功能(我已經包含在這個函數,而不是如上另一個jQuery的作用下功能監測):

function addText(add_type, fb_type) { 
    $("#" + add_type + "Add").click(function() { 
    $('.TextInput').empty(); 
    textInput = $("#" + fb_type + "TextInput").val(); 
    if(textInput.length === 0) { 
     alert('please enter the fieldname'); 
     return; 
    } 
    index = $('#status_table tbody tr').last().index() + 1; 
    type = $("#select-choice-1").find(":selected").text(); 
    rowID = type + textInput; 
    var str = '<tr id="' + rowID + '">' + '<td>' + index + '</td><td>' + rowID + 
     '</td><td class="type_row_' + textInput + '">' + type + '</td><td class="feedback number">' + 
     textInput + '</td>' + '<td><img src="static/OffLamp-icon.png" class="image" id="off"></td>' + 
     '<td><input type="checkbox" name="CB" id="monitor_' + rowID + 
     '" class="custom" data-mini="true" /><label for="CB"> </label></td><td class="outputRemove">x</td>' + 
     '</tr>'; 
    if(alreadyExist(textInput, type)) { 
     alert('Entry exists. Please enter another number.') 
    } else { 
     $('#status_table tr:last').after(str); 
    } 
    monitoring(rowID, textInput, type); 
    return; 
    }); 
} 

表的HTML:

<table class="config" id="status_table"> 
    <thead> 
    <tr> 
     <th colspan="4" ; style="padding-bottom: 20px; color:#6666FF; text-align:left; font-size: 1.5em">Output Status</th> 
    </tr> 
    <tr> 
     <th>Index</th> 
     <th>Row ID</th> 
     <th>Feedback Type</th> 
     <th>Feedback Number</th> 
     <th>Status</th> 
     <th>Monitor?</th> 
     <th>Remove?</th> 
    </tr> 
    </thead> 
    <tbody> 
    <tr></tr> 
    </tbody> 
</table> 
+0

你能最終確定你的問題嗎?似乎你有一些錯誤的名字和東西被遺漏了。 – Joseph 2013-04-29 08:45:48

+0

你是指哪一個?我可以在必要時添加更多細節。 – yvonnezoe 2013-04-29 08:47:54

+0

我們可以看到表格的HTML嗎? – 2013-04-29 08:49:19

回答

1

有幾個問題。首先,這是不行的:

$('#status_table #monitor_'+rowID).each(function(rowID, textInput, type){ 
    monitoring(rowID, textInput, type); 
}); 

傳遞給.each()該函數有兩個參數:indexInArrayvalueOfElement,但你可以打電話給他們任何你喜歡的 - 在這種情況下,rowID將是指數和textInput將是元素的價值; type將是未定義的,因爲沒有值傳遞給它。

其次,在調用ID選擇器後使用.each()是沒有意義的。 ID選擇器將至多選擇一個元素,因爲ID必須是唯一的。

如果rowIDtextInputtype在範圍上,當你調用.each(),那麼你可以只調用monitoring直接而不需要.each()可言。所以剛:

monitoring(rowID, textInput, type); 
+0

哦謝謝你的更正!我在問題中添加了addText()函數,並且它具有表格的HTML。桌子的其餘部分只是標題。在問題中添加了表格的框架以及:) – yvonnezoe 2013-04-29 09:09:10

+0

「範圍內」是什麼?你的意思是我可以把「$('選擇器')。監測(rowID,textInput,類型);」? – yvonnezoe 2013-04-29 09:13:14

+0

@yvonnezoe「in scope」是指執行代碼時變量是可見的;如果你在不使用'var'關鍵字的情況下聲明它們,那麼它們將在全局範圍內(因此,除非它們被另一個變量遮蔽,否則它們總是在代碼中的任何位置)。你只需要'監視(rowID,textInput,type);'因爲它不是一個jQuery函數。 – 2013-04-29 09:14:46

1

這是正確的方法來調用與變量選擇?

選擇器只是字符串。你用變量組裝選擇器,就像你用變量組裝字符串一樣。

我應該在第二組代碼中傳遞兩次變量(在選擇器函數和監視函數中)嗎?

取決於變量存在的範圍。如果變量與函數處於相同的範圍內,則該函數可以訪問它。如果函數在變量所在的位置以外聲明,那麼您應該將它傳遞給它們。

如何正確傳遞變量?

由於調用過程中的參數,如someFunction(theFoo,theBar,theOtherBar)

是選擇正確嗎?或者我應該將$('#status_table #monitor _'+ rowID).each(function(){})更改爲$('#status_table tr')each(function(){})?

ID應該是頁面中唯一的,並且只存在一次。因此,作爲選擇器的id應該就足夠了,如$('#monitor_[someID]')。但這隻會意味着每rowID一次獲得一個。如果您使用$('#status_table tr').each(function(){})代替,並且在tr之上循環,那麼更好。

+0

謝謝你的解釋!:)我已經在問題中添加了addText()函數。 – yvonnezoe 2013-04-29 09:03:40

+0

但在我的情況下,我無法確定選擇器是否正確調用,因爲它不執行功能'監視'中的操作:/我編輯了上面的代碼,以包括addText下的功能。請看看並給我一些建議:)謝謝。 – yvonnezoe 2013-04-30 02:02:13

1
  1. 這是用變量調用選擇器的正確方法嗎? $('#status_table #monitor_'+rowID)

    是的。傳遞給jQuery的選擇器只是一個字符串,所以向這樣的字符串添加一個變量將是實現它的方式。我會注意到,元素ID爲meant to be unique(在列表看第2項是鏈接的頁面上)

  2. 如果我的代碼(無論是在選擇功能和監控功能)通過變量兩次在第二盤?

    如果您的函數具有.each函數返回的參數,則不需要如此,您可以像$('#status_table #monitor_'+rowID).each(monitoring);一樣去。

    我會注意的,就是在.each回調的參數是indexInArrayvalueOfElement按規定here並沒有rowIDnumbertype爲傳回的參數。

  3. 如何正確傳遞變量?

    不知道你的意思。如果你指的是將變量傳遞給函數,你一直在正確地做。例如。 myAwesomeFunction(myFirstVariable, mySecondVariable)

  4. 選擇器是否正確?或者我應該將$('#status_table #monitor_'+rowID).each(function(){})更改爲$('#status_table tr').each(function(){})

    那麼這真的取決於您試圖實現的目標。第一個元素抓取元素ID爲'monitor_'+rowID的元素ID爲status_table的元素。第二個獲取ID爲status_table的元素內的所有tr。這取決於你正在嘗試做什麼。

+0

謝謝你的解釋! :D – yvonnezoe 2013-04-30 00:24:24

+0

但在我的情況下,我無法確定選擇器是否正確調用,因爲它不執行功能監視中的操作:/我編輯了上面的代碼,以包含addText下的函數。 – yvonnezoe 2013-04-30 01:57:51

+0

使用Firebug,Chrome Developer Console或IE8 +中的內置開發人員工具等工具,通過插入斷點來檢查函數的執行過程是非常有用的。誠實的是,我再次瀏覽了你的代碼,我真的不明白它在做什麼以及爲什麼你會這樣做。我不確定這是否是堆棧溢出的真正問題,因爲它需要多個不同的答案。 – Turnerj 2013-04-30 08:17:48

相關問題