javascript - name - ¿Puedo forzar a jQuery a usar Sizzle para evaluar un selector sin utilizar selectores no estándar?
jquery selector (3)
En los navegadores modernos, jQuery utiliza document.querySelectorAll()
para aumentar el rendimiento cuando se usan selectores CSS válidos. Se recurre a Sizzle si un navegador no admite el selector o el método document.querySelectorAll()
.
Sin embargo, me gustaría utilizar siempre Sizzle en lugar de la implementación nativa al depurar un selector personalizado. A saber, estoy tratando de encontrar una implementación de :nth-last-child()
, uno de los selectores CSS3 que no son compatibles con jQuery . Dado que este selector es compatible de forma nativa con los navegadores modernos, funciona como se describe en la pregunta vinculada. Sin embargo, es precisamente este comportamiento el que interfiere con la depuración de mi selector personalizado, así que me gustaría evitarlo.
Un truco barato que puedo usar es colocar una extensión de selector jQuery no estándar, lo que "invalida" el selector por así decirlo. Por ejemplo, suponiendo que cada li:nth-last-child(2)
es visible , simplemente puedo soltar eso, convirtiendo esto:
$(''li:nth-last-child(2)'').css(''color'', ''red'');
Dentro de esto:
$(''li:nth-last-child(2):visible'').css(''color'', ''red'');
Esto hace que siempre sea evaluado por Sizzle. Excepto, esto requiere que haga una suposición de mis elementos de página que pueden o no ser cierta. Y realmente no me gusta eso. Sin mencionar, no me gusta usar selectores no estándar en general a menos que sea absolutamente necesario.
¿Hay alguna manera de omitir el método document.querySelectorAll()
nativo en los navegadores que lo soportan y forzar a jQuery a usar Sizzle para evaluar un selector en su lugar, que preferiblemente no emplea el uso de selectores no estándar? Probablemente, esto implica llamar a otro método en lugar de $()
, pero es mucho mejor que un selector piratear la OMI.
Como usted mismo está desarrollando el código para el selector, ¿no podría simplemente darle un nombre personalizado para la duración del ciclo de desarrollo? Tal vez darle su propio prefijo de proveedor o algo así? -bolt-nth-last-child()
De esta forma, sabrá que el navegador definitivamente no lo admitirá, por lo que siempre debería caer en el uso de Sizzle.
Cuando haya terminado con el ciclo de desarrollo, puede soltar el prefijo -bolt-
.
Sé que es más una solución que una respuesta a la pregunta, pero parece ser la solución más simple para mí.
Parece que jQuery.find
defecto en chisporroteo. Esto le evitará destruir su entorno al establecer una función nativa en nulo.
https://github.com/jquery/jquery/blob/master/src/sizzle-jquery.js#L3
Por lo tanto, debería poder hacer lo siguiente y siempre pasará chisporroteo.
$.find(''li:nth-last-child(2)'')
Puede establecerlo en null
antes de que jQuery se cargue, por lo que cree que no es compatible:
document.querySelectorAll = null;
//load jquery, will trigger not supported branch
//Optionally restore QSA here (save a reference) if needed
Se supone que esto hace que esta evaluación sea false
Demostración: http://jsbin.com/asipil/2/edit
Comente la línea null
y vuelva a ejecutar, y verá que se volverá roja.