在iframe中使用打字稿单击按钮

时间:2018-10-05 07:49:44

标签: javascript angular typescript

我具有检查iframe是否已加载的功能,原因为什么我这样做是因为问题在于,iframe在以下情况下从不发送<link href="https://cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css" rel="stylesheet" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script> <input type="button" value="Enable Dropdown" onclick="callme()"> <table id="orders" class="display" style="width:100%"> <thead> <tr> <th>Name</th> <th>Position</th> <th>Office</th> <th>Age</th> <th>Start date</th> <th>Salary</th> </tr> </thead> <tbody> <tr> <td>Tiger Nixon</td> <td>System Architect</td> <td>Edinburgh</td> <td>61</td> <td>2011/04/25</td> <td>$320,800</td> </tr> <tr> <td>Garrett Winters</td> <td>Accountant</td> <td>Tokyo</td> <td>63</td> <td>2011/07/25</td> <td>$170,750</td> </tr> <tr> <td>Ashton Cox</td> <td>Junior Technical Author</td> <td>San Francisco</td> <td>66</td> <td>2009/01/12</td> <td>$86,000</td> </tr> <tr> <td>Cedric Kelly</td> <td>Senior Javascript Developer</td> <td>Edinburgh</td> <td>22</td> <td>2012/03/29</td> <td>$433,060</td> </tr> <tr> <td>Airi Satou</td> <td>Accountant</td> <td>Tokyo</td> <td>33</td> <td>2008/11/28</td> <td>$162,700</td> </tr> <tr> <td>Brielle Williamson</td> <td>Integration Specialist</td> <td>New York</td> <td>61</td> <td>2012/12/02</td> <td>$372,000</td> </tr> <tr> <td>Herrod Chandler</td> <td>Sales Assistant</td> <td>San Francisco</td> <td>59</td> <td>2012/08/06</td> <td>$137,500</td> </tr> <tr> <td>Rhona Davidson</td> <td>Integration Specialist</td> <td>Tokyo</td> <td>55</td> <td>2010/10/14</td> <td>$327,900</td> </tr> <tr> <td>Colleen Hurst</td> <td>Javascript Developer</td> <td>San Francisco</td> <td>39</td> <td>2009/09/15</td> <td>$205,500</td> </tr> <tr> <td>Sonya Frost</td> <td>Software Engineer</td> <td>Edinburgh</td> <td>23</td> <td>2008/12/13</td> <td>$103,600</td> </tr> <tr> <td>Jena Gaines</td> <td>Office Manager</td> <td>London</td> <td>30</td> <td>2008/12/19</td> <td>$90,560</td> </tr> <tr> <td>Quinn Flynn</td> <td>Support Lead</td> <td>Edinburgh</td> <td>22</td> <td>2013/03/03</td> <td>$342,000</td> </tr> <tr> <td>Charde Marshall</td> <td>Regional Director</td> <td>San Francisco</td> <td>36</td> <td>2008/10/16</td> <td>$470,600</td> </tr> <tr> <td>Haley Kennedy</td> <td>Senior Marketing Designer</td> <td>London</td> <td>43</td> <td>2012/12/18</td> <td>$313,500</td> </tr> <tr> <td>Tatyana Fitzpatrick</td> <td>Regional Director</td> <td>London</td> <td>19</td> <td>2010/03/17</td> <td>$385,750</td> </tr> <tr> <td>Michael Silva</td> <td>Marketing Designer</td> <td>London</td> <td>66</td> <td>2012/11/27</td> <td>$198,500</td> </tr> <tr> <td>Paul Byrd</td> <td>Chief Financial Officer (CFO)</td> <td>New York</td> <td>64</td> <td>2010/06/09</td> <td>$725,000</td> </tr> <tr> <td>Gloria Little</td> <td>Systems Administrator</td> <td>New York</td> <td>59</td> <td>2009/04/10</td> <td>$237,500</td> </tr> <tr> <td>Bradley Greer</td> <td>Software Engineer</td> <td>London</td> <td>41</td> <td>2012/10/13</td> <td>$132,000</td> </tr> <tr> <td>Dai Rios</td> <td>Personnel Lead</td> <td>Edinburgh</td> <td>35</td> <td>2012/09/26</td> <td>$217,500</td> </tr> <tr> <td>Jenette Caldwell</td> <td>Development Lead</td> <td>New York</td> <td>30</td> <td>2011/09/03</td> <td>$345,000</td> </tr> <tr> <td>Yuri Berry</td> <td>Chief Marketing Officer (CMO)</td> <td>New York</td> <td>40</td> <td>2009/06/25</td> <td>$675,000</td> </tr> <tr> <td>Caesar Vance</td> <td>Pre-Sales Support</td> <td>New York</td> <td>21</td> <td>2011/12/12</td> <td>$106,450</td> </tr> <tr> <td>Doris Wilder</td> <td>Sales Assistant</td> <td>Sidney</td> <td>23</td> <td>2010/09/20</td> <td>$85,600</td> </tr> <tr> <td>Angelica Ramos</td> <td>Chief Executive Officer (CEO)</td> <td>London</td> <td>47</td> <td>2009/10/09</td> <td>$1,200,000</td> </tr> <tr> <td>Gavin Joyce</td> <td>Developer</td> <td>Edinburgh</td> <td>42</td> <td>2010/12/22</td> <td>$92,575</td> </tr> <tr> <td>Jennifer Chang</td> <td>Regional Director</td> <td>Singapore</td> <td>28</td> <td>2010/11/14</td> <td>$357,650</td> </tr> <tr> <td>Brenden Wagner</td> <td>Software Engineer</td> <td>San Francisco</td> <td>28</td> <td>2011/06/07</td> <td>$206,850</td> </tr> <tr> <td>Fiona Green</td> <td>Chief Operating Officer (COO)</td> <td>San Francisco</td> <td>48</td> <td>2010/03/11</td> <td>$850,000</td> </tr> <tr> <td>Shou Itou</td> <td>Regional Marketing</td> <td>Tokyo</td> <td>20</td> <td>2011/08/14</td> <td>$163,000</td> </tr> <tr> <td>Michelle House</td> <td>Integration Specialist</td> <td>Sidney</td> <td>37</td> <td>2011/06/02</td> <td>$95,400</td> </tr> <tr> <td>Suki Burks</td> <td>Developer</td> <td>London</td> <td>53</td> <td>2009/10/22</td> <td>$114,500</td> </tr> <tr> <td>Prescott Bartlett</td> <td>Technical Author</td> <td>London</td> <td>27</td> <td>2011/05/07</td> <td>$145,000</td> </tr> <tr> <td>Gavin Cortez</td> <td>Team Leader</td> <td>San Francisco</td> <td>22</td> <td>2008/10/26</td> <td>$235,500</td> </tr> <tr> <td>Martena Mccray</td> <td>Post-Sales support</td> <td>Edinburgh</td> <td>46</td> <td>2011/03/09</td> <td>$324,050</td> </tr> <tr> <td>Unity Butler</td> <td>Marketing Designer</td> <td>San Francisco</td> <td>47</td> <td>2009/12/09</td> <td>$85,675</td> </tr> <tr> <td>Howard Hatfield</td> <td>Office Manager</td> <td>San Francisco</td> <td>51</td> <td>2008/12/16</td> <td>$164,500</td> </tr> <tr> <td>Hope Fuentes</td> <td>Secretary</td> <td>San Francisco</td> <td>41</td> <td>2010/02/12</td> <td>$109,850</td> </tr> <tr> <td>Vivian Harrell</td> <td>Financial Controller</td> <td>San Francisco</td> <td>62</td> <td>2009/02/14</td> <td>$452,500</td> </tr> <tr> <td>Timothy Mooney</td> <td>Office Manager</td> <td>London</td> <td>37</td> <td>2008/12/11</td> <td>$136,200</td> </tr> <tr> <td>Jackson Bradshaw</td> <td>Director</td> <td>New York</td> <td>65</td> <td>2008/09/26</td> <td>$645,750</td> </tr> <tr> <td>Olivia Liang</td> <td>Support Engineer</td> <td>Singapore</td> <td>64</td> <td>2011/02/03</td> <td>$234,500</td> </tr> <tr> <td>Bruno Nash</td> <td>Software Engineer</td> <td>London</td> <td>38</td> <td>2011/05/03</td> <td>$163,500</td> </tr> <tr> <td>Sakura Yamamoto</td> <td>Support Engineer</td> <td>Tokyo</td> <td>37</td> <td>2009/08/19</td> <td>$139,575</td> </tr> <tr> <td>Thor Walton</td> <td>Developer</td> <td>New York</td> <td>61</td> <td>2013/08/11</td> <td>$98,540</td> </tr> <tr> <td>Finn Camacho</td> <td>Support Engineer</td> <td>San Francisco</td> <td>47</td> <td>2009/07/07</td> <td>$87,500</td> </tr> <tr> <td>Serge Baldwin</td> <td>Data Coordinator</td> <td>Singapore</td> <td>64</td> <td>2012/04/09</td> <td>$138,575</td> </tr> <tr> <td>Zenaida Frank</td> <td>Software Engineer</td> <td>New York</td> <td>63</td> <td>2010/01/04</td> <td>$125,250</td> </tr> <tr> <td>Zorita Serrano</td> <td>Software Engineer</td> <td> <select id="test1" disabled> <option>1</option> <option>2</option> <option>3</option> <option>4</option> </select> </td> <td>56</td> <td>2012/06/01</td> <td>$115,000</td> </tr> <tr> <td>Jennifer Acosta</td> <td>Junior Javascript Developer</td> <td>Edinburgh</td> <td>43</td> <td>2013/02/01</td> <td>$75,650</td> </tr> <tr> <td>Cara Stevens</td> <td>Sales Assistant</td> <td>New York</td> <td>46</td> <td>2011/12/06</td> <td>$145,600</td> </tr> <tr> <td>Hermione Butler</td> <td>Regional Director</td> <td>London</td> <td>47</td> <td>2011/03/21</td> <td>$356,250</td> </tr> <tr> <td>Lael Greer</td> <td>Systems Administrator</td> <td>London</td> <td>21</td> <td>2009/02/27</td> <td>$103,500</td> </tr> <tr> <td>Jonas Alexander</td> <td>Developer</td> <td>San Francisco</td> <td>30</td> <td>2010/07/14</td> <td>$86,500</td> </tr> <tr> <td>Shad Decker</td> <td>Regional Director</td> <td>Edinburgh</td> <td>51</td> <td>2008/11/13</td> <td>$183,000</td> </tr> <tr> <td>Michael Bruce</td> <td>Javascript Developer</td> <td>Singapore</td> <td>29</td> <td>2011/06/27</td> <td>$183,000</td> </tr> <tr> <td>Donna Snider</td> <td>test </td> <td>New York</td> <td>27</td> <td>2011/01/25</td> <td>$112,000</td> </tr> </tbody> <tfoot> <tr> <th>Name</th> <th>Position</th> <th>Office</th> <th>Age</th> <th>Start date</th> <th>Salary</th> </tr> </tfoot> </table>它已经获取了数据,所以我的后端没有将其解释为已加载,因此很多现有逻辑都失败了。

