Отказ от ответственности: это не решение / использование обходного пути ответ Тату за это, это просто описание проблемы и того, что вызывает странное поведение у любопытных.
Корень проблемы здесь, регулярное выражение, которое jQuery использует для идентификации фрагмента HTML :
/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/
Что делает соответствует вашему селектору:
body strong:contains("<foo>")
Вы можете попробовать его :
alert(/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/.test('body strong:contains("<foo>")'));
Так что он думает, что это HTML-фрагмент ... так что в целом это в настоящее времяэквивалент:
$('body strong:contains("<foo>")');
$('<foo>');
Видение второго - более ясная иллюстрация того, что это фрагмент документа ... у которого нет родителя.Он занимает 2-ю позицию в массиве совпадений, который, как вы можете видеть, просто <foo>
, , попробуйте снова :
alert(/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/.exec('body strong:contains("<foo>")')[1]);
В результате вы в конечном итоге окажетесь на этот путь кода в jQuery $()
, строящий фрагмент.
Короче говоря да , я бы посчитал это ошибкой jQuery.