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();
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? –