我不太想在后端引入特殊逻辑来解决这种特殊情况。我宁愿在组件中这样做。 但是,我似乎无法使用TypeScript定位iframe内部按钮。

我知道使用jquery可以做到这一点,但我宁愿将其作为最后的手段。

我的组件(请参见函数:loadReportManually和iframeCheck):

OK 200

生成的html结构的摘录:

import { Component, Inject, OnInit, Input, Output, EventEmitter } from 'ng-metadata/core';
import { AppService } from '../../shared/app.service';

@Component({
    selector: 'es-iframe-wrapper',
    templateUrl: 'app/modules/iframe-wrapper/iframe-wrapper.component.html'
})
export class IframeWrapperComponent implements OnInit {
    @Input() iframeTitle: string;
    @Input() url: string;
    @Input() iframeHeight: string;
    @Input() iframeWidth:string;
    @Input() openUrlExternally:boolean;
    @Input() simple:boolean;
    @Output() iframeOnLoad = new EventEmitter<boolean>();
    iframeUrl: string;
    iframeElement;
    iframeChecks = 0;
    iframeCheckLimit = 15;
    iframeReloadTries = 0;
    iframeReloadLimit = 5;
    iframeLoadedCorrectly = false;
    checkIntervalReference;

    constructor(
        @Inject('$sce') private $sce: ng.ISCEService, 
        @Inject("$element") private readonly $element,
        @Inject('$q') private readonly $q: ng.IQService,
        @Inject(AppService) private readonly appService:AppService
    ) {

    }

