IE6/7 における a.getAttribute(href,2) 問題の分析と解決

IE6/7 における a.getAttribute(href,2) 問題の分析と解決

簡単な説明<br />IE6および7では、一般的なaタグ(HTMLで記述され、DOM操作によってページに挿入されるaタグ)において、hrefの値が相対パスである場合、元のhrefの値はa.getAttribute("href")を介して直接取得されず、a.getAttribute("href",2)を介して取得されます。ただし、このaタグがinnerHTMLを介して挿入されている場合、a.getAttribute("href",2)を介しても元のhrefの値を取得できません。 innerHTML='<a href="/haha">test</a>' とすると、IE6,7 ではそれに対する互換処理が行われ、何らかの追加が行われると予測されます。このとき、outerHTML を通して見ると、a の href がすでに完全なアドレスになっています -_-! img の src でも同様の状況が発生すると言われています。
ただ通り過ぎて...上記を読んでください...ナンセンスな話を始めましょう:
---------------------------------------------------------------------------------------------------------------------------------
当初の目標: href 属性が http:// で始まるかどうかを確認するシングルページ アプリケーション。はいの場合はジャンプを続行します。いいえの場合は、互換性のある pushState を通じて URL アドレスを変更し、ルートをトリガーします。
問題: IE6 および 7 をテストしたところ、正しくインターセプトできないことが判明しました...
解決策: Sister Gu に問い合わせたところ、IE6 と 7 には getAttribute の 2 番目のパラメータがあることを知りました。これを 2 に設定すると、元の属性値が取得されます。紹介リンクは以下の通りです。
http://msdn.microsoft.com/en-us/library/ie/ms536429%28v=vs.85%29.aspx
これを見て、密かに嬉しくなり、すぐにコードを1行追加しました...テストするためにCtrl+F5を押した後...すぐに動作しなくなりました...なぜ動作しないのでしょうか? !分かりません…
この時点では、友人とチャットをしていました... どこで話が逸れたのかはわかりません... 最後に、フランクに尋ねたところ、コード内の他の干渉を排除し、次のコードでテストしました。

コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html lang="ja">
<ヘッド>
<メタ文字セット="UTF-8">
<title>テスト</title>
</head>
<本文>
<a id="a" href="" onclick=".getAttribute(\"href\",2)">テスト</a>
</本文>
</html>

IE6 または 7 でクリックすると、大きな「/haha」がポップアップ表示されます。 ! !何か他のことが起こっているのではないかと疑い始めました。このとき、a タグがどのようにして (文字列ベースの js テンプレート、innerHTML) 取得されるのかを考えました...そこで、次のコードでシミュレートしました。

コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html lang="ja">
<ヘッド>
<メタ文字セット="UTF-8">
<title>テスト</title>
</head>
<本文>
<div id="test"></div>
<スクリプト>
document.getElementById("test").innerHTML = '<a id="a" href="/haha" onclick="alert(this.getAttribute(\'href\',2));return false;">テスト</a>';
</スクリプト>
</本文>
</html>

再度テストしました...妹の...問題が再発しました!実際のテストでは、を生成した後、再度 a に対して setAttribute("href","/haha",2) を実行し、次に getAttribute("href",2) を実行すると、"/haha" が返されます。でも、こういうことをテンプレートでやるのは、あまりにも気持ち悪いので、きっぱり諦めましょう!フランクのアドバイスに耳を傾けた方が良いでしょう... 2 つのリンク要素を識別する属性を追加するだけで、行き詰まらないようにしましょう。
もう一度ドリル-_-!:

コードをコピー
コードは次のとおりです。

<!doctypehtml>
<html lang="ja">
<ヘッド>
<メタ文字セット="UTF-8">
<title>テスト</title>
</head>
<本文>
<div id="test"></div>
<スクリプト>
var テスト = document.getElementById("テスト");
var a = document.createElement("a");
var txt = document.createTextNode("テスト");
a.href="/はは";
a.onclick=関数() {
alert(this.getAttribute('href',2));//"/はは"
false を返します。
};
txt を追加します。
テストします。
</スクリプト>
</本文>
</html>

最後に、innerHTML を通じてノードを挿入する場合、IE6 と 7 は正しいと判断する「エラー許容」処理を実行するのではないかと思います...そして、私は間違っていました...

<<:  IDEA が Docker を統合してリモート展開を実現するための手順

>>:  MySQL の undo、redo、binlog の違いを簡単に分析します

推薦する

WeChatアプレットの手動および自動追跡の実装の詳細説明(Taro)

どの企業もユーザーベースを拡大したいのであれば、ユーザーの操作データを収集・分析する必要があり、その...

CSS3 は本当に SCSS に取って代わるのでしょうか?

Web ページのスタイル設定に関しては、プロジェクトで純粋な CSS または SCSS (および他...

負荷分散と動的および静的分離操作を実現するDocker NginxコンテナとTomcatコンテナ

Tomcat8 イメージをダウンロード [root@localhost ~]# docker sea...

ログインボックスのメールプロンプトを実装するネイティブJS

この記事では、登録またはログイン時に電子メール アドレスを入力する際のドロップダウン プロンプトのネ...

MySQL に接続されている IP アドレスを表示する方法の例

具体的な方法:まずコマンドプロンプトを開きます。次に、[ mysql -u root -p ] コマ...

MySQLデータベース操作の基本コマンド

1. データベースを作成します。 データ data _name を作成します。 PHP でデータベー...

MySQL テーブル名の大文字と小文字の選択

目次1. 大文字と小文字の区別を決定するパラメータ2. パラメータ変更に関する注意事項要約: 1. ...

AWS無料サーバーアプリケーションとネットワークプロキシ設定チュートリアルの詳細な説明

目次予防必要条件AWSアカウントを申請する仮想マシンの申請と有効化仮想マシンを申請するセキュリティグ...

MySQL で UTF-8 エンコーディングを使用しないのはなぜですか?

MySQL UTF-8 エンコーディングMySQL は 2003 年のバージョン 4.1 から U...

Docker-compose インストール yml ファイルの設定方法

目次1. オフラインインストール2. オンラインインストール3. アンインストール4. ymlファイ...

MySQL UPDATE ステートメントの非標準実装コード

今日は、MySQL データベースと SQL 標準 (および他のデータベース) の UPDATE ステ...

MySqlはページクエリ機能を実装します

まず、ページ分割クエリを使用する理由を明確にする必要があります。データが膨大なため、すべてのデータを...

数千万データを持つMySQLテーブルを最適化する実践記録

序文まずここで説明させてください。インターネット上では、Alibaba では 500 万のデータを異...

面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...

MySQLデータベースに画像を保存するいくつかの方法

通常、ユーザーがアップロードした写真はデータベースに保存する必要があります。一般的に、解決策は 2 ...