21

なぜこのエラーが発生するのですか、どうすれば壊れないようにテストできますか、nullをチェックしようとしましたが、明らかにうまくいきません、ありがとう。

ID をこのように書かないようにアドバイスしないでください。間違っていることはわかっていますが、可能性はあります。

var jsonTest = [
  {
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
  }
];

alert(jsonTest[0].myId); 
// Works - alerts the myId

$('#' + jsonTest[0].myId ).length; 
// Error: Syntax error, unrecognized expression:
// #''''''""""'''''''''''''"#####$'''''
4

4 に答える 4

42

jQuery は、このコードを使用して ID ベースのセレクターを検出します。

characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+"
...
"ID": new RegExp( "^#(" + characterEncoding + ")" ),

この正規表現は for"''''''\"\"\"\"'''''''''''''\"#####$'''''"またはより単純に for で失敗します"'"

クエリ エンジンは制限されていますが、言語が非常に簡潔で、id の妥当性規則が非常に緩いため、それほど驚くことではありません。有効なIDを処理できません。

あらゆる種類の有効な ID を処理できるようにする必要がある場合は、次を使用します。

$(document.getElementById(jsonTest[0].myId))

実際には$('#'+id)、同じ操作に対して役に立たない (そして少し危険な) 解析レイヤーが追加されるだけなので、絶対に使用しないでください。

于 2013-03-11T12:39:13.860 に答える
8

私があなたの質問を理解した場合、あなたの ID には特殊文字が含まれています。基本的にそれらをエスケープする必要があるため、クエリセレクターではなくリテラル文字として扱われます。

メタ文字 ( !"#$%&'()*+,./:;<=>?@[]^`{|}~ など) を名前のリテラル部分として使用するには、 2 つのバックスラッシュでエスケープする必要があります: \. たとえば、id="foo.bar" を持つ要素は、セレクター $("#foo\.bar") を使用できます。

...そしてこの場合、文字列区切り文字の追加のエスケープレベルも必要です". クレイジーですが、これは機能します:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript"><!--
jQuery(function($){
    console.log( $("#" + "\\'\\'\\'\\'\\'\\'\\\"\\\"\\\"\\\"\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\\"\\#\\#\\#\\#\\#\\$\\'\\'\\'\\'\\'").length );
});
//--></script>
</head>
<body>

<div id="''''''&quot;&quot;&quot;&quot;'''''''''''''&quot;#####$'''''">Foo</div>

</body>
</html>

編集:もちろん、dystroy の回答 — jQuery 選択エンジンを省略して使用getElementByID()— の方がはるかに実用的です。jQuery のマニュアルは、これおよびその他の関連する手法をカバーする興味深いブログ エントリにリンクしています。

document.getElementById() および document.getElementsByClassName() のような同様の関数は、HTML で使用されている方法で、エスケープされていない属性値を使用できます。もちろん、最終的に有効な JavaScript 文字列になるように、引用符をエスケープする必要があります。

于 2013-03-11T13:07:12.450 に答える