    hidePageLoader() {
        setTimeout( x => {
            this.appService.hidePageLoader();
        },1000);
    }

    iframeLoaded() {
        this.iframeElement = this.$element.find("iframe");
        if(!this.iframeElement) {
            console.log("Could not find the iframe.");
            return false;
        } else {
            console.log("\n\n\nIframe: ", this.iframeElement);
        }

        this.checkIntervalReference = setInterval(
            this.iframeCheck.bind(this),
            500
        );
    }


    iframeCheck() {
        this.iframeLoadedCorrectly = !this.iframeContentHidden();

        if(this.iframeLoadedCorrectly) {
            clearInterval(this.checkIntervalReference);
            this.hidePageLoader();
            this.iframeOnLoad.emit(true);
            this.loadReportManually();
            // console.log("Iframe loaded");
        } else {
            if(this.iframeChecks < this.iframeCheckLimit) {
                this.iframeChecks++;
                console.log("Checking iframe");
            } else if (this.iframeReloadTries < this.iframeReloadLimit) {
                clearInterval(this.checkIntervalReference);
                this.iframeReloadTries++;
                this.iframeChecks = 0;
                this.iframeElement[0].contentWindow.location.reload();
                console.log("Reloading iframe");
            } else {
                clearInterval(this.checkIntervalReference);
                this.hidePageLoader();
                this.iframeOnLoad.emit(true);
                this.loadReportManually();
                console.log("Could not load the iframe with url: ", this.iframeUrl);
                //give up, just show w/e has been rendered...
            }
        }
    }

