如何将jQuery选择对象传递到被选择调用的函数

How do I pass the jQuery selection object into a function being called by the selection?

本文关键字:选择 调用 函数 jQuery 对象      更新时间:2023-09-26

jQuery新手,我不知道该怎么说

当下面的函数在jquery选择范围内时,它可以正常工作。当我试图打破函数时,我不确定需要将什么对象/变量传递到函数中才能使函数工作。

//function included in selection works great
$('#id1 tbody tr').find('td:eq(2)').text(
function(i,t){
    return Math.round((parseInt(t,10) / 60)*100)/100;
});
//function broken out returns NaN in HTML
$('#id2 tbody tr').find('td:eq(2)').text(minutesToHours());
function minutesToHours(i,t){
    return Math.round((parseInt(t,10) / 60)*100)/100;
}

这是相同的函数,但在HTML中返回'NaN'。我知道我需要将对象传递到函数minutesToHours()中,但我尝试过的this$(this)都不起作用。minutesToHours('whatGoes','here')

JSFiddle

我想这与上下文有关,但我不明白。

HTML例子

<table id="id1">
    <tbody>
        <tr>
            <td>John</td>
            <td>2</td>
            <td>800</td>
            <td>4</td>
        </tr>
        <tr>
            <td>Sally</td>
            <td>5</td>
            <td>610</td>
            <td>9</td>
        </tr>
        <tr>
            <td>Bob</td>
            <td>7</td>
            <td>249</td>
            <td>3</td>
        </tr>
    </tbody>
</table>
<table id="id2" style="margin-top:1em;">
    <tbody>
        <tr>
            <td>John</td>
            <td>2</td>
            <td>800</td>
            <td>4</td>
        </tr>
        <tr>
            <td>Sally</td>
            <td>5</td>
            <td>610</td>
            <td>9</td>
        </tr>
        <tr>
            <td>Bob</td>
            <td>7</td>
            <td>249</td>
            <td>3</td>
        </tr>
    </tbody>
</table>
结果

Included function
    John    2   13.33   4
    Sally   5   10.17   9
    Bob     7   4.15    3
Broken out function
    John    2   NaN 4
    Sally   5   NaN 9
    Bob     7   NaN 3

谢谢你的帮助!

进一步解释Adeno在评论中的回答:

From the docs:

。Text (function)

函数

Type: Function(Integer index, String text) => String返回要设置的文本内容的函数。接收元素在集合中的索引位置和旧文本值作为参数。

这意味着当你调用下面的代码时,t填充旧的文本值:

$('#id1 tbody tr').find('td:eq(2)').text( function(i,t){
    return Math.round((parseInt(t,10) / 60)*100)/100;
});

然而,当你在下面使用minutesToHours()时,你实际上是在调用minutesToHours() ,没有参数,并将返回值传递给.text()。因为你没有传递任何变量给函数,t是未定义的,函数产生NaN:

$('#id2 tbody tr').find('td:eq(2)').text(minutesToHours());
function minutesToHours(i,t){
    return Math.round((parseInt(t,10) / 60)*100)/100;
}

.text()使用不同的签名:

。Text (Text)

文本

类型:字符串、数字或布尔值要设置为每个匹配元素的内容的文本。当提供Number或Boolean时,它将被转换为String表示形式。

按照Adeno的建议,从minutesToHours()中删除(),如下所示。现在,您将对minutesToHours函数的引用传递给.text() ,而不是调用函数。当.text()看到形参是一个函数时,它将在该上下文中调用该函数,传递两个值(index, text )和一切正常:

$('#id2 tbody tr').find('td:eq(2)').text(minutesToHours);
function minutesToHours(i,t){
    return Math.round((parseInt(t,10) / 60)*100)/100;
}