Как получить выражение селектора jQuery в виде текста?

У меня есть селектор jQuery, у которого есть связанная функция.

Внутри функции я хочу получить доступ к ТЕКСТУ, представляющему выражение для селектора.

$("cat dog").function() {

    // how do I get access to the "cat dog" string from inside THIS function ?
};

В этом примере кода я слишком упростил то, что действительно хочу делать. Я пишу плагин, и мне нужен доступ к селектору, для которого был создан обернутый набор. Очевидно, что в этом конкретном примере у меня есть доступ к «кошке-собаке», потому что я ее написал. Так что просто представьте, что это в плагине.

Это немного сложно для этого в Google.

edit: свойство "selector", к сожалению, устарело. http://jquery.com/upgrade-guide/1.9/#selector-property-on-jquery-objects


person Simon_Weaver    schedule 01.02.2009    source источник
comment
Даже если вы можете добраться до начального селектора, помните, что у вас может быть что-то вроде $ (. Cat .dog) .parents (div: first) .find (.parrot) .each (function () {/*...* /}); где у вас просто нет простого селектора.   -  person svinto    schedule 02.02.2009
comment
вот с чем я борюсь. Возможно, мне интересно, как пройти по дереву, но в основном просто получить последний элемент - это нормально. я обычно хотел бы сделать что-то вроде этого $ ('. cat'). assertNonEmpty (). each (function () {});   -  person Simon_Weaver    schedule 03.02.2009
comment
Есть ли шанс перейти на jQuery 1.3.1 и использовать селектор?   -  person Nosredna    schedule 04.02.2009
comment
Я жду 1.3.2 - stackoverflow.com/questions/498469. Завтра мне нужно выйти в эфир с очень небольшой частью нового сайта, и я не хочу, чтобы людям приходилось ждать загрузки изображений до выполнения jQuery. Как только я подтвердю, что в 1.3.2 нет ошибок, я переключусь. Спасибо за информацию   -  person Simon_Weaver    schedule 05.02.2009


Ответы (9)


В объекте jQuery есть атрибут «селектор», но я не уверен, что он всегда доступен.

person Ryan Doherty    schedule 01.02.2009
comment
Я не мог получить к нему доступ, когда пытался. Я подожду еще немного, чтобы посмотреть, будет ли кто-нибудь достаточно любезен, чтобы попробовать это для меня :) - person Simon_Weaver; 01.02.2009
comment
это новое в 1.3.1 Если вы используете 1.2.6, он не будет доступен - person redsquare; 02.02.2009
comment
о, круто. спасибо, я проверю. я не переключаюсь на jQuery до тех пор, пока не выйдет официальный выпуск 1.3.2 из-за этого stackoverflow.com/questions/477463 (кстати, этот пост принес мне наибольшее количество баллов!) - person Simon_Weaver; 05.02.2009
comment
является ли «селектор» задокументированным свойством? если это недокументированная собственность, я бы не стал на нее полагаться. Я не могу найти ссылку на него в документации jquery. - person Chii; 20.05.2009
comment
Вы правы, это не работает постоянно, особенно если вы динамически создаете элементы и хотите дать обратную ссылку на объект / элемент, который создал дочерний элемент. - person Richard Clayton; 17.11.2009
comment
Сейчас не рекомендуется :-( jquery.com/upgrade-guide/ 1.9 / - person Simon_Weaver; 11.02.2013
comment
@Simon_Weaver не устарел, он удален в 1.9+ и плагин для миграции тоже не восстанавливает его. - person Mark Schultheiss; 14.02.2013
comment
@MarkSchultheiss, похоже, у меня все еще работает в 1.9.1. возможно, функциональность немного изменилась, но она определенно сохранилась. Фактически, если вы посмотрите на источник для миграции, он использовал «селектор» в двух местах. Я все еще в замешательстве! - person Simon_Weaver; 25.02.2013

Это далеко не оптимально, но в некоторых случаях работает. Вы могли сделать следующее:

jQuery.fn._init = jQuery.fn.init
jQuery.fn.init = function( selector, context ) {
    return (typeof selector === 'string') ? jQuery.fn._init(selector, context).data('selector', selector) : jQuery.fn._init( selector, context );
};

jQuery.fn.getSelector = function() {
    return jQuery(this).data('selector');
};

Это вернет последний селектор, использованный для элемента. Но это не будет работать с несуществующими элементами.

<div id='foo'>Select me!</div>
<script type='text/javascript'>
 $('#foo').getSelector(); //'#foo'
 $('div[id="foo"]').getSelector(); //'div[id="foo"]'
 $('#iDoNotExist').getSelector(); // undefined
</script>

Это работает с jQuery 1.2.6 и 1.3.1 и, возможно, с другими версиями.

Также:

<div id='foo'>Select me!</div>
<script type='text/javascript'>
 $foo = $('div#foo');
 $('#foo').getSelector(); //'#foo'
 $foo.getSelector(); //'#foo' instead of 'div#foo'
</script>

Редактировать
Если вы проверяете сразу после использования селектора, вы можете использовать в своем плагине следующее:

jQuery.getLastSelector = function() {
    return jQuery.getLastSelector.lastSelector;
};
jQuery.fn._init = jQuery.fn.init
jQuery.fn.init = function( selector, context ) {
    if(typeof selector === 'string') {
        jQuery.getLastSelector.lastSelector = selector;
    }
    return jQuery.fn._init( selector, context );
};

Тогда сработает следующее:

<div id='foo'>Select me!</div>
<script type='text/javascript'>
 $('div#foo');
 $.getLastSelector(); //'#foo'
 $('#iDoNotExist');
 $.getLastSelector(); // #iDoNotExist'
</script>

В своем плагине вы можете:

jQuery.fn.myPlugin = function(){
 selector = $.getLastSelector;
 alert(selector);
 this.each( function() {
  //do plugins stuff
 }
}

$('div').myPlugin(); //alerts 'div'
$('#iDoNotExist').myPlugin(); //alerts '#iDoNotExist'

Но все равно:

$div = $('div');
$('foo');
$div.myPlugin(); //alerts 'foo'
person Pim Jager    schedule 01.02.2009
comment
ха. это действительно очень умно. к сожалению, мне нужно (чаще всего) знать, когда селектор вернул ноль элементов. Я пытаюсь создать более полезные сообщения об ошибках для моего подключаемого модуля утверждения stackoverflow.com/questions/498469 - Саймон - person Simon_Weaver; 01.02.2009
comment
Я недостаточно проснулся, чтобы перечитать это сейчас. я только что увидел, что вы обновили это. просто хотел привлечь внимание всех, кто использует этот код, что, если они видят некоторую странность, это может быть связано с этой проблемой: stackoverflow.com/questions/ 535967 - person Simon_Weaver; 11.02.2009

Если вы используете firebug, вы можете console.log(this) внутри функции и посмотреть, доступна ли строка селектора где-нибудь в объекте. Извините, я не знаком с jQuery API.

person Luca Matteis    schedule 01.02.2009
comment
Я не могу сразу увидеть это там, но +1 за то, что сказал мне что-то, чего я не знал. Я использовал IE и отлаживал в Visual Studio и не получал особой пользы, проверяя там объект - person Simon_Weaver; 01.02.2009
comment
Ржу не могу! Спасибо, Лука, за подсказку. Забыл сбросить эту переменную в функцию. :) Сэкономил здесь свое время !! :) Спасибо!! - person Mr.TK; 25.04.2014
comment
Добровольно отлаживаете в IE? Вау, это мазохистский вид ;-) - person Simon Steinberger; 31.08.2014

Это сработает, если вы хотите получить доступ к строке селектора в своей функции:

$(this).html();

Это также будет работать, если используется несколько селекторов,

например,

$('#id1,#id2').click(function(){
   alert($(this).html());
});
person Zeeshan    schedule 12.10.2012

Возможно, это решит вашу проблему:

var $jqueryItems = $( ".my-selector" );
console.log( $jqueryItems.selector ); // display ".my-selector"
person Bruno J. S. Lesieur    schedule 10.07.2013

Для тех, кто хочет проникнуть в строку селектора своих плагинов, предоставленную jQuery, я рад, что улучшил отличный ответ, данный @Pim Jager:

  1. На данный момент (последняя версия 3.2.1) в функции jQuery.fn.init есть 3 аргумента - selector, context, root - а не два;
  2. Ключевое слово new следует добавить в оператор возврата jQuery.fn.init;
  3. Внутри вашего плагина селекторы возвращаются в виде строки при вызове $(this).getSelector();

Наконец, вот что мне нужно, чтобы поработать как шарм:

(function($, window, document, undefined) { 
    $.fn._init = $.fn.init
    $.fn.init = function( selector, context, root ) {
        return (typeof selector === 'string') ? new $.fn._init(selector, context, root).data('selector', selector) : new $.fn._init( selector, context, root );
    };
    $.fn.getSelector = function() {
        return $(this).data('selector');
    };
    $.fn.YOUR-PLUGIN = function() {
        var selector = $(this).getSelector(); // selectors string given to jQuery 
        // other code
    }
})(jQuery, window, document);

Насколько мне известно, он работает с версиями jQuery (от 1.7.0 до 3.2.1).

PS. Прекрасно работает даже с jQuery 1.2.3, доступным здесь и в stackoverflow. Итак, я думаю, следующее нормально для всех версий jQuery, если вы хотите получить выражение селектора jQuery в виде текста внутри плагина:

// our plugin
(function($, window, document, undefined) { 
    $.fn._init = $.fn.init
    $.fn.init = function( selector, context, root ) {
        return (typeof selector === 'string') ? new $.fn._init(selector, context, root).data('selector', selector) : new $.fn._init( selector, context, root );
    };
    $.fn.getSelector = function() {
        return $(this).data('selector');
    };
    $.fn.coolPlugin = function() {
        var selector = $(this).getSelector(); 
        if(selector) console.log(selector); // outputs p #boldText
    }
})(jQuery, window, document);

// calling plugin
$(document).ready(function() {
    $("p #boldText").coolPlugin();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<p>some <b id="boldText">bold text</b></p>

person curveball    schedule 11.08.2017

См. Мой ответ на повторяющийся вопрос: Перехватывающий селектор во время инициализации

Подробности: Полная работа с любой версией jQuery даже после прекращения поддержки и удаления свойства selector

Мое решение - перехватить селектор во время инициализации объекта jQuery и в то же время прозрачно поддерживать все остальные функции jQuery, используя наследование следующим образом:

$ = (function (originalJQuery) 
{
    return (function () 
    {
        var newJQuery = originalJQuery.apply(this, arguments);
        newJQuery.selector = arguments.length > 0 ? arguments[0] : null;
        return newJQuery;
    });
})($);

$.fn = $.prototype = jQuery.fn;

Использование:

var myAnchors = $('p > a');
var selector = myAnchors.selector;

Должен произвести: "p > a"

Успешно пробовал с jQuery 3.4.1

person Abdulhameed    schedule 20.06.2020

Я не мог понять, как получить ссылку на строковое значение селектора внутри $ ('value_i_want_here') при привязке к функции; кажется серьезной проблемой. Однако, если вы предпочитаете тестирование в IE [x], всегда есть Firebug Lite, который действительно хорошо работает с использованием console.log (var | val).

person David Mosher    schedule 01.02.2009

ну я все еще пытаюсь понять, пытаетесь ли вы получить имя элемента? или идентификатор и / или класс, или все это.

Вы можете получить элемент с этим

var element =$(this).get(0);
var id = $(this).attr('id');
var class=$(this).attr('class');

не уверен, что произойдет, если у вас будет более одного класса. может войти в массив или что-то в этом роде, и вы можете получить это с помощью индексов.

person pedalpete    schedule 01.02.2009
comment
@pedalpete - я хочу, чтобы настоящий текст "кошка собака" - в виде строки - person Simon_Weaver; 01.02.2009
comment
@pedalpete - я думаю, что название этого поста немного вводит в заблуждение, но я надеялся, что сам вопрос был более ясным. немного двусмысленно на это смотрю. то, что я хочу, - это фактическое строковое значение, с которым был построен селектор $ ('cat dog'). - person Simon_Weaver; 01.02.2009
comment
ха. это действительно очень умно. к сожалению, мне нужно (чаще всего) знать, когда селектор вернул ноль элементов. я пытаюсь создать более полезные сообщения об ошибках для моего подключаемого модуля утверждения stackoverflow.com/questions/498469 - person Simon_Weaver; 01.02.2009
comment
извините - я действительно опубликовал этот последний комментарий к неправильному ответу. это было не то, что я искал - person Simon_Weaver; 01.02.2009