簡體   English   中英

WKWebView中未執行JavaScript

[英]JavaScript not executed in WKWebView

由於我對此感到有些瘋狂,因此我決定再次嘗試將其發布在此處。

所以...

我有一個帶有WKWebView的簡單Swift / Cocoa應用程序。

我加載了一個本地HTML文件(與其他.css / .js依賴項一起,將其復制到/web文件夾中的分發包中)。

這是完整的代碼:

<!DOCTYPE html>
<html>
    <head>
        <title>IBAN Validator</title>
        <meta name="viewport" content="width=device-width"/>
        <meta charset="UTF-8">

        <link href="style/font-awesome.min.css" type="text/css" rel="stylesheet"/>
        <link href="style/electriq.css" type="text/css" rel="stylesheet"/>
        <link href="style/custom.css" type="text/css" rel="stylesheet" />
    </head>
    <body>
        <!-- window/ -->
        <div class="window">
            <div class="content" style="text-align: center">
                <div class="panel">
                    <input id="iban" type="text" style="text-align:center;"><br/>
                    <div style="position: relative; max-width: 150px; width: 100%; margin: 0 auto">
                        <a id="validateButton" href="#" class="button" style="width:150px;">Validate</a>
                        <span id="resultValid" style="position:absolute; left: calc(100% + 20px); top: 10%; color: green; font-size: 20px; display:none;"><i class="fa fa-check"></i></span>
                        <span id="resultInvalid" style="position:absolute; left: calc(100% + 20px); top: 10%; color: red; font-size: 20px; display:none;"><i class="fa fa-close"></i></span>
                    </div>
                </div>
            </div>
        </div>
        <!-- /window -->

        <div id="loader_overlay" style="padding-top:10%">
            <i class="fa fa-circle-o-notch fa-spin fa-3x fa-fw"></i><br/>
        </div>

        <!-- scripts/ -->
        <script>if (typeof module === 'object') {window.module = module; module = undefined;}</script>
        <script src="jquery.min.js" type="text/javascript"></script>
        <script>
            if (typeof window.jQuery !== 'undefined') {
                window.document.getElementById("loader_overlay").innerHTML += ".";
            } else {
                window.document.getElementById("loader_overlay").innerHTML += "x";
            }
        </script>
        <script src="handlebars.min.js" type="text/javascript"></script>
        <script>
            if (typeof window.Handlebars !== 'undefined') {
                window.document.getElementById("loader_overlay").innerHTML += ".";
            } else {
                window.document.getElementById("loader_overlay").innerHTML += "x";
            }
        </script>
        <script src="bridgecommander.js" type="text/javascript"></script>
        <script>
            if (typeof window.BridgeCommander !== 'undefined') {
                window.document.getElementById("loader_overlay").innerHTML += ".";
            } else {
                window.document.getElementById("loader_overlay").innerHTML += "x";
            }
        </script>
        <script src="iban.js" type="text/javascript"></script>
        <script>
            if (typeof window.IBAN !== 'undefined') {
                window.document.getElementById("loader_overlay").innerHTML += ".";
            } else {
                window.document.getElementById("loader_overlay").innerHTML += "x";
            }
        </script>
        <!-- <script src="app.js" type="text/javascript"></script> -->
        <script>

            // Generated by CoffeeScript 2.0.2
            var doValidate;

            window.appLoaded = true;
            window.document.getElementById("loader_overlay").innerHTML += ".";
            BridgeCommander.call("echo", "Before: onload");
            window.document.getElementById("loader_overlay").innerHTML += ".";

            window.onload = function() {
              BridgeCommander.call("echo", "Inside: onload");
              document.getElementById("loader_overlay").style.display = 'none';
              return $("#validateButton").on("click", doValidate);
            };
            window.document.getElementById("loader_overlay").innerHTML += ".";
            BridgeCommander.call("echo", "After: onload");

            doValidate = function() {
              var iban, valid;
              iban = $("#iban").val();
              valid = IBAN.isValid(iban);
              if (valid) {
                $("#resultValid").show();
                $("#resultInvalid").hide();
                $("#validateButton").removeClass("invalid").addClass("valid");
                BridgeCommander.call("echo", `Validating: ${iban}, Result: valid`);
              } else {
                $("#resultValid").hide();
                $("#resultInvalid").show();
                $("#validateButton").removeClass("valid").addClass("invalid");
                BridgeCommander.call("echo", `Validating: ${iban}, Result: invalid`);
              }
              setTimeout(function() {
                $("#validateButton").removeClass("valid").removeClass("invalid");
                $("#resultValid").hide();
                return $("#resultInvalid").hide();
              }, 3000);
              return false;
            };
            window.document.getElementById("loader_overlay").innerHTML += ".";

            if (typeof window.appLoaded !== 'undefined') {
                window.document.getElementById("loader_overlay").innerHTML += ".";
            } else {
                window.document.getElementById("loader_overlay").innerHTML += "x";
            }
        </script>
        <script>if (window.module) module = window.module;</script>
        <!-- /scripts -->
    </body>

