1

WKWebView を使用するアプリを作成しており、ページ上の任意の HTML 要素の URL を取得できる必要があります。たとえば、ユーザーが Google 画像にアクセスして画像を長押しすると、その画像への完全な URL を見つけることができる必要があります。

誰もこれを行う方法を知っていますか?

ありがとう!

4

1 に答える 1

4

この動作は、次の 4 つの手順で実現できます。

1) インスタンスに追加UILongPressGestureRecognizerし、レコグナイザーが独自のジェスチャ レコグナイザーWKWebViewと同時に認識できるようにすることを忘れないでください。WKWebView

SEL selector = @selector(handleLongPressGestureRecognizer:);
UILongPressGestureRecognizer* gestuRecognizer =
    [[UILongPressGestureRecognizer alloc] initWithTarget:self
                                                        action:selector];
gestuRecognizer.delegate = self;
[webView addGestureRecognizer:gestuRecognizer];

<...>

- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
    shouldRecognizeSimultaneouslyWithGestureRecognizer:
        (UIGestureRecognizer*)otherGestureRecognizer {
  return YES;
}

2) JavaScript ファイル (tools.js) を大まかに次のように作成します。

function imageSourceFromPoint(x, y) {
  var element = document.elementFromPoint(x, y);
  if (element.tagName == 'IMG' && element.src) {
    return element.src;
  }
  return null;
}

3) その tools.js を Web ページにロードします。handleLongPressGestureRecognizerこれは、たとえば次のようにメソッドで直接行うことができます。

- (void)handleLongPressGestureRecognizer:
    (UILongPressGestureRecognizer*)recognizer {
  if (recognizer.state == UIGestureRecognizerStateBegan) {
    [self loadJavaScriptFileIfNeededWithCompletion:^{
      <...>
    }];
  }
}

- (void)loadJavaScriptFileIfNeededWithCompletion:(void(^)())completion {
  <...>
  [self.webView evaluateJavaScript:[self toolsJavaScriptFile]
                 completionHandler:^(id result, NSError* error) {
                   completion();
                 }];
  <...>
}

- (NSString*)toolsJavaScriptFile {
  NSString* path = [[NSBundle mainBundle] pathForResource:@"tools"
                                                   ofType:@"js"];
  return [NSString stringWithContentsOfFile:path
                                   encoding:NSUTF8StringEncoding
                                      error:nil];
}

4)imageSourceFromPoint長押しジェスチャの場所を指定して、Objective-C (または Swift) から JavaScript 関数を実行します。

- (void)handleLongPressGestureRecognizer:
    (UILongPressGestureRecognizer*)recognizer {
    <...>
    [self loadJavaScriptFileIfNeededWithCompletion:^{
      CGPoint touchPoint = [recognizer locationInView:self.webView];
      [self imageSourceFromPoint:touchPoint completion:^(NSString* source) {
        <...>
      }];
    }];
    <...>
}

- (void)imageSourceFromPoint:(CGPoint)point
                  completion:(void(^)(NSString*))completion {
  NSString* jsCode = [NSString stringWithFormat:
      @"imageSourceFromPoint(%g, %g)", point.x, point.y];
  [self.webView evaluateJavaScript:jsCode
                 completionHandler:^(id result, NSError* error) {
                   <...>
                   NSString* resultString = (NSString*)result;
                   completion(resultString);
                 }];
}

一連のエラー チェックが省略されていることに注意してください。完全なプロジェクト サンプルはこちらにあります https://dl.dropboxusercontent.com/u/930742/so/GetHTMLElement.zip

次のようになります。

ここに画像の説明を入力

これがお役に立てば幸いです。

于 2014-12-23T08:03:44.717 に答える