Amazing trick!

Obvious if you think about it - but very difficult to think it initially
(for us mere mortals).

   Vassilis

On Thu, Feb 15, 2018 at 11:53 AM, Thomas Broyer <[email protected]> wrote:

>
>
> 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.
>



-- 
Vassilis Virvilis

-- 
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