2012-04-30 37 views
22

tôi đang làm việc với tập tin SVG lên được trực tiếp đặt vào một tập tin HTMLTại sao giá trị thuộc tính vỏ bọc của jQuery tự động thấp hơn?

<svg> 
    Contents... 
</svg> 

Sử dụng javascript/jQuery Tôi muốn thêm một thuộc tính cho SVG

$("svg").attr("viewBox", "0 0 166 361"); 

Đây là SVG sửa đổi sau khi chạy đoạn mã trên

<svg viewbox="0 0 166 361"> 
    Contents... 
</svg> 

để ý rằng nó đặt hộp xem không phải hộp xem. Vì khung nhìn (chữ thường) không làm bất cứ điều gì tôi cần nó là hộp xem (camelcase)

Bất kỳ ý tưởng nào?

** Cập nhật **

Tôi chạy một thử nghiệm nhỏ nơi tôi đã hiển thị thuộc tính viewBox từ phía máy chủ, sau đó tôi chạy tập lệnh ở trên. Bạn có thể thấy rằng 1. Khi kết xuất từ ​​phía máy chủ, nó là tốt. 2. jQuery không nhận ra thuộc tính viewel camelCase và chèn một số khác vào tất cả các chữ thường.

<svg version="1.1" id="Layer_1" x="0pt" y="0pt" width="332" 
    height="722" viewBox=" 0 0 100 100" viewbox="0 0 166 332"> 
... 
</svg> 

Trả lời

21

Tôi có thể phụ thuộc vào loại tài liệu mã hóa của bạn. XHTML documents must use lower case for all HTML element and attribute names. Tôi không chắc chắn về HTML.

Cập nhật 2

Giải pháp duy nhất tôi có thể tìm thấy là sử dụng:

$("svg")[0].setAttribute("viewBox", "0 0 166 361"); 

Cập nhật

Tôi không thể giải thích nó vì lý do nào, tôi thử nghiệm trên của tôi máy chủ riêng vì JsFiddle luôn sử dụng XHTML (boo!). Trong mọi trường hợp, nó là chữ thường, nhưng nó vẫn là một phần tử SVG trong FF, Chrome và IE9 (Tôi không biết liệu chúng có hợp lệ không vì tôi không biết SVG tôi sợ).

Firefox Example Chrome Example IE Example

+0

Tôi đã thay đổi tệp HTML của mình thành để xem liệu điều đó có giúp ích gì hay không. http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute đây là tham chiếu đến thuộc tính viewBag. Bất kỳ ý tưởng nào khác? –

+0

Cập nhật 2, cần phải sử dụng Javascript được xây dựng trong setAttribute Tôi đoán: ( –

+0

Điều đó làm việc. Cảm ơn! –

-3

bạn thể sử dụng nó. Tôi đoán bạn đang nhìn thấy nó trong tức là nhà phát triển công cụ thanh

nó tốt

nó chỉ hiển thị nó thành chữ thường

nhưng nếu bạn cố gắng để cảnh báo giá trị trường hợp lạc đà - bạn SẼ thấy một kết quả.

cố gắng làm:

alert(("svg").attr("viewBox")); 
+0

Vì vậy, khi tôi chạy cảnh báo nó mang lại cho tôi trở lại giá trị của viewBox không có vấn đề nếu nó là trường hợp thường xuyên hoặc trường hợp lạc đà. các thuộc tính không tồn tại trên các yếu tố và tôi thêm nó bằng cách sử dụng phương pháp này nó đặt nó trong chữ thường –

+0

'(" svg "). attr (" viewBox ")' hiển thị giá trị của "viewbox". – Dinoboff

1

http://docs.jquery.com/Won't_Fix#SVG.2FXML.2FVML_Bugs

jQuery nhận ra rằng họ ToLower tất cả các tên thuộc tính nhưng không quan tâm đến những ngoại lệ/xóa dòng này như lỗi liên quan đến SVG được bỏ qua (các ToLower là không cần thiết theo ý kiến ​​của tôi).

3

Vì html không phân biệt chữ hoa và thẻ xhtml và thuộc tính nên viết hoa chữ thường, jQuery chuyển đổi tên thuộc tính thành chữ thường. Vì xml phân biệt chữ hoa chữ thường, đây là vấn đề đối với ngôn ngữ xml được nhúng khi chúng sử dụng tên thuộc tính trường hợp camel như SVG.

Bạn có thể sử dụng các móc jQuery để xử lý các tên thuộc tính mà bạn muốn trường hợp không được chuyển đổi. Nếu jQuery tìm thấy jQuery.attrHooks[attributename].set để đặt, nó sẽ sử dụng nó để đặt thuộc tính. Tương tự cho jQuery.attrHooks[attributename].get khi cố gắng truy xuất giá trị thuộc tính. Ví dụ:

['preserveAspectRatio', 'viewBox'].forEach(function(k) { 
    $.attrHooks[k.toLowerCase()] = { 
    set: function(el, value) { 
     el.setAttribute(k, value); 
     return true; // return true if it could handle it. 
    }, 
    get: function(el) { 
     return el.getAttribute(k); 
    }, 
    }; 
}); 

Bây giờ jQuery sẽ sử dụng setter/getters để thao tác các thuộc tính đó.

Lưu ý: el.attr('viewBox', null) sẽ không thành công; hook setter của bạn sẽ không được gọi. Thay vào đó bạn nên sử dụng el.removeAttr ('viewBox').

+0

Trong khi phương thức này hoạt động, nó không ngăn cản hành vi cũ xảy ra.Vì vậy, một phần tử sẽ kết thúc với cả thuộc tính 'viewbox' và' viewBox'. Không phải là nó sẽ không hoạt động, nhưng nó không phải là sạch như nó có thể được –

+0

Tôi đã không nhận thấy.Hãy nhìn vào 'jQuery.fn.attr', nó sẽ đại biểu thiết lập các thuộc tính để móc. Làm thế nào nó thiết lập một phiên bản trường hợp thấp hơn của thuộc tính quá? https: // githu b.com/jquery/jquery/blob/master/src/attributes/attr.js#L40-L73 – Dinoboff

+1

@JasmineHegman Đã sửa lỗi. jquery mong đợi setter trả về true nếu thiết lập thuộc tính thành công – Dinoboff

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