0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ノードがHTML内に存在するかを調べる6つの方法

Posted at

はじめに

ノードがHTML内に存在するとは、開発ツール(DevTools)でHTMLを見たときノードが存在するということです。

HTML内に存在しないノードは、削除したノードやcreateElementで作成したばかりのノードです。これらはプログラミング内で変数として存在し得るがHTML内に存在しません。

ReactなどのSPAなページで動的に変化するノードをブックマークレットやユーザースクリプトから操作しようとしたときノードがHTML内に存在しないことが問題になることがあります。

6つの方法

1. getBoundingClientRectを使う方法

function exist_in_html_1(node) {
	var bcr = node.getBoundingClientRect();
	return bcr.height > 0 || bcr.bottom !== 0;
}

2. closestを使う方法

function exist_in_html_2(node) {
	return Boolean(node.closest('html'));
}

3. containsを使う方法

function exist_in_html_3(node) {
	return document.contains(node)
}

4. compareDocumentPositionを使う方法

function exist_in_html_4(node) {
	return !(document.compareDocumentPosition(node)
		& Node.DOCUMENT_POSITION_DISCONNECTED);
}

5. compareBoundaryPointsを使う方法

function exist_in_html_5(node) {
	var range = document.createRange();
	range.selectNode(document.body);
	try {
		var sourceRange = document.createRange();
		sourceRange.selectNode(node);
		range.compareBoundaryPoints(Range.START_TO_START, sourceRange);
	} catch (error) {
		return false;
	}
	return true;
}

6. isConnectedを使う方法

function exist_in_html_6(node) {
	return node.isConnected;
}

最後に

最適解は最後に紹介した方法です。最適解を知らなかったので5つも自作することになりました。MDN Web Docsの英語のドキュメントに日本語訳がないので最適解をご存じない方も多いのではないでしょうか。最適解と5つの自作方法を紹介しました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?