为什么 Internet Explorer 不能运行这个简单的 jQuery?

发布于 2024-12-10 09:10:48 字数 1269 浏览 0 评论 0原文

我正在运行一个非常简单的 jQuery 脚本来获取表中复选框选择的所有电子邮件。该表看起来像这样:

<table>
    <tbody>
        <tr>
            <td>
                <input type="checkbox" value="MD5HASH" />
            </td>
            <td>
                First Name
            </td>
            <td class="email">
                Email Address
            </td>
        </tr>
    </tbody>
</table>

我的 jQuery 看起来像这样:

$("#submitButton").click(function() {
    var output = [];
    $("table tbody tr:has(input:checkbox:checked)").each(function() {
        var email = $('td.email', $(this)).text();
        if (validate(email) && output.indexOf(email) == -1)
            output.push(email);
    }); 

    $("#emails").val(output.join(", "));
});

function validate(email) {
    return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(email); 
}

这在 IE 中失败了,但在其他地方都有效。

  1. table tbody tr:has(input:checkbox:checked) 选择器没有匹配任何内容。
  2. 对 validate 的调用会引发 Object Expected 错误。

为什么!? jQuery 不是被设计为跨浏览器和可移植的吗?

I'm running a really simple jQuery script to grab all emails selected by checkboxes in a table. The table looks like this:

<table>
    <tbody>
        <tr>
            <td>
                <input type="checkbox" value="MD5HASH" />
            </td>
            <td>
                First Name
            </td>
            <td class="email">
                Email Address
            </td>
        </tr>
    </tbody>
</table>

My jQuery looks like this:

$("#submitButton").click(function() {
    var output = [];
    $("table tbody tr:has(input:checkbox:checked)").each(function() {
        var email = $('td.email', $(this)).text();
        if (validate(email) && output.indexOf(email) == -1)
            output.push(email);
    }); 

    $("#emails").val(output.join(", "));
});

function validate(email) {
    return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(email); 
}

This fails miserably in IE, but works everywhere else.

  1. The table tbody tr:has(input:checkbox:checked) selector matches nothing.
  2. The call to validate throws a Object expected error.

WHY!? Isn't jQuery designed to be cross-browser and portable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

喜爱皱眉﹌ 2024-12-17 09:10:48

Internet Explorer (< 9) 没有 Array.prototype .indexOf。尝试使用 jQuery 的 $.inArray (它是跨浏览器的,并且会实际上使用 Array.prototype.indexOf(如果存在):-P)。

if (validate(email) && $.inArray(email,output) == -1)
  output.push(email);

Internet Explorer (< 9) doesn't have Array.prototype.indexOf. Try using jQuery's $.inArray instead (it's cross browser and will actually use Array.prototype.indexOf if it exists :-P).

if (validate(email) && $.inArray(email,output) == -1)
  output.push(email);
夏日落 2024-12-17 09:10:48

给输入一个类并直接定位它...

<table>
    <tbody>
        <tr>
            <td>
                <input class="emailchecked" type="checkbox" value="MD5HASH" />
            </td>
            <td>
                First Name
            </td>
            <td class="email">
                Email Address
            </td>
        </tr>
    </tbody>
</table>

然后在你的js中定位已检查的类,如下所示:

$("#submitButton").click(function() {
    var output = [];
    $(".emailchecked ([checked='checked'])").each(function() {
        var email = $('td.email', $(this)).text();
        if (validate(email) && output.indexOf(email) == -1)
            output.push(email);
    }); 

    $("#emails").val(output.join(", "));
});

function validate(email) {
    return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(email); 
}

give the input a class and target it directly...

<table>
    <tbody>
        <tr>
            <td>
                <input class="emailchecked" type="checkbox" value="MD5HASH" />
            </td>
            <td>
                First Name
            </td>
            <td class="email">
                Email Address
            </td>
        </tr>
    </tbody>
</table>

Then target the checked ones in your js like this:

$("#submitButton").click(function() {
    var output = [];
    $(".emailchecked ([checked='checked'])").each(function() {
        var email = $('td.email', $(this)).text();
        if (validate(email) && output.indexOf(email) == -1)
            output.push(email);
    }); 

    $("#emails").val(output.join(", "));
});

function validate(email) {
    return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(email); 
}
等风来 2024-12-17 09:10:48
    <table>
        <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
            <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
            <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
            <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
     </table>

    <input id="btnSubmit" type="button" value="Submit"/>

    <div id="emails"></div>

    <script type="text/javascript">
    $('#btnSubmit').click(function(e){
        var emails = [];
        $('table').find('input').each(function() {
            if ($(this).is(':checked'))
                emails.push($(this).parent().next().text());
        });

        $("#emails").empty().html(emails.join(", "));

    });
    </script>

Since you have three columns instead of two, just walk the DOM for that row.
    <table>
        <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
            <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
            <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
            <tr><td><input type="checkbox" value=""/></td><td>[email protected]</td></tr>
     </table>

    <input id="btnSubmit" type="button" value="Submit"/>

    <div id="emails"></div>

    <script type="text/javascript">
    $('#btnSubmit').click(function(e){
        var emails = [];
        $('table').find('input').each(function() {
            if ($(this).is(':checked'))
                emails.push($(this).parent().next().text());
        });

        $("#emails").empty().html(emails.join(", "));

    });
    </script>

Since you have three columns instead of two, just walk the DOM for that row.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文