2014-07-25 13 views
7

tôi là tạo ra một cấu trúc dom trong đó bao gồm một yếu tố SVG:SVG Sẽ không hiển thị cho đến khi tôi chỉnh sửa các yếu tố trong các công cụ nhà phát triển Chrome

<div data-bind="with: searchable_select.f0000001" style="verticalAlign: top"> 
    <input data-bind="value: select_filter_value, valueUpdate: 'afterkeydown', event: { change: change_filter_, blur: blur_filter_ }" style="display: none"> 
    <div> 
    <select data-bind="options: select_list, value: working_value, event: { change: change_selector_ }, optionsText: 'label', optionsValue: 'value'" style="display: inline-block; maxWidth: 150px"> 
     <option value="person_full_name_asc">Member Full Name (A-Z)</option> 
     <option value="person_full_name_desc">Member Full Name (Z-A)</option> 
    </select> 
    <svg style="display: inline-block; verticalAlign: middle" width="18" height="18" xmlns="http://www.w3.org/2000/svg" version="1.1"> 
     <g> 
     <circle cx="6" cy="6" r="5" fill="#AAAAAA" stroke="#000000" stroke-width="2"></circle>  
     <path fill="#AAAAAA" stroke="#000000" stroke-width="2" d="M10,10 L17,17"></path> 
     </g> 
    </svg> 
    </div> 
</div> 

Yếu tố svg không thực sự hiển thị. Khi tôi tìm thấy phần tử svg trong các công cụ dành cho nhà phát triển Chrome, cả chiều rộng và chiều cao đều hiển thị bằng 0.

Tôi đã thử xóa thuộc tính kiểu. Tôi đã thử thiết lập chiều rộng và chiều cao trong thuộc tính style.

tôi đã sao chép svg vào một tập tin HTML riêng biệt:

<html> 
<head><title>maggen</title></head> 
<body> 
    <svg style="display: inline-block; verticalAlign: middle" width="18" height="18" xmlns="http://www.w3.org/2000/svg" version="1.1"> 
    <g> 
     <circle cx="6" cy="6" r="5" fill="#AAAAAA" stroke="#000000" stroke-width="2"></circle> 
     <path fill="#AAAAAA" stroke="#000000" stroke-width="2" d="M10,10 L17,17"></path> 
    </g> 
    </svg> 
</body> 
</html> 

đâu nó sẽ hiển thị tốt.

Nếu tôi bọc phần tử svg vào div, phần tử svg sẽ xuất hiện. Thực tế, nếu tôi chỉnh sửa HTML trong các công cụ dành cho nhà phát triển Chrome thì nó sẽ hiển thị.

Vì vậy, vâng, tại sao? Tôi đã thực hiện một tìm kiếm trên Google cho điều này, nhưng hoặc là nó không có hoặc (nhiều khả năng) Google Fu của tôi không phải là nhiệm vụ. Tôi có nghĩa là, chắc chắn, tôi có thể bọc nó trong một div - và có lẽ đó là điều đúng để làm - nhưng tôi không muốn vì sau đó tôi cần phải bọc những thứ khác trong divs và dom sẽ bắt đầu để có được lộn xộn.

EDIT: Trên linh cảm, tôi đã thử chỉnh sửa thuộc tính chế độ xem thành phần tử SVG trong công cụ Chrome. Thì đấy! Các yếu tố có thể nhìn thấy! Mong đợi khi tôi bao gồm thuộc tính khung nhìn khi tạo tài liệu, nó không hiển thị. Vì vậy, tôi đã thử chỉ thêm thuộc tính ngẫu nhiên trong công cụ Chrome vào phần tử SVG. Thì đấy! Element có thể nhìn thấy! Vì vậy, tôi nghĩ, sự cố dành riêng cho Chrome và đã thử chạy nó trong Firefox ...

... nơi phần tử không hiển thị.

CHỈNH SỬA: Tuyệt vời, do đó, bao gói trong div không được đảm bảo để hiển thị. Nhưng thực hiện "chỉnh sửa dưới dạng HTML" trong các công cụ dành cho nhà phát triển Chrome sẽ làm cho công cụ này hiển thị.

EDIT: Vâng, tôi đã làm cho nó hoạt động chính xác và, có, nó hóa ra là một hàm của Javascript tạo các phần tử DOM. Có rất nhiều thứ trong các mã, nhưng tôi có thể đun sôi nó xuống này:

Mã này hoạt động (createElement tạo ra một thẻ và thiết lập thuộc tính dựa trên thông qua các thông số):

var div = this.createElement(
    'div', 
    element_name + '_div', 
    null, style_options, null, null 
); 

div.innerHTML = [ 
    '<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width=' + width + ' height=' + height + '>', 
    svg_xml.join(''), 
    '</svg>' 
].join(''); 

