javascript - 未附加到 View 层次结构时的 WKWebKit javascript 执行

标签 javascript ios angularjs webkit wkwebview

我想从 UIWebView 切换到 WKWebView。在我的代码中,Web View 实例是在屏幕外创建的(没有附加到 View 层次结构)并加载了 URL。加载完成后,Web View 将在单独的 UIWindow 中呈现给用户(类似于插页式广告)。 UIWebView 一切正常;但是在切换到 WKWebView 之后,angular javascript 代码的行为异常。

在做了一些研究之后,我发现当 WKWebView 实例没有附加到 View 层次结构时,javascript 计时器(和 HTTP 加载器)被挂起:如果你在 javascript 中启动一个计时器,它在分离的 WKWebView 中运行 - 在附加 web View 之前它不会被触发。

谁能提出一个可能的解决方法(除了将隐藏的 Web View 附加到关键窗口然后将其移动到另一个窗口之外)?

我已经创建了一个示例项目来演示该问题(或者更可能是 WebKit 功能)

https://dl.dropboxusercontent.com/u/148568148/WebKitViewTest.zip

测试应用程序使用 javascript 加载网页,该 javascript 安排计时器并加载 HTTP 请求。您可以使用开关来显示/隐藏 Web View (设置“隐藏”属性)并将其从 View 层次结构中附加/分离。

Sample app running on iOS 8.0

如果附加了 WebView (隐藏或可见)并且您点击了Load,javascript 工作正常:您可以看到successfailure 警报对话框。如果它是分离的 - 计时器只会在它附加到 View 层次结构时触发(将“分离”切换为“打开”,点击“加载”,等待几秒钟然后切换回“关闭”)。您还可以从 Safari Web Inspector 检查 console.log

测试网页源码如下:

<!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>

和 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;
  };
}]);

最佳答案

遇到同样的问题,除了将 WKWebView 添加到 View 层次结构并使用 AutoLayout 将其移出屏幕外,我从未找到任何解决方案。幸运的是,此变通办法确实有效。

关于javascript - 未附加到 View 层次结构时的 WKWebKit javascript 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31169884/

相关文章:

javascript - Three.js 在绕挤压轴旋转的同时挤压二维面

javascript - warning.js :36 Warning: Failed prop type: The prop `history` is marked as required in `Router` , 但其值为 `undefined`

objective-c - 以像素为单位的 CGRect?

javascript - AngularJS 双 HTTP 请求,这是一个好的解决方案还是我做错了什么?

java - 如何将 Javascript 变量发送到服务器端?

php - 创建从 PHP 调用的 Javascript 函数

ios - 如何在 iOS 中从 PHPhotoLibrary 获取 ref url?

ios - 如何计算 iOS 中的键盘高度?

javascript - Angular $injector 与 Angular 依赖注入(inject)

javascript - AngularJS 不会编译 script 标签内的表达式