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.添加:我应该在哪里以及如何调用函数“监控”?我把它放在 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>
4

3 回答 3

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

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

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

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

    但是我会注意到,.each回调中的参数是indexInArray和在这里valueOfElement指定的并且没有,或者作为传回的参数。rowIDnumbertype

  3. 如何正确传递变量?

    不明白你的意思。如果您指的是将变量传递给函数,那么您已经正确地做到了。例如。myAwesomeFunction(myFirstVariable, mySecondVariable)

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

    好吧,这实际上取决于您要达到的目标。第一个抓取任何具有 ID'monitor_'+rowID的元素,这些元素在 ID 的元素内部进行评估status_table。第二个tr使用 ID 抓取元素内部的所有内容status_table。这取决于你想要做什么。

于 2013-04-29T08:57:35.407 回答
1

有几个问题。首先,这是行不通的:

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

传递给的函数.each()有两个参数:indexInArrayvalueOfElement,尽管您可以随意调用它们 - 在这种情况下,rowID将是索引并且textInput将是元素的值;type将是未定义的,因为不会有任何值传递给它。

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

如果rowID, textInput, 和type当你调用它时在范围内.each(),那么你可以直接调用monitoring而不需要.each()。所以就:

monitoring(rowID, textInput, type);
于 2013-04-29T08:54:24.270 回答
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.

于 2013-04-29T08:55:05.600 回答