2013-02-20 27 views
7

Tôi đã gặp sự cố khi sử dụng offsetWidth trên các trình duyệt khác nhau. Sự khác biệt trong kết quả này gây ra một số bố trí lạ. Tôi đã tạo ra một ví dụ rất nhỏ hiển thị những gì tôi đang nhìn thấy.Cross Browser offsetWidth

jsbin

HTML

<table id="tbl"> 
    <tr> 
    <td>Cell 1</td> 
    <td>Cell 2</td> 
    </tr> 
</table> 
<button onclick="calc()">Calculate Offset Width</button> 

<div>Cell 1 offsetWidth: <span id="c1offWidth"></span></div> 

js

function calc(){ 
    document.getElementById('c1offWidth').innerHTML = 
     document.getElementById('tbl').children[0].children[0].offsetWidth; 
} 

CSS

Erik Meyer's Reset CSS

Khi tôi chạy trên Chrome, Safari, và opera giá trị trả về cho chiều rộng bù di động 1 là 72. Khi tôi chạy trên firefox và IE9-10 giá trị trả về là 77.

tôi theo ấn tượng, đây là cách tốt nhất để tính toán chiều rộng của một phần tử bao gồm phần đệm và đường viền.

Có giải pháp trình duyệt chéo nào sẽ luôn trả về cùng một kết quả không? Tôi đã thử sử dụng jQuery nhưng kết quả thậm chí còn khó hiểu hơn.

CHỈNH SỬA Vì mọi người đều đề xuất outerWidth Tôi cũng đã tạo một jsbin cho điều đó. Kết quả vẫn khác nhau giữa các trình duyệt. Chrome trả về 36; IE9-10 và Firefox trở lại 39.

jsbin updated

+0

Chúng vô lý của rất nhiều lập trình không biết gì khi sử dụng jQuery như chơi doh khi chúng ta nên sử dụng điêu khắc đất sét! Sử dụng JS gốc không phải là một số thư viện hog tài nguyên như jQuery. Làm bài kiểm tra jsperf của bạn! – EasyBB

+0

Ah vâng, kỹ thuật tập tin 1 toàn cầu cũ 1. http://www.avacweb.com/17860.js. Mô hình tuyệt vời để làm chậm người dùng của bạn. – BradGreens

Trả lời

4

Vì bạn đã gắn thẻ bài đăng với jQuery, tôi cho rằng giải pháp jQuery có thể chấp nhận được. Có gì sai với outerWidth()?

Ví dụ:

function calc() 
{ 
    var the_width = $('#tbl tr:eq(0) td:eq(0)').outerWidth(); 
    $('#c1offWidth').html(the_width); 
} 

Sử dụng jQuery mang lại một số lợi thế cho bảng (như bạn có thể nhìn thấy bởi số lượng giảm của mã cần thiết ở trên). Bạn cũng nên cân nhắc việc sử dụng trình xử lý sự kiện không xâm phạm. Ví dụ, loại bỏ các thuộc tính onclick từ button của bạn, và làm điều này:

$(function() { 
    $('button').click(function() { 
     var the_width = $('#tbl tr:eq(0) td:eq(0)').outerWidth(); 
     $('#c1offWidth').html(the_width); 
    }); 
}); 

Hãy xem jsFiddle demo.

+0

Các giải pháp jQuery chắc chắn được chấp nhận! Thật không may, bản demo này đã trả về 36 trong Chrome nhưng 39 trong IE. Điều này dường như không giải quyết được vấn đề –

+0

Nó cũng trả về 39px trong Firefox. Nó không phải là một vấn đề với chức năng - nó trả về giá trị chính xác. 'Vấn đề' là cách mà các trình duyệt khác nhau hiển thị các phần tử theo mặc định. Ví dụ, nếu bạn chỉ định chiều rộng cố định cho '# tbl', kết quả được chuẩn hóa> http://jsfiddle.net/H2uGz/2/ – BenM

+0

Một phần của vấn đề là tất cả các hàm outerWidth và offsetWidth làm tròn các giá trị được trả về. Điều này đã được giảm nhẹ bằng cách thiết lập một chiều rộng trên bàn như bạn đề nghị. –

3

offsetWidth là không đáng tin cậy qua trình duyệt. Tôi khuyên bạn nên sử dụng jQuery's outerWidth() để thay thế.

$("#your-element").outerWidth(); 

Xem DEMO.

0

Bạn có thể sử dụng jQuery .outerWidth() nếu bạn cần để có được chiều rộng tính toán trên nhiều trình duyệt bao gồm những thứ như biên giới và lề.

4

Sự cố thực tế trong ví dụ của bạn là trong các trình duyệt khác nhau sử dụng phông chữ mặc định khác nhau để hiển thị. Và kích thước hộp cho các ô của bạn được xác định bởi nội dung. Nếu bạn đặt chiều rộng xác định cho phần tử (như được nêu chính xác trong một trong các nhận xét), bạn sẽ nhận được kết quả xác định và bằng nhau.

ps: không thể đăng nhận xét ...

+3

Thực tế, tôi nghĩ rằng đây phải là câu trả lời được chấp nhận! Tất cả các câu trả lời "blabla-use-jquery" khác không giải quyết được vấn đề dưới bất kỳ hình thức nào. Như thể jQuery sẽ trả về một chiều rộng khác - mà nó không, tất nhiên. –