Как получить выражение селектора jQuery в виде текста? - PullRequest
31 голосов
/ 01 февраля 2009

У меня есть селектор 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

Ответы [ 8 ]

18 голосов
/ 01 февраля 2009

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

8 голосов
/ 01 февраля 2009

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

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'
3 голосов
/ 01 февраля 2009

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

2 голосов
/ 12 октября 2012

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

$(this).html();

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

например,

$('#id1,#id2').click(function(){
   alert($(this).html());
});
1 голос
/ 11 августа 2017

Для тех, кто хочет получить доступ к строке выбора плагинов, предоставленной 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>
1 голос
/ 10 июля 2013

Может быть, это решит вашу проблему:

var $jqueryItems = $( ".my-selector" );
console.log( $jqueryItems.selector ); // display ".my-selector"
0 голосов
/ 01 февраля 2009

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

0 голосов
/ 01 февраля 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...