if (parent) parent.appendChild(div); 
return div; 

Mã này doesn 't:

var svg = this.createElement('svg', element_name, null, style_options, classlist, { 
    viewport: '0 0 ' + width + ' ' + height, 
    version: "1.1", 
    xmlns: "http://www.w3.org/2000/svg", 
    width: width, 
    height: height 
}); 

svg.innerHTML = svg_xml.join(''); 

if (parent) parent.appendChild(svg); 
return svg; 

Vì vậy, chắc chắn, tôi đã có một số việc đang hoạt động, nhưng tôi không hiểu tại sao. Hoặc nhiều hơn vào vấn đề này, tôi không hiểu tại sao một cách làm việc và cái kia thì không. Tôi có một vài dự đoán, nhưng chúng chỉ là những dự đoán hoang dã.

+0

đã bạn đã cố gắng làm việc rộng thuộc tính Viewbox? Ví dụ. Matthias

+1

Bạn cần phải thêm mã mà bạn đã viết để tạo các phần tử DOM, nếu không bạn sẽ yêu cầu chúng tôi ghi nhớ vấn đề là gì và chúng tôi không quá giỏi cái đó. –

+0

Thực ra tôi đã thử sử dụng thuộc tính viewBox. Không có sự khác biệt. Tôi đoán tốt nhất vào thời điểm này đã làm với khi các yếu tố thực sự được trả lại. – aikimcr

Trả lời

13

"Tôi có một số thứ đang hoạt động, nhưng tôi không hiểu tại sao".

Vấn đề là các phương pháp bạn đang sử dụng không tạo phần tử SVG trong không gian tên SVG. Thuộc tính xmlns chỉ ảnh hưởng đến hành vi của một trình phân tích cú pháp XML, không ảnh hưởng đến các phương thức DOM.

Tôi không chắc chắn mà thư viện bạn đang sử dụng cho phương pháp this.createElement() với nhiều tham số. Tuy nhiên, tôi nghi ngờ nó có thể bắt đầu bằng cách gọi phương thức cơ bản document.createElement(tagName). Đây là những gì MDN says about the standard DOM createElement method:

Trong tài liệu HTML tạo phần tử HTML được chỉ định hoặc HTMLUnknownElement nếu phần tử không xác định. ... Trong các tài liệu khác, tạo một phần tử với một không gian tên là null.

Nói cách khác, vì bạn (có lẽ là gián tiếp) gọi createElement trên tài liệu HTML, nó luôn tạo thành phần tử HTML. Một phần tử HTML có tên thẻ "svg" chỉ được coi là phần tử kiểu span không xác định.

Ngược lại, việc sử dụng div.innerHTML để chuyển chuỗi đánh dấu tạo thành phần SVG chính xác vì nó gọi trình phân tích cú pháp HTML5 để tìm ra loại phần tử nào cần tạo. Không gian tên được xác định bằng cách sử dụng các quy tắc giống như khi phân tích cú pháp đánh dấu từ một tệp. Chỉnh sửa HTML trong công cụ dành cho nhà phát triển Chrome có cùng tác dụng.

Sidenote: Tránh gọi .innerHTML trên phần tử SVG. Một số trình duyệt hỗ trợ nó, nhưng nó không phải là một phần của thông số kỹ thuật. Bạn sẽ không nhận được một lỗi bởi vì biến svg của bạn thực sự là một thể hiện của HTMLUnknownElement. Đi qua đang SVG với phương pháp innerHTML của một phụ huynh <div> thường làm việc, mặc dù có một số lỗi với SMIL hoạt hình. Như @Robert longson nói trong các ý kiến, bạn có thể sử dụng DOMParser object để phân tích hoặc mã HTML hoặc XML vào một tài liệu.

Cách khác để tạo động một phần tử SVG là sử dụng document.createElementNS(namespaceURI, tagName). Bạn cũng sẽ phải sử dụng phương pháp này để tạo tất cả các phần tử con của SVG. Một khi chúng được tạo ra, bạn có thể thiết lập các thuộc tính, kiểu dáng và các lớp bằng cách sử dụng các phương thức thư viện của bạn. (Nhưng bạn chưa xác định những gì thư viện bạn đang sử dụng, vì vậy tôi không chắc chắn.)

+0

Tôi thực sự không sử dụng thư viện. Đó là tất cả của riêng tôi. Nhưng nó chỉ là những gì bạn mô tả, do đó, giải thích của bạn là chính xác những gì tôi cần. Nó giải thích rõ vấn đề. Tôi cũng sẽ thử nghiệm với createElementNS cho việc này. Cảm ơn. – aikimcr

+0

Điều cần biết. Vì đó là chức năng của riêng bạn, nên khá đơn giản để thích nghi. – AmeliaBR

Các vấn đề liên quan