2013-04-29 53 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

相关问题