このサイトは、只今WEB業界で活躍中のデザイナー、プログラマーの方々の情報を集めたweb統合情報サイトです。

Archives Details

スマートフォンUI 要素並び替え(配列複製)JavaScript cloneNode

JavaScript

2013.04.06

この記事は最終更新日から1年以上が経過しています。

最近良くあるなと思うのが、「要素(DOM)を入れ替えたい」と言った要件だったりもします。

ソーシャルゲームなんかになるとカード画像を入替え。とかになりますかね。

以下の様な並びだとして、

タップ→タップで入替え。とか、タップ→スライドで入替え。

だったり。

そんなとき、JavaScript でcloneNode を使えば実現は可能かと思います。

タッチやクリックで要素をelemA、elemBの要素を取得し、

var  newElemA = elemA.cloneNode(true),
           newElemB = elemB.cloneNode(true);
elemA.parentNode.replaceChild( newElemB, elemA );
elemB.parentNode.replaceChild( newElemA,  elemB. );
こちらで入替え可能となります。

ちなみにreplaceChildに関しては以下の様に第一引数に新しい要素、第二引数に古い要素を代入。

replacedNode = parentNode.replaceChild(newChild, oldChild);

newChild: oldChild を置き換える新しいノード

oldChild: newChild に置き換えるノー

replacedNode: 置き換えられたノード

とここまでは、問題ないかと思われますが、複数cloneしたい。つまり配列でcloneしたいってなった時、

シンプルな配列であれば、

var defaultItem,cloneItem;
defaultItem = ["a","b","c"];
cloneItem = [];
for (var i=0, l = defaultItem.length;  i < l;  i++) {
  cloneItem[i] = defaultItem[i];
}
<p>console.log(cloneItem);</p>

console

["a","b","c"]
var defaultItem,cloneItem;
defaultItem = ["a","b","c"];
cloneItem = [];
for (var i = 0, l = defaultItem.length; i < l; i++) {
 cloneItem[i] = defaultItem[i];
}
defaultItem[3] = "d";
cloneItem[3] = "e";

console.log(defaultItem);
console.log(cloneItem);
["a","b","c","d"]["a","b","c","e"]

とできますが、クローンするとなると、

var defaultItem = ["a","b","c","d"],
    cloneItem;
for (var i = 0, l = defaultItem.length; i < l; i++) {
  cloneItem = item[i].cloneNode(true);
}

こんな風にfor文でまわしてもコピーされないわけで、、、困ったちゃんですね。

そこで、ArrayのPrototypeにcloneを追加し、再起させるやり方となります。

Array.prototype.clone = function() {
  if ( this[0].constructor == Array ) {
    var arr, i;
    arr = new Array( this.length );
    for ( i = 0; i < ar.length; i++ ) {
      arr[i] = this[i].clone();
    }
    return arr;
 }
 return Array.apply( null, this );
}

自分自身(コンストラクタ)が配列かどうかをチェックし、新しい配列を作成します。配列の数だけ更に配列として作成。それを返す事によって複数(配列として)cloneすることが出来ます。

applyはcallと似ていますが、thisの値を変更することが出来ます。null か undefined が指定された場合は this の値は global object になりますので、clone自身もグローバルオブジェクトとして扱われます。

では確認してみましょうー!

var cloneItem = new Array();
    defaultItem = ["a","b","c","d"];
    cloneItem = defaultItem.clone();
    console.log(cloneItem);

console.logを確認すると。お、良い感じですね。

Array.prototype.clone = function() {
  if ( this[0].constructor == Array ) {
    var arr, i;
        arr = new Array( this.length );
    for ( i = 0; i < ar.length; i++ ) {
      arr[i] = this[i].clone();
    }
    return arr;
  }
  return Array.apply( null, this );
}

var li = document.querySelectorAll("ul > li");
var cloneItem = new Array();
    defaultItem = [li];
    cloneItem = defaultItem.clone();
    console.log(cloneItem);

domをcloneさせてみると、

といった感じに配列でクローン出来ているのが確認できると思います。

 

Comment

Related Article

JavaScriptで、DOMを放り投げる処理

2024.07.27

2022 VIVA JS World Cup 開幕!! 〜 Vue3で作るサッカーゲーム 〜

2022.12.24

OAuthのフローを可視化できるツールを作ってみました。

2020.05.17

令和の時代に、JavaScriptで Shift-JISファイル作成 全銀データフォーマットに対応する。

2020.03.03

インターネットにて世論調査を行う「世論Web」サービスを始めてみました。

2020.01.31

年末のレトロゲーム熱の際、ファミコンソフト一覧パッケージ作ってました。

2020.01.24

あと10日で「jsdo.it」のサービスが終わってしまう!! ソースダウンロードまだの方は急げぇ〜!

2019.10.21

正規表現 先読み後読み 論理積

2019.07.28

「二段階認証?」という方も 5分で覚える パスワードレス WebAuthnのまとめ

2019.07.07

上級者向け JavaScript 問題集 「javascript-questions」日本語翻訳担当してます。

2019.06.22

CATEGORY LIST

LATEST NEWS

Mac VSCodeで、SFML C++開発環境を作る。

C++

2024.09.09

Rust-SDL2 examplesをすべて試す

Rust

2024.09.01

JavaScriptで、DOMを放り投げる処理

JavaScript

2024.07.27

Rustで創る MOS 6502 CPU その2

Rust

2024.07.23

Rustで創る MOS 6502 CPU その1

Rust

2024.07.19

汎用 3D mesh/model viewerを求め。と、簡単に、FBXファイルをglTF(glb)に変換ツールを求め。

C++

2024.06.06

M1 Macで、OpenGL GLUTを使ってコンパイルする

C

2024.04.27

Rust - Actix Web mongo ユーザー登録 JWT認証

Rust

2024.03.24

Rust - Actix Web JWT 認証認可 APIの作成

Rust

2024.02.25

Rust - Actix Web × JSON 静的ファイルをAPIで返却

Rust

2024.01.19

Rust - Actix Web × MongoDB環境をサクッと起動

Rust

2024.01.18

5分で学ぶ RustでWave Function Collapse (波動関数崩壊アルゴリズム)

Rust

2024.01.15

RANKING

Follow

SPONSOR

現在、掲載募集中です。



Links

About Us

WEBデザイナーの、WEBデザイナーによる、WEBデザイナーの為のサイト。「みんなで書こう!」と仲間を募ってみたが、結局書くのは自分だけとなってしまいました。日々のメモを綴っていきます。

Entry Profile

Graphical FrontEnd Engineer
- Daisuke Takayama

MAD CITY 北九州市で生まれ育つ。20代はバンド活動に明け暮れ、ふと「webデザイナーになりたい。」と思い、デジタルハリウッド福岡校入学。卒業後、数々の賞を受賞、web業界をざわつかせる。
現在、主に、ゲーム制作中心に港区六本木界隈で活動中。

FOLLOW US