</html>

重要說明: 在這里(意味着在我的Mac上-以及我嘗試過的所有裝有10.3.1的Mac上的Mac),一切正常。 當我將完全相同的二進制文件上載到App Store進行審查時,我不斷得到相同的“錯誤”屏幕截圖,表示最后一個<script></script>塊中的任何代碼均未執行。 (在window.appLoaded = true部分之后)


可能會發生什么? 我確實嘗試了任何方法來調試此問題(因此,使用了許多window.document.getElementById東西,添加了點以確保一切正常),但仍然沒有任何效果。

如您所見,我正在加載多個腳本(根據我的測試,它們可以正常加載),並且我還具有幾段內聯JS代碼(仍然可以正常運行)。 除了最后一個! (無論如何,即使來自外部文件,它似乎也拒絕加載...)

再說一次,我想到了要緩存的東西,我不知道,但是我提醒你,除了評論小組的機器以外,它顯然可以在任何地方工作:

任何想法都將受到歡迎!


PS:如果不清楚,請隨時問我什么


更新: (28/11/2017)使用簡單的舊式WebView嘗試了整個過程(以防與WKWebView ),但我的應用仍然被拒絕。 確切地說,我的應用程序(確切的版本,所有內容都一樣)在任何地方都可以正常運行,但需要對其進行審核的人除外。

這可能是因為瀏覽器不知道如何解析腳本標簽的內容

<script></script>標記要求在其上使用type屬性,大多數瀏覽器會假定它與上一個相同,但是由於沒有包含script標記的代碼都指定了它可能不知道如何解析它們的類型,因此script不僅僅支持javascript,例如VBScript ,每次打開javascript的<script>時都應為<script type="text/javascript">

另一個問題可能是window.onload我建議您將其更改為DOMContentLoaded事件,並使用閉包確保其執行代碼。

<script src="jquery.min.js" type="text/javascript"></script>您為什么不將jQuery加載到應該加載的head標簽中,將<script src="jquery.min.js" type="text/javascript"></script>移至<head></head>內部<head></head>

接下來,如果您使用jQuery,為什么要混合使用jQuery和純Javascript(如果您使用jQuery),則它的代碼更小,更簡潔

 (function($){
     $(function(){
         window.appLoaded = true;
         $("loader_overlay").append(".");
         BridgeCommander.call("echo", "Before: onload");
         $("loader_overlay").append(".");

         $("loader_overlay").append(".");
         BridgeCommander.call("echo", "After: onload");

         function doValidate() {
             var iban, valid;
             iban = $("#iban").val();
             valid = IBAN.isValid(iban);
             if (valid) {
                 $("#resultValid").show();
                 $("#resultInvalid").hide();
                 $("#validateButton").removeClass("invalid")
                                     .addClass("valid");
                 BridgeCommander.call("echo", `Validating: ${iban}, Result: valid`);
             } else {
                 $("#resultValid").hide();
                 $("#resultInvalid").show();
                 $("#validateButton").removeClass("valid")
                                     .addClass("invalid");
                 BridgeCommander.call("echo", `Validating: ${iban}, Result: invalid`);
             }

             setTimeout(function() {
                 $("#validateButton").removeClass("valid")
                                     .removeClass("invalid");
                 $("#resultValid").hide();
                 return $("#resultInvalid").hide();
             }, 3000);
             return false;
        };

         (function(doValidate) {
             BridgeCommander.call("echo", "Inside: onload");
             $("loader_overlay").css("display",'none');
             return $("#validateButton").on("click", doValidate);
         })(doValidate);

         window.document.getElementById("loader_overlay").innerHTML += ".";

         if (typeof window.appLoaded !== 'undefined') {
             window.document.getElementById("loader_overlay").innerHTML += ".";
         } else {
             window.document.getElementById("loader_overlay").innerHTML += "x";
         }
         if (window.module){ module = window.module; }
    });
});

另一方面,請擺脫所有文件加載檢查。 因此,以下所有代碼塊

if (typeof window.Handlebars !== 'undefined') {
    window.document.getElementById("loader_overlay").innerHTML += ".";
} else {
    window.document.getElementById("loader_overlay").innerHTML += "x";
}

它們僅在調試時才需要,並且如果文件加載在一個文件上,那么它就是Web Kit。 因此您不需要這些檢查,因為它們只是在使用電話處理功能,並且沒有充分的理由在您的應用程序中添加工作。 除了放一個。 在疊加層中...

再次,所有<script src=...應該都位於<head>標記內,在這種情況下,您的所有代碼都應該位於script標記內,並使用jQuery read讀取上述版本。

您如何在Mac上使用iPhone仿真器測試此應用程序? 或真正的iPhone進行測試,我總是會推薦后者。 並按照您似乎沒有說過的方式對其中之一進行了測試,如果未在開發人員帳戶上注冊要測試的設備,請創建密鑰以測試並構建測試版本,然后使用Safari或chromes遠程調試工具在WebView上,並確保一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM