2017-03-06 4 views
2

ich den folgenden Code verwenden müssen, die ich von einem anderen SO Frage stahl,Der Versuch, eine Zeichenfolge zu entkommen als jQuery-Selektor

$('#'+'^`test'.replace(/[!"#$%&'()*+,.\/:;<=>[email protected][\\\]^`{|}~]/g, "\\\\$&")) 

, die den folgenden Fehler erzeugt.

Uncaught Error: Syntax error, unrecognized expression: #\\^\\`test(…)

Ich habe nur einige IDs mit verrückten Charakteren, wie^und `, dass ich jQuery müssen nicht ersticken. Ich verstehe nicht, warum dieser Fehler passiert, denn wenn ich manuell die Schrägstriche in den String wie hinzufügen,

$('#'+'\\^\\`test') 

dann es funktioniert gut. Was stimmt nicht mit der Regex-Methode?

Antwort

3

I just have some IDs with crazy characters, like^and `, that I need jQuery to not choke on.

Der mit Abstand einfachste Weg, das zu adressieren ist mit einem Attributselektor:

$('[id="' + theId + '"]').doSomething(); 

Solange theId nicht Schrägstriche oder doppelte Anführungszeichen enthält, keine Notwendigkeit für weitere entkommen.

+0

Interessant, ich frage mich, wie das funktioniert. Ich denke, ich werde mit getElementById gehen, aber ich denke, das ist die direkteste Antwort auf meine Frage. – Moss

+0

@Moss: Es ist ein [Attributwertselektor] (https://www.w3.org/TR/css3-selectors/#attribute-representation). Aber ja, 'getElementById' ist ein großartiger Ansatz (warum habe ich es nicht erwähnt ?!), wenn IDs" wild "sein können. '$ (document.getElementById (theId)). doSomething();' –

+0

Was bedeutet, ich verstehe nicht, wie Ihre Lösung funktioniert, aber mein erster Versuch nicht. Etwas speziell für jQuery? – Moss

0

Sie benötigen 2 mal die Flucht. Becuse zuerst das Ersetzen/Regex muss die Escape, um ein Escape zu schreiben. Die nächste Escape ist von jQuery durch $() benötigt.

Weitere klare Syntax wie die postet regex ist:

"#^bla`".replace('^','\\\^').replace('`','\\\`'); 

ersetzen wird "#^bla`" auf "# \\^bla \\`".

Uncaught Error: Syntax error, unrecognized expression: #\\^\\`test(…)

Wenn Sie Ihren regulären Ausdruck verwenden wollen, müssen Sie auch entkommen [] mit \ [und \].

"+".replace(/[!"#$%&'()*+,.'()*+,.\/:;<=>[email protected]\[\\\]^`{|}~]/g, "yes") 
2

Eine weitere Arbeit um ist die Vanille getElementById, zu verwenden, die nicht den Wähler nicht analysieren. Auf diese Weise haben Sie immer noch die Effizienz der Auswahl durch die ID:

let res = $(document.getElementById('^`test')); 
+0

Doh! Na sicher. –

+0

Warnung an lurkers: 'Let' ist ES2015 +, es wird nicht in einigen Browsern in der Wildnis funktionieren. –

0

Wie wäre es mit dieser?

const $ID = function(selector){ 
    return $('[id="' + selector.match(/#?(\S+)/)[1] + '"]') 
} 

Dann können Sie es genauso wie jquery verwenden

$ID('#^`div') 
Verwandte Themen