jQuery选择器中的变量和字符串串联-是否认为有害?

jQuery选择器中的变量和字符串串联-是否认为有害?,jquery,jquery-selectors,string-concatenation,Jquery,Jquery Selectors,String Concatenation,我经常在jQuery选择器中看到字符串连接: var $field = $('.' + field, $form); var $label = $('label[for="' + $field.attr('id') + '"]'); var $elem = $('#' + elem); 因为(谁知道其他属性中可能包含什么),这样的代码没有潜在危险吗 我发现,有些选择器以任何其他方式编写都不是微不足道的——那么,标准做法是什么呢?本机DOM方法并不总是可用的 我总是避免在ID等中使用奇怪的字符,

我经常在jQuery选择器中看到字符串连接:

var $field = $('.' + field, $form);
var $label = $('label[for="' + $field.attr('id') + '"]');
var $elem = $('#' + elem);
因为(谁知道其他属性中可能包含什么),这样的代码没有潜在危险吗

我发现,有些选择器以任何其他方式编写都不是微不足道的——那么,标准做法是什么呢?本机DOM方法并不总是可用的


我总是避免在ID等中使用奇怪的字符,但是当编写供其他人通用的工具时,最好避免这种警告。

当您完全控制字符串中的内容时,这不是问题,但对于库工具来说,这将是问题


简单地说,不要接受工具的名称或标识,而是接受完整的选择器或元素/jQuery引用。这样,使用该工具的人就有责任创建一个工作选择器。

您的第一个和第三个示例是常见的,只要您控制
字段和
元素中的内容,就不会产生任何危害

我从不使用第二种形式,我会这样写:

var match = $field.attr('id');      // or $field[0].id
var $label = $('label').filter(function() {
    return this.getAttribute('for') === match;
});

这样就完全不必担心转义
match

的内容,但这种方式不是更昂贵吗?因为它不会使用浏览器的本机
querySelector
或类似的工具?@Andrew它可能(稍微)更昂贵,这取决于
label
元素的数量。“除非这个电话是在一个紧密的循环中反复发出的,否则我不会担心区别。谢谢——如果第一个和第三个都可以,为什么你永远不会使用第二个呢?”我想,安德鲁·斯泰伦。我需要担心的是,引用的级别会让我觉得有点过火。我喜欢这个想法。不过,在我的特定工具中,我有一个服务器端指定的表单字段的名称和ID列表,在表单发回时再次使用这些字段(例如必填字段)。在服务器端指定
['name1'、'name2'、'name3']
对于用户来说是最简单的选择,然后由我的代码处理其余部分。