2012-06-27 6 views
6

Tôi đang sử dụng một mã mà trông như thế:jquery.width return 0 trên hình

img.load(function(){ 
    // do some stuff 
    $(this).width(); 

}); 

Trong callback của tôi kích thước hình ảnh luôn luôn là 0. Nó có thể có cái gì để làm với nó, nhưng hình ảnh của tôi là được tải cục bộ.

Nhưng trong thực tế, nếu tôi làm điều này.độ rộng, tôi sẽ nhận được chiều rộng dự kiến ​​và sau đó tôi có thể làm một số loại tính toán từ đây để thay đổi cửa sổ extjs của tôi.

Sau một số lần thử, tôi nhận ra rằng nếu tôi làm $ (điều này) tất cả các thuộc tính tôi thay đổi dường như không có bất kỳ hiệu ứng nào cả.

làm $(this).width(40); sẽ không thay đổi chiều rộng của hình ảnh nhưng làm this.width = 40 sẽ thay đổi chiều rộng của hình ảnh của tôi. Nó giống như làm $(this) đang sao chép HTMLImageElement của tôi trong một phần tử mới và những thay đổi đó sẽ chỉ được áp dụng nếu tôi thêm vào dom một lần nữa để thay thế hình ảnh cũ.

Tôi không biết chắc điều gì đang xảy ra ở đó.

Sửa

Đây là những gì biến img tôi chứa.

img = $('<img>'); 
img.attr('src', '....image'); 

Chỉnh sửa 2

này không thực sự thay đổi thực tế rằng jQuery không xử lý kích thước hình ảnh cho hình ảnh trong bộ nhớ nhưng tôi cảm thấy nó sẽ là tốt cho bất cứ ai sử dụng ExtJS để không lặp lại của tôi lỗi. Một trong những vấn đề lớn trong trường hợp của tôi là đối tượng img tôi đã sử dụng là một đối tượng hợp lệ nhưng vì tôi đang sử dụng ExtJs, tôi vô tình tạo ra một sai lầm ngu ngốc. Tôi đã tạo cửa sổ của mình theo cách đó ...

Ext.create('Ext.Window', 
    // some settings 
    items: [{ 
     html: img.wrap('<div>').parent().html(), 
    // etc 

Nói cách khác, sự kiện tôi đã tạo là img, nhưng tôi chưa bao giờ thực sự thêm img vào DOM. ExtJs đã thêm văn bản html vào DOM đã tạo ra một đối tượng mới không thể sửa đổi thông qua sự kiện và vân vân.

Vì vậy, tôi phải tạo một id để tìm phần tử mới và tất cả điều này phải được thực hiện sau khi thực hiện cuộc gọi đến modalWindow.show(). Sau đó mọi thứ hoạt động hoàn hảo.

Để thay đổi kích thước cửa sổ, nếu kích thước được đặt, bạn có thể đặt chúng trở lại null và thực hiện cuộc gọi doLayout trên cửa sổ và nó sẽ tính toán lại cửa sổ.

+1

Bạn có thể đăng HTML được liên kết không? Ngoài ra, bạn sẽ không cần jQuery cho điều này. Bạn sẽ có thể truy cập thuộc tính bằng javascript thẳng – pixelbobby

+1

Giá trị của biến 'img' trong mã đó chính xác là gì? Nó được thiết lập như thế nào, nói cách khác? – Pointy

+0

Tham số đầu tiên của ['.load()'] (http://api.jquery.com/load/) phải là URL bạn muốn tải, sau đó là hàm đầy đủ. 'Img' là gì? – sachleen

Trả lời

3

Bạn phát hiện ra rằng jQuery(this).width() không hoạt động đối với hình ảnh trong bộ nhớ. Các lựa chọn là sử dụng this.width/height hoặc nối nó vào trang và đọc nó.

+0

vì vậy tôi đang mắc kẹt với việc sử dụng this.width và this.height như tôi không thể thêm nó vào trang một lần nữa? –

+0

Có bạn cần phải sử dụng this.width, bạn có thể sử dụng attr() nếu bạn thực sự muốn. Nó không phải là một vấn đề lớn ở đây. – epascarello

+0

Tôi đoán vậy, tôi đã thấy một nhận xét về jQuery.width có niên đại từ một năm trước nói cùng một điều. Đó là một hành vi kỳ lạ. Nó phải có một cái gì đó để làm với bố trí và làm thế nào được tính kích thước nhưng vẫn còn một hình ảnh không thực sự phụ thuộc vào bất cứ điều gì khác hơn là bản thân và css –

3

Tôi nghĩ bạn nên cố gắng này ...

$("img").load(function(){ 
    // do some stuff 
    $(this).width(); 

}); 

giả sử bạn đang sử dụng thẻ img chỉ. trong trường hợp nếu bạn có id của thẻ img thì bạn nên sử dụng cho ví dụ: $ ("# idimg) .load (vui vẻ ...... tiếp tục.)

+0

Tôi đang tạo thẻ –