Ale*_*uev 38 javascript webkit ios angularjs wkwebview
我想切换到WKWebView从UIWebView.在我的代码中,Web视图实例是在屏幕外创建的(不附加到视图层次结构)并且加载了URL.加载完成后,Web视图将在单独的UIWindow(如插页式广告)中呈现给用户.一切正常UIWebView; 但在切换到之后WKWebView,角度javascript代码以意想不到的方式运行.
在做了一些研究之后,我发现当WKWebView实例未附加到视图层次结构时,javascript计时器(和HTTP加载器)被挂起:如果你在javascript中启动一个以分离运行的计时器WKWebView- 它将不会被触发Web视图已附加.
任何人都可以建议一个可能的解决方法(除了将隐藏的Web视图附加到关键窗口,然后将其移动到另一个窗口)?
我已经创建了一个示例项目来演示问题(或者更有可能是WebKit功能)
https://dl.dropboxusercontent.com/u/148568148/WebKitViewTest.zip
测试应用程序加载带有javascript的网页,该网页调度计时器并加载HTTP请求.您可以使用开关来显示/隐藏Web视图(设置"隐藏"属性)并将其从视图层次结构中附加/分离.

如果Web视图已附加(隐藏或可见)并且您点击Load,则javascript工作正常:您可以查看success或failure警告对话框.如果它已分离 - 计时器只会在它附加到视图层次结构时触发(将"Detached"切换为"on",点击"Load",等待几秒钟并切换回"off").您也可以console.log从Safari Web Inspector 查看.
这是测试网页源:
<!doctype html>
<html ng-app="project">
<head>
<script
src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.js"></script>
<script src="project.js"></script>
</head>
<body>
<div id="simple" ng-controller="MyController" data-ng-init="callNotify(message);">
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
和javascript:
angular.
module('project', []).
controller('MyController', ['$scope','notify', function ($scope, notify) {
$scope.callNotify = function(msg) {
notify(msg);
};
}]).
factory('notify', ['$window', '$http', '$q', '$timeout', function(win, $http, $q, $timeout) {
return function(msg) {
deferred = $q.defer();
$timeout(function() {
$http.get('http://jsonplaceholder.typicode.com/posts').
success(function(data, status, headers, config) {
alert("success");
console.log("success")
}).
error(function(data, status, headers, config) {
alert("error");
console.log("error")
});
});
return deferred.promise;
};
}]);
Run Code Online (Sandbox Code Playgroud)
遇到同样的问题,除了将 WKWebView 添加到视图层次结构并使用 AutoLayout 将其移出屏幕之外,我从未找到任何解决方案。幸运的是,这种解决方法确实可以可靠地工作。
| 归档时间: |
|
| 查看次数: |
2688 次 |
| 最近记录: |