    loadReportManually(){
        var innerIframe = this.iframeElement.find("iframe")
        console.log("trying to click iframe: ", innerIframe);
        if(innerIframe){
            innerIframe.find('.pentaho-button').click();
            console.log("clicked report-button!");
            // $('.pentaho-button').click();
        }
    }


    iframeContentHidden(): boolean {
        var iframeDoc = this.iframeElement[0].contentDocument || this.iframeElement[0].contentWindow.document;
        var iframeClasses = iframeDoc != null && iframeDoc != undefined ? (iframeDoc.activeElement != null && iframeDoc.activeElement != undefined ? iframeDoc.activeElement.className : undefined) : undefined;
        var iframeContentHidden = iframeClasses ? (iframeClasses.match(/contentHidden/i) ? true : false) : false;
        return iframeContentHidden;
    }

    ngOnInit(): void {
        this.simple = this.simple ? true : false;
        this.openUrlExternally = this.openUrlExternally ? true : false;

        if(this.iframeWidth == undefined){
            this.iframeWidth = "100%";
        }
        if(this.iframeHeight == undefined){
            this.iframeHeight = "1024px";
        }

        this.appService.showPageLoader();
        this.iframeUrl = this.$sce.trustAsResourceUrl(this.url);
    }
}

在iframe中,有一个我必须单击的类为<es-iframe-wrapper id="esReportIframe" class="col-md-12" [simple]="true" [url]="$ctrl.reportUrl" (iframe-on-load)="$ctrl.iframeLoaded()"> <iframe ng-if="$ctrl.simple" ng-src="URL/TO/WEBSITE" iframe-onload="$ctrl.iframeLoaded();" frameborder="0" width="100%" height="1024px" allow="encrypted-media" src="URL/TO/WEBSITE"> </iframe> </es-iframe-wrapper> 的元素。

运行pentaho-button时,我在控制台中看到以下内容:

console.log("trying to click iframe, innerIframe);

我在这里使用错误的方法来选择iframe的按钮吗?

0 个答案:

没有答案