2009-02-01 9 views
30

Tengo un selector jQuery, que tiene una función encadenada.¿Cómo obtengo la expresión de un selector jQuery como texto?

Dentro de la función quiero acceder al TEXTO que representa la expresión para el selector.

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

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

He simplificado en este código la muestra de lo que realmente quiero hacer. Estoy escribiendo un complemento y necesito acceder al selector para el cual se creó el conjunto envuelto. Obviamente, en este ejemplo en particular tengo acceso a "perro gato" porque lo escribí. Así que imagínense esto en un complemento.

Es un poco complicado google para esto.

editar: la propiedad 'selector' lamentablemente ha quedado obsoleta. http://jquery.com/upgrade-guide/1.9/#selector-property-on-jquery-objects

+0

Incluso si usted puede conseguir al selector inicial, recuerde que podría tener algo como $ (". cat .dog"). parents ("div: first"). find (".parrot"). each (function() {/*...*/}); donde simplemente no tiene un selector simple. – svinto

+0

ese es un punto con el que estoy luchando. posiblemente me esté preguntando sobre cómo atravesar el árbol, pero la mayoría de las veces simplemente obtener el último elemento está bien. normalmente querría hacer algo así como $ ('.cat'). assertNonEmpty(). each (function() {}); –

+0

¿Hay alguna posibilidad de que pueda actualizar a jQuery 1.3.1 y usar "selector"? – Nosredna

Respuesta

18

Hay un atributo 'selector' en el objeto jQuery, pero no estoy seguro de que esté siempre disponible.

+0

parece que no puedo acceder a él cuando lo intento. Voy a esperar un poco más para ver si alguien más tiene la amabilidad de probarlo :) –

+0

es nuevo en 1.3.1 Si estás usando 1.2.6 no estará disponible – redsquare

+0

Acabo de usar esto en 1.3.1. – Nosredna

3

Si está usando firebug puede console.log(this) dentro de la función y ver si la cadena del selector está accesible en algún lugar del objeto. Lo siento, no estoy familiarizado con la API de jQuery.

+0

no puedo verlo inmediatamente, pero +1 por decirme algo que no sabía. Estaba usando IE y la depuración en Visual Studio y no obtenía mucha utilidad inspeccionando el objeto allí –

+0

LoL! Thx Luca por tu pista. Olvidé volcar esta variable en la función. :) Ahorré mi tiempo aquí !! :) ¡¡Gracias!! –

+0

Depuración voluntaria en IE? Wow, eso es un poco masoquista ;-) –

-2

Bueno, todavía estoy tratando de averiguar si está tratando de obtener el nombre del elemento? o la identificación y/o clase o todo.

, usted puede obtener este elemento con

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

no está seguro de lo que sucede si usted tiene más de una clase. podría entrar en una matriz o algo, y podría obtener eso con los índices.

+0

@pedalpete - quiero ese texto real "perro gato" - como una cadena –

+0

@pedalpete - creo que tal vez el título de esta publicación es un poco engañoso, pero esperaba que la pregunta en sí fuera más clara. poco ambiguo mirándolo. Lo que quiero es el valor real de la cadena con el que se construyó el selector $ ('perro gato'). –

+0

ha. Eso es realmente bastante inteligente. Desafortunadamente necesito (más de de hecho) para saber cuándo el selector devolvió cero elementos. Estoy tratando de construir mensajes de error más útiles para mi complemento de afirmación http://stackoverflow.com/questions/498469 –

8

Esto está lejos de ser óptimo, pero funciona en algunos casos. Puede hacer lo siguiente:

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'); 
}; 

Esto devolverá el último selector utilizado para el elemento. Pero no funcionará en elementos no existentes.

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

Esto funciona con jQuery 1.2.6 y 1.3.1 y posiblemente otras versiones.

también:

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

Editar
Si marca immidiatly después de que el selector se ha utilizado usted podría utilizar lo siguiente en su plugin:

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); 
}; 

A continuación, el siguiente funcionaría:

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

En su plugin que podría hacer:

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

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

Pero aún así:

$div = $('div'); 
$('foo'); 
$div.myPlugin(); //alerts 'foo' 
+0

ha. eso es realmente bastante inteligente. desafortunadamente, sí necesito (la mayoría de las veces de hecho) saber cuándo el selector devolvió cero elementos. Estoy tratando de construir mensajes de error más útiles para mi complemento de afirmación http://stackoverflow.com/questions/498469 - Simon –

+0

No estoy lo suficientemente despierto como para volver a leer esto ahora. Solo acabo de ver que has actualizado esto. Solo quería llamar la atención a cualquier persona que use este código, que si observa algún error podría deberse a este problema: http://stackoverflow.com/questions/535967/ –

0

no podía encontrar la manera de obtener la referencia al valor de cadena del selector proporcionado a $ interiores (' value_i_want_here ') cuando está vinculado a una función; parece un problema difícil Sin embargo, si prefiere probar en IE [x] siempre hay Firebug Lite que funciona muy bien utilizando console.log (var | val).

2

Esto funcionará si desea acceder a la cadena de selección en su función:

$(this).html(); 

Esto también funciona si el selector múltiple son el uso,

por ejemplo,

$('#id1,#id2').click(function(){ 
    alert($(this).html()); 
}); 
1

Tal vez esto resuelve su problema:

var $jqueryItems = $(".my-selector"); 
console.log($jqueryItems.selector); // display ".my-selector" 
+0

.selector ya no está disponible en jQuery: http://api.jquery.com/selector/ –

1

Para aquellos que quieren entrar en su selector de plugins cadena dada a jQuery, me alegro de haber mejorado la gran respuesta dada por @Pim Jager:

  1. A partir de ahora (la última versión 3.2.1), hay 3 argumentos en jQuery.fn.init función - selector, context, root - no dos;
  2. new palabra clave debe agregarse a la declaración de devolución de jQuery.fn.init;
  3. Dentro de su plugin los selectores son devueltos como una cadena llamando $(this).getSelector();

Por último, eso es lo que tengo que trabajar para mí como un encanto:

(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); 

Funciona con jQuery versiones en lo que a mí respecta (de 1.7.0 a 3.2.1).

PS. Funciona bien incluso con jQuery 1.2.3 disponible aquí en stackoverflow también.Así que, supongo, lo siguiente es aceptable para todas las versiones de jQuery si desea obtener la expresión de un selector de jQuery como texto dentro del plugin:

// 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>

Cuestiones relacionadas