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.

Reply via email to