![](/img/trans.png)
[英]How to receive online/offline events in Javascript that's executed inside WKWebView on iOS?
[英]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.