Селектор класса jQuery для SVG в XHTML - PullRequest
2 голосов
/ 03 мая 2011

Следующий код работает (в консоли вы можете видеть два сообщения журнала в качестве обнаруженных элементов), если файл назван как * .html, но элементы не выбраны, если я назову * .xhtml.Почему они ведут себя по-разному?Проблема только в том случае, если имя класса включено в селектор, поэтому $("#cvs rect") работает в обоих случаях,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head> 
<title>Test</title>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
</head><body>
  <svg id="cvs" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 200 100" version="1.1" baseProfile="full">
    <rect class="drag resize" x="50" y="30" width="50" height="30" />
    <rect class="drag resize" x="5"  y="5"  width="90" height="50" />
  </svg>
  <script>
    $(document).ready(function() {  
      $("#cvs rect.resize").each(function() {
        console.log("selected");
      }); 
    }); 
  </script>
</body></html>

Ответы [ 3 ]

7 голосов
/ 04 мая 2011

Это похоже на ошибку в jQuery или Sizzle.Вот урезанный тестовый пример, показывающий проблему:

<html xmlns="http://www.w3.org/1999/xhtml"><head> 
  <meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" /> 
  <title>Create SVG Elements HTML</title> 
</head><body> 
  <svg xmlns="http://www.w3.org/2000/svg"> 
    <circle r="200" class="face" fill="red" /> 
  </svg> 
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>
  <script type="text/javascript"><![CDATA[
    console.log( document.getElementsByClassName('face').length );    // 1
    console.log( document.querySelectorAll('circle.face').length );   // 1
    console.log( $('circle').length );                                // 1
    console.log( $('.face').length );                                 // 0
    console.log( $('circle.face').length );                           // 0
    console.log( $('circle[class~="face"]').length );                 // 1
  ]]></script> 
</body></html>

Результаты одинаковы для Chrome v11, Firefox v4, Safari v5 и IE9.

Проблемапохоже, что jQuery неправильно запрашивает атрибуты class для элементов в другом пространстве имен.Используя селектор «атрибут содержит слово» ~=, вы можете использовать jQuery для поиска этих элементов.

Редактировать : основная причина этого, вероятно, задокументирована в этот ответ ;Итак, проблема в том, что SVG DOM указывает, что атрибут class (как и у многих других) - это не статическое значение, доступное через className, а скорее SVGAnimatedString, который имеет свойства .baseVal и .animVal, необходимые дляполучить фактическое строковое значение класса.

0 голосов
/ 13 июля 2011
<rect> 

элементы не являются самозакрывающимися, эти строки необходимо закрывать: -

 <rect> </rect>
0 голосов
/ 03 мая 2011

Я не думаю, что * .xhtml является допустимым расширением; XHTML обычно используется в любом случае в стандартном файле .htm или .html, просто укажите его в типе документа.

http://www.webheadstart.org/xhtml/faq/index.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...