iframe が HTML 内のページにジャンプするのを防ぎ、iframe を使用して WeChat Web バージョンをページに埋め込む方法

iframe が HTML 内のページにジャンプするのを防ぎ、iframe を使用して WeChat Web バージョンをページに埋め込む方法

私は、WinForm と HTML5 を組み合わせた小さなものを作りたいだけなのですが、突然、そこに WeChat の Web バージョンを埋め込むことに興味が湧いてきました。

さて、アイデアが浮かんだら、行動に移しましょう。最終的な効果は次のようになります。

当初は、ページに iframe を埋め込んで https://wx.qq.com を指すようにするつもりでしたが、あまりに無知だったため、WeChat ウェブバージョンが自動的にジャンプしてしまいました。結果は次のとおりです。

そこで、iframe リダイレクトを防ぐ方法をオンラインで検索しました。それは、iframe タグに security="restricted" と sandbox="" という 2 つの属性を追加するというものでした。前者はIEのjs無効化機能、後者はHTML5の機能です。

リダイレクトを防ぐには、 sandbox="allow-scripts allow-same-origin allow-popups"を使用します。しかし...結果は次のようになります:

その後、このジャンプは実際には元のページを閉じてからジャンプ ページを参照していることがわかりました。したがって、ページ終了イベント onbeforeunload を使用してジャンプを防ぐことができます。そこで、次のコードをページに追加します。

 document.body.onbeforeunload = 関数 (イベント) {
             var rel = "asdfawfewf";
             if (!window.event) {
                イベントの戻り値 = rel;
            } それ以外 {
                window.event.returnValue = rel;
             }
         };

その後、結果は依然として次のようになることがわかりました。

理由は何ですか?事件に対して何の反応もないのですか?それともWeChatウェブ版の飛躍が凄すぎるのでしょうか?この事件を無視するのですか?そこで、空の HTML を作成し、検証のためにこのイベントだけを追加しました。

<!DOCTYPE html> 
  <html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
  <ヘッド>
      <メタ文字セット="utf-8" />
      <タイトル></タイトル>
  </head>
  <本文></本文>
  <スクリプト>
document.body.onbeforeunload = 関数 (イベント) {
    var rel = "asdfawfewf";
     if (!window.event) {
         イベントの戻り値 = rel;
     } それ以外 {
         window.event.returnValue = rel;
     }
 };
 </スクリプト>
 </html>

結果は実現可能です:

ただし、iframe をページに埋め込んだ後は直接ジャンプしてしまいます。次のコードを試してください。

<!DOCTYPE html> 
  <html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
  <ヘッド>
      <メタ文字セット="utf-8" />
      <タイトル></タイトル>
  </head>
  <本文>
      <iframe src="https://wx.qq.com/" frameborder="0" style="position: absolute;border: navajowhite;left: 0;height: calc(100% - 30px);width:100%">
     </iframe>
 </本文>
 <スクリプト>
 document.body.onbeforeunload = 関数 (イベント) {
     var rel = "asdfawfewf";
     if (!window.event) {
         イベントの戻り値 = rel;
     } それ以外 {
         window.event.returnValue = rel;
     }
 };
 </スクリプト>
 </html>

困惑したとき、この方法をオンとオフに切り替えて、うまくいくかどうかを確認しました。突然、ページを開いてから短時間で閉じると、onbeforeunload イベントがトリガーされないことに気付きました。数秒待ってからページを閉じると、イベントがトリガーされ、プロンプトが表示されます。

さて、iframe を遅延させて src 値を割り当ててみます (ここでは JQuery が参照されています)。

<!DOCTYPE html>
  <html lang="ja" xmlns="http://www.w3.org/1999/xhtml">
  <ヘッド>
      <メタ文字セット="utf-8" />
     <タイトル></タイトル>
      <script src="scripts/jquery-2.2.3.js"></script>
  </head>
  <本文>
      <iframe id="iframe" frameborder="0" style="position: absolute;border: navajowhite;left: 0;height: calc(100% - 30px);width:100%">
     </iframe>
 </本文>
 <スクリプト>
 $(関数() {
     setTimeout(関数() {
         iframe.src = "https://wx.qq.com/";
     },5000);
 });
 document.body.onbeforeunload = 関数 (イベント) {
     var rel = "asdfawfewf";
     if (!window.event) {
         イベントの戻り値 = rel;
     } それ以外 {
         window.event.returnValue = rel;
     }
 };
 </スクリプト>
 </html>

結果は成功しました。このページを離れるかどうかを尋ねるプロンプトが表示されます。[滞在] ボタンをクリックします。成功への飛躍はありません。下の写真は完成品です。

完了です。チャットやファイルの転送は普通にできますが、スクリーンショットを撮ることはできません。

欠点は、ログインを完了するには、ポップアップのキャンセルボタンを 2 回クリックする必要があり、1 回目はページを開き、2 回目はコードをスキャンした後にページが再びジャンプすることです。現在、この問題を解決する方法はありません。この問題を解決する方法を知っている友人が私に何か提案してくれることを願っています。タイムリーに返信します。123WORDPRESS.COM ウェブサイトをサポートしていただき、誠にありがとうございます。

<<:  MySQL 永続統計の詳細な説明

>>:  JavaScript でのモグラ叩きゲームの実装

推薦する

Linux システムのユーザー管理コマンドの概要

ユーザーとグループの管理1. ユーザーとグループの基本概念ユーザーとグループ:システム上のすべてのプ...

CSSオーバーフローメカニズムについての簡単な説明

CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...

MySQLはmysqldump+binlogを使用して、削除されたデータベースの原理分析を完全に復元します。

1. 概要MySQL データベースの日常的な操作とメンテナンスにおいて、ユーザーが誤ってデータを削...

進捗バーのネイティブ JavaScript 実装

進捗バーを実装するためのJavaScriptの具体的なコードは参考までに。具体的な内容は次のとおりで...

XHTML 入門チュートリアル: Web ページのヘッダーと DTD

ヘッドと DTD はページには表示されませんが、Web ページの重要な要素です。 なぜ失敗したのでし...

Linux の MySQL でリモート接続を承認する方法

注意: 他のマシン (IP) は、承認なしではクライアント経由で MySQL データベースに接続でき...

CSS3 ベジェ曲線の例: リンクホバーアニメーション効果の作成

CSS3 アニメーション トランジションを使用して、リンクの上にマウスを移動すると小さなポップアップ...

Linux スワップメモリ​​を拡張する方法

スワップ メモリとは、主に物理メモリが不足している場合に、システムがハード ディスク領域の一部をサー...

Linux と Windows でスケジュールされたタスクを設定する方法

目次リナックス1. crontabの基本的な使い方2. ログを有効にする3. スケジュールされたタス...

Vite2.x に基づく Vue 3.x プロジェクトの実装

Vue 3.x プロジェクトの作成 npm init @vitejs/app my-vue-app ...

Docker Compose のサイドカーモードの詳細な説明

目次Docker Composeとは要件に不適切な言語が使用されている実装Docker Compos...

Dockerのローカルイメージ作成方法の分析

コンテナと呼ばれるものは、実際には親イメージに基づいて読み取りおよび書き込み可能なファイル階層を作成...

Docker+K8S クラスタ環境構築と分散アプリケーション展開

1. Dockerをインストールする yumでdockerをインストール #サービスを開始する sy...

Reactはページング効果を実装する

この記事では、Reactでページング効果を実現するための具体的なコードを参考までに紹介します。具体的...

Docker ファイルの保存パス、ポート マッピング操作モードの変更

コンテナの起動コマンドを取得する方法コンテナはすでに作成されていますが、その起動パラメータ(データが...