【JavaScript】aタグのhrefとtargetおよびrelの取得と書き換え方法
更新日:2023/02/15
JavaScriptでaタグの属性(hrefとtargetおよびrel)の値を取得したり、書き換えたりする方法をお伝えします。
方法は二つ
aタグのhrefとtargetおよびrel等の属性を取得したり書き換えたりする方法は、二つあります。
一つは属性値の取得および設定を行うsetAttribute()とgetAttribute()を使用する方法です。
setAttribute()およびgetAttribute()で属性値を操作
属性値 = 要素.getAttribute( 属性名 ); // 属性値の取得 要素.setAttribute( 属性名, 属性値 ); // 属性値のセット
もう一つは、要素が持つ同名のプロパティ値から属性値を取得したり、セットしたりする方法です。
プロパティ値で属性値を操作
属性値 = 要素.属性名; // 属性値の取得 要素.属性名 = 属性値; // 属性値のセット
どちらが優れているということはないので、自分の好みで選択するといいです。
ただし、htmlで属性値が指定されていないとき、getAttribute()はnullを返します。
一方、プロパティでの取得は 空文字("")を返します。
この点は注意が必要ですね。
具体的な例
次のaタグを操作するケースを想定した、具体的な例を紹介します。
HTML
<a id="test" href="https://note.affi-sapo-sv.com/sample.php">test</a>
このタグをJavaScriptで要素として取得するには、次のようにdocument.getElementById()を使用します。
JavaScript
const aTag = document.getElementById("test");
この変数aTagを使って、属性値を操作していきます。
hrefの取得・書き換え例
hrefの取得は次のようにおこないます。
hrefの取得
const url = aTag.getAttribute( "href");
// または
const url = aTag.href;
console.log( url ); // https://note.affi-sapo-sv.com/sample.php
hrefの書き換えは次のようにおこないます。
hrefの書き換え
const newUrl = "https://note.affi-sapo-sv.com/";
aTag.setAttribute("href", newUrl );
// または
aTag.href = newUrl;
targetの取得・書き換え例
targetの取得は次のようにおこないます。
targetの取得
const target = aTag.getAttribute( "target");
// または
const target = aTag.target;
console.log( target ); // null または ""
targetの書き換えは次のようにおこないます。
targetの取得
const newTarget = "_blank";
aTag.setAttribute("target", newTarget );
// または
aTag.target = newTarget;
relの取得・書き換え例
relの取得は次のようにおこないます。
relの取得
const rel = aTag.getAttribute( "rel");
// または
const rel = aTag.rel;
console.log( rel ); // null または ""
relの書き換えは次のようにおこないます。
relの取得
const newRel = "noopener";
aTag.setAttribute("rel", newRel );
// または
aTag.rel = newRel;
外部リンク(target="_blank")のときnoopenerを付与
target属性に"_blank"が指定されているリンクをクリックすると、新しいタブが開きます。
このとき新しいタブは、window.openerプロパティを受け取ります。
window.openerプロパティはリンク元のdocumentオブジェクト等を参照できるので、リンク元を操作できてしまうのです。
セキュリティ的にかなり問題がある仕様だと言えます。
対策として、リンクタグのrel属性に "noopener" を付与します。
この属性値が指定されていると、新しいタブのwindow.openerプロパティに情報を送ることを阻止できます。
ページ数が多いWebサイトに、後からrel属性に"noopener" を付与するのは時間がかかってしまい難しいケースがあります。
そこで、JavaScriptで動的に"noopener"を付与するのが効率的です。
次のコードで付与が行えます。
target="_blank"のときnoopenerを付与
document.addEventListener("DOMContentLoaded",()=>{
Array.from(document.getElementsByTagName("a"))
.forEach( a => a.target === "_blank" ? a.rel = "noopener" : null )
});
無理やり一文で処理しています。
- document.getElementsByTagName()でaタグ要素を取得
- Array.fromで取得した要素リストを配列化
- 各要素をforEach()で順番に処理
- 要素のtarget属性が"_blank"なら、rel属性に"noopener"をセット
更新日:2023/02/15
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。