PAYATHON 2026

Safari 报错:jQuery 选择器出现 Syntax error

支付阿杰

结论

这不是 jQuery 2.1.4 的兼容性问题。属性选择器末尾缺少方括号 ]。

原代码最终拼接出的选择器类似:

input[data-card-type="payment-one"

属性选择器没有闭合,jQuery 无法解析,因此抛出错误:

Syntax error, unrecognized expression

正确修改

在选择器末尾补上 ]:

$(this).change(function () {
    if ($(this).val() !== '') {
        $('input[data-card-type="' + paymentGroup + '"]')
            .val('')
            .prop('disabled', true);
    }
});

假设 paymentGroup 的值是 payment-one,拼接后会得到合法的 CSS 属性选择器:

input[data-card-type="payment-one"]

它会匹配下面的元素:

<input data-card-type="payment-one">

原因说明

原来的表达式是:

$('input[data-card-type="' + paymentGroup + '"')

这里的 input[ 打开了属性选择器,data-card-type="..." 指定属性值,但末尾漏掉了 ]。

JavaScript 字符串本身已经闭合,所以代码可以执行到 jQuery。真正的问题是传给 jQuery 的选择器不完整,因此错误会在回调函数执行时出现。Console 中的 (anonymous function) 表示异常发生在未命名的事件回调中,并不是另一个错误。

更易读的写法

可以先构造选择器,这样更方便在控制台中检查:

$(this).change(function () {
    if ($(this).val() !== '') {
        var selector = 'input[data-card-type="' + paymentGroup + '"]';

        $(selector)
            .val('')
            .prop('disabled', true);
    }
});

也可以不手动拼接 CSS 选择器。先选出带有该属性的元素,再按属性值过滤:

$(this).change(function () {
    if ($(this).val() !== '') {
        $('input[data-card-type]')
            .filter(function () {
                return $(this).attr('data-card-type') === paymentGroup;
            })
            .val('')
            .prop('disabled', true);
    }
});

如果 paymentGroup 可能包含引号、反斜杠等 CSS 选择器特殊字符,后一种写法更稳妥。

注意事项

如果不想禁用当前触发 change 事件的输入框,只想处理同组或其他输入框,还需要根据业务逻辑追加 .not(this),或者调整筛选条件。例如:

$('input[data-card-type="' + paymentGroup + '"]')
    .not(this)
    .val('')
    .prop('disabled', true);

核心修复是把选择器补全为:

'input[data-card-type="' + paymentGroup + '"]'

备注:内容仅供参考。