1

次の HTML ページがあるとします。

<html>
  <head>
    <script type="text/javascript">
      function echoValue(){
        var e = document.getElementById("/path/&#x24;whatever");
        if(e) {
          alert(e.innerHTML);
        }
        else {
          alert("not found\n");
        }
      }
    </script>
  </head>
  <body>
    <p id="/path/&#x24;whatever">The Value</p>
    <button onclick="echoValue()">Tell me</button>
  </body>
</html>

ブラウザは ID 文字列/path/&#x24;whateverを単純な文字列として扱うと思います。実際には、&#x24;をレンダリングされた表現 ( $) に変換します。

ただし、JavaScript コードはリテラル文字列を使用&#x24;して要素を検索します。そのため、呼び出しdocument.getElementByIdは失敗し、段落の値を取得することはありません。

指定された ID 文字列を文字通り使用するようブラウザに強制する方法はありますか?


編集:
もちろん、. をエスケープする必要がないことはわかっています$。しかし、Web ページが生成され、ジェネレーターがエスケープを行います。だから、私は自分が持っているものに対処しなければなりません。

4

3 に答える 3

5

では<p id="...">&#x24;シーケンスは として解釈されます。これは、シーケンスが$属性に表示され、HTML エンティティとして扱われるためです。他のすべての要素属性についても同様です。

要素では<script>、HTML エンティティはまったく解釈されないため、文字どおりに表示されます。

于 2013-01-25T09:56:19.667 に答える
2

jQuery を使用せずに JavaScript テキストをデコードしてみることができます。

<html>
  <head>
    <script type="text/javascript">
      function decodeEntity(text){
        text = text.replace(/<(.*?)>/g,''); // strip out all HTML tags, to prevent possible XSS
        var div = document.createElement('div');
        div.innerHTML = text;
        return div.textContent?div.textContent:div.innerText;
      }
      function echoValue(){
        var e = document.getElementById(decodeEntity("/path/&#x24;whatever"));
        if(e) {
          alert(e.innerHTML);
        }
        else {
          alert("not found\n");
        }
      }
    </script>
  </head>
  <body>
    <p id="/path/&#x24;whatever">The Value</p>
    <button onclick="echoValue()">Tell me</button>
  </body>
</html>

JSFiddle: http://jsfiddle.net/phTkC/

于 2013-01-25T10:33:46.510 に答える
0

JavaScriptコードでHTMLエンティティをデコードすることをお勧めします。

<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
    <script type="text/javascript">
      function echoValue(){
        var decoded_string = $('<div />').html("/path/&#x24;whatever").text();
        var e = document.getElementById(decoded_string);
        if(e) {
          alert(e.innerHTML);
        }
        else {
          alert("not found\n");
        }
      }
    </script>
  </head>
  <body>
    <p id="/path/&#x24;whatever">The Value</p>
    <button onclick="echoValue()">Tell me</button>
  </body>
</html>
于 2013-01-25T10:08:34.430 に答える