On Thursday, February 15, 2018 at 10:21:59 AM UTC+1, Scott Shumway wrote:
>
> Greetings
>
> I am trying to get a DOMRect from an Element. I can do this with JSNI, but
> have been unable to make a JsInterop version. Here's what I have:
>
> public final class DOMRect extends JavaScriptObject
> {
> // returns DOMRect or null
> public static native DOMRect getBoundingClientRect(Element element)
> /*-{
> return element.getBoundingClientRect && element.getBoundingClientRect();
> }-*/;
>
> protected DOMRect()
> {
> }
>
> public final native double getX()
> /*-{
> return this.x;
> }-*/;
>
> // etc.
> }
>
> I can make a JsType for DOMRect, no problem. The issue I'm having is with
> getBoundingClientRect(). This function may not exist which is why there is
> a null check.
>
You'll want a @JsProperty for the method so you can check whether it's null
or not; and then either declare it also as a @JsMethod in parallel to call
it, or have the @JsProperty return a @JsFunction (or then cast to an
elemental2.dom.Element).
And you can hide the details the same way you did with JSNI, with a
@JsOverlay:
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="Element")
class Element {
@JsProperty(name="getBoundingClientRect") private native Object
getGetBoundingClientRect();
@JsMethod(name="getBoundingClientRect") private native DOMRect
callGetBoundingClientRect();
@JsOverlay
public DOMRect getBoundingClientRect() {
return getGetBoundingClientRect() == null ? null :
callGetBoundingClientRect();
}
}
or
@JsType(isNative=true, namespace=JsPackage.GLOBAL, name="Element")
class Element {
@JsProperty(name="getBoundingClientRect") public native
GetBoundingClientRect getBoundingClientRect();
@JsFunction
interface GetBoundingClientRect {
public DOMRect invoke();
}
}
If I make an interface for getBoundingClientRect, I'm not allowed to cast
> Element to implement it.
>
How so‽
You cannot use JavaScriptObject#cast(), but you should be able to use a
standard Java cast.
You might have to first cast to Object to please javac:
((HasGetBoundingClientRect) (Object) elt).getBoundingClientRect()
> I can't extend Element, either. With JSNI, I am allowed to compile
> Javascript into Javascript, but I can't with JsInterop. It seems like a lot
> of trouble for 1 line of Javascript.
>
> How can I do this? Thanks in advance...
>
getBoundingClientRect is supported in (literally) all browsers, so don't
bother and just call the
method: https://caniuse.com/#feat=getboundingclientrect,
https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect#Browser_compatibility
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.