Не удается получить доступ к функции JavaScript в ADF InlineFrame - PullRequest
1 голос
/ 10 июля 2019

У меня есть страница jsff, содержащая af:InlineFrame.

Источник этого InlineFrame - HTML-файл, скажем Frame.html

Этот html-файл имеет функцию JavaScript, называемую inlineframeFunction()

У меня есть кнопка, добавленная на странице jsff.

Мой вариант использования - вызывать функцию inlineframeFunction по нажатию кнопки, которую я не могу выполнить.

var doc = inlineFrame.contentDocument? 
inlineFrame.contentDocument: inlineFrame.contentWindow.document;
doc.frameFunction();

Frame.html

<script type="javascript">    
    function inlineframeFunction(){
        alert('Inline Frame Function ');
    }
  </script>

Страница JSFF

<af:panelGroupLayout id="pgl1" layout="vertical">

      <af:resource type="javascript">

        function inlineFrameRegionPageFunction() {
          alert('Region Page Function');
          var inlineFrame = document.getElementById('r1:0:if2');
          var doc = inlineFrame.contentDocument? inlineFrame.contentDocument: inlineFrame.contentWindow.document;
          doc.frameFunction();
        }
      </af:resource>
    </af:panelGroupLayout>
    <af:panelGroupLayout id="pgl2" layout="vertical">
      <af:panelBox text="Inline Frame Region" id="pb2"
                   inlineStyle="background-color:Lime; border-color:Lime;">
        <f:facet name="toolbar"/>
        <af:inlineFrame id="if2" source="/Frame.html" shortDesc="InlineFrame"
                        inlineStyle="background-color:Gray;"/>
        <af:commandButton text="Inline Region Button" id="rb2"
                          actionListener="#{pageFlowScope.RegionBean.onClickInlineFrameRgnButton}"/>
      </af:panelBox>
    </af:panelGroupLayout>

Ответы [ 2 ]

1 голос
/ 16 июля 2019

Я использовал следующее, и это сработало!

    function inlineFrameRegionPageFunction() {          
       var frameComp =$('[id*="InlineFrame"]', document)[0].id;
    document.getElementById(frameComp).contentWindow.frameFunction();
    }
  </af:resource>
0 голосов
/ 11 июля 2019

Для выполнения JavaScript из управляемого компонента в adf вы можете использовать следующую функцию (https://cedricleruth.com/how-to-execute-client-javascript-in-an-adf-java-bean-action/):

/*** In YOURJSF.jsf button, or other component that need to execute a javascript on action, add : ****/
<af:commandButton text="ClickMe" id="cb1" actionListener="#{YOURSCOPE.YOURJAVABEAN.clickToExecuteJavascriptAction}"/>

 /*** In YOURJAVABEAN.java class add : ***/
 public void clickToExecuteJavascriptAction(ActionEvent actionEvent) {
  this.executeClientJavascript("console.log('You just clicked : " + actionEvent.getSource() + " ')");
  //Note: if you use a java string value in this function you should escape it to avoid breaking the javascript.
  //Like this : stringValue.replaceAll("[^\\p{L}\\p{Z}]", " ")
 }

//You should put this function in a util java class if you want to use it in multiple bean
public static void executeClientJavascript(String script) {
 FacesContext facesContext = FacesContext.getCurrentInstance();
 ExtendedRenderKitService service = Service.getRenderKitService(facesContext, ExtendedRenderKitService.class);
 service.addScript(facesContext, script);
}

Тогда, в вашем случае, обратитесь к этому вопросу, чтобы вызвать вашу функцию js iframe, используя javascript внутри слушателя действия ( Вызов функции javascript в iframe )

document.getElementById("if2").contentWindow.inlineframeFunction();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...