函数如何使用另一个函数的变量?

时间:2013-04-29 08:41:58

标签: javascript jquery variables jquery-selectors

我有一个函数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. 5。增加:我应该在何处以及如何调用“监控”功能?我把它放在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>
    

3 个答案:

答案 0 :(得分:1)

有一些问题。首先,这不起作用:

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

传递给.each()的函数有两个参数:indexInArrayvalueOfElement,但您可以随意调用它们 - 在这种情况下,rowID将是索引而textInput将是元素的价值; type将被定义,因为没有传递给它的值。

其次,在调用ID选择器后使用.each()是没有意义的。 ID选择器最多只能选择一个元素,因为ID必须是唯一的。

当您致电rowID时,如果textInputtype.each()在范围内,那么您可以直接致电monitoring而无需.each()一点都没有。所以只是:

monitoring(rowID, textInput, type);

答案 1 :(得分: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

答案 2 :(得分:1)

  1. 这是用变量调用选择器的正确方法吗? $('#status_table #monitor_'+rowID)

    是。传递给jQuery的选择器只是一个字符串,因此将一个变量添加到字符串中就是这样做的方法。我会注意到元素ID是meant to be unique(请查看该链接页面上列表中的第2项)

  2. 我是否应该在第二组代码中传递变量两次(在选择器功能和监视功能中)?

    如果您的函数具有.each函数返回的参数,则您不需要像$('#status_table #monitor_'+rowID).each(monitoring);那样。

    但我会注意到,.each回调中的参数是indexInArrayvalueOfElement指定here且没有rowID,{{传回的参数为1}}或number

  3. 如何正确传递变量?

    不知道你的意思。如果您指的是将变量传递给函数,那么您一直在正确地执行它。例如。 type

  4. 选择器是否正确?或者我应该将myAwesomeFunction(myFirstVariable, mySecondVariable)更改为$('#status_table #monitor_'+rowID).each(function(){})

    那真的取决于你想要实现的目标。第一个获取具有ID $('#status_table tr').each(function(){})评估的ID的元素,这些ID位于ID为'monitor_'+rowID的元素内。第二个抓取标识为status_table的元素内的所有tr。这取决于你想要做什么。