2013-04-16 27 views
10

Tôi không thể sử dụngSử dụng jquery trong GWT jsni

$("#"+profileId).offset().top 

từ bên trong chức năng jsni gwt tôi. Tôi đã thử điều này

$wnd.$("#"+profileId).offset().top 

nhưng điều này cũng không hoạt động. Tôi cảm thấy tôi đang thiếu cú ​​pháp ở đây. Ai đó có thể giúp

+0

toàn bộ mã của phương thức jsni (kiểu trả về, thông số, v.v.) là gì? bạn đang tải jquery.js trong index.html của mình? Bạn có nhận được bất kỳ lỗi nào khi mã của bạn được thực thi không? –

Trả lời

12

Ba giải pháp cho câu hỏi này:

1- đang Jsni của bạn có vẻ tốt đẹp ngoại trừ việc bạn phải đặt nó bên trong tương ứng hàm gốc và trả về một dấu hai (hoặc bất kỳ kiểu số nào khác nếu bạn muốn gwt tạo phép đúc).

native double getTop(String profileId) /*-{ 
    return $wnd.$("#" + profileId).offset().top; 
}-*/; 

Nếu bạn muốn xem lỗi thông qua bạn UncaughExceptionHandler bạn nên quấn mã của bạn trong một khối $entry

native double getTop(String profileId) /*-{ 
    return $entry(function(data) { 
    return $wnd.$("#" + profileId).offset().top; 
    }); 
}-*/; 

2- Nhưng, thay vì sử dụng jQuery, tôi khuyến khích bạn sử dụng gwt-query aka gQuery. Vì vậy, bạn không cần phải tải jQuery trong .html của bạn và yo không cần phải đối phó với jsni trong ứng dụng của bạn.

Với gQquery bạn có cú pháp jQuery giống nhau nhưng trong java, vì vậy bạn có kiểu an toàn, tái cấu trúc, kiểm thử .... Nhưng ngoài ra, bạn sẽ có hàng tá tiện ích (ajax đơn giản, lời hứa, bộ chọn, v.v ...) không nằm trong lõi gwt.

gQuery là một thư viện trọng lượng nhẹ, được viết lại hoàn toàn từ đầu trong gwt. Nó không phải là một wrapper của thư viện jQuery (như được nói không chính xác trong câu trả lời khác), bạn không cần phải bao gồm jquery.js trong các trang của mình.

Giống như với bất kỳ thư viện gwt nào khác, trình biên dịch gwt sẽ loại bỏ bất kỳ thứ gì bạn không sử dụng từ gquery. Trong cách tiếp cận của bạn, ứng dụng của bạn phải tải tất cả các thứ jquery.

Vì vậy, trong trường hợp của bạn, và sử dụng gquery viết mã này trong các lớp học java của bạn:

import static com.google.gwt.query.client.GQuery.*; 
... onModuleLoad() { 
    int top = $("#"+profileId).offset().top; 
} 

3- Cuối cùng, bạn có tùy chọn sử dụng mã gwt tinh khiết để có được những bù đắp của một phần tử, nếu bạn biết id của nó:

int top = DOM.getElementById(profileId).getOffsetTop(); 
+0

Tại sao nó "gấp đôi" trong phương pháp JSNI và "int" trong GQUERY và GWT ??? –

+0

Tùy chọn 3 đang hoạt động..Cảm ơn bạn rất nhiều ... – javalearner

+0

JS chỉ có một loại cho số, vì vậy cách tự nhiên để trả về một số từ jsni đang sử dụng gấp đôi, nếu không gwt phải xử lý việc truyền (tất nhiên bạn có thể thay đổi chữ ký phương thức và trả về một int và để lại gwt làm việc đúc). Gquery trả về một int bởi vì nó là 'getOffsetTop()' trả về trong GWT và chúng ta ủy nhiệm nó để tính toán đầu trang của các phần tử –

0

Tôi giả sử bạn đã thêm thư viện jquery jquery vào trang lưu trữ của mình.

Cú pháp đúng là

private native int myJquery() /*-{ 
    $wnd.$(function() {   //may be you forgot this line 
    return $wnd.$("#"+profileId).offset().top; 
    }); 
}-*/; 

Và giả sử bạn chỉ mới bắt đầu sử dụng jquery trong GWT.

tôi gợi ý mạnh mẽ thư viện trọng lượng nhẹ của bên thứ ba

GWTQuery

+0

Cảm ơn thông tin. Tôi đang cố gắng trả về giá trị từ hàm jsni như thế này. nhưng tôi không thể làm được. 'Code'public tĩnh bản địa int getIFrameTop (String profileId)/* -... { \t \t $ wnd $ (function() { \t \t return $ wnd $ ("#" + profileId) .offset() đầu \t \t}); \t} - * /; 'mã' – javalearner

+0

cập nhật câu hỏi với mã đầy đủ của bạn và bạn có chắc chắn rằng điều khiển của bạn đến bên trong JNSI? Kiểm tra bằng cách đặt cảnh báo trong dòng đầu tiên –

+0

@Baddshah nhầm lẫn: GWTQuery không một wrapper của jquery, gwtquery là một thư viện hoàn toàn được viết bằng gwt. Bạn đã liên kết nó với gwt-jquery mà phải là trình bao bọc dựa trên thông tin trang của họ, bởi vì họ không xuất bản mã của họ (trừ khi bạn giải nén jar bằng tay) –

1

Một cách dễ dàng là đánh giá khiêm tốn.

public static native void eval(String toEval)/*-{ 
    return $wnd.eval(toEval);  
}-*/; 

Sau đó, chỉ cần sử dụng kịch bản của bạn

eval("$('#'" + profileId + ").offset().top"); 

Và bởi vì được gọi là bên trong mã GWT của bạn, bạn có thể xem xét nó mã của bạn như là an toàn nhất.

+0

Một nhược điểm của phương pháp này là bạn không nhận được bất kỳ phân tích IDE nào bên trong nội dung của chuỗi bạn đang gửi đến eval. Bằng cách đó, nếu bạn có lỗi đánh máy ở đâu đó hoặc đang gọi một thuộc tính không xác định, bạn sẽ không biết cho đến khi chạy. – Ronald

+0

Bạn phải, được sử dụng thận trọng. –