ジャンボモナカ

34歳のハゲデブがHTML5ハイブリッドアプリ開発プラットフォームmonacaを始めました。

今さら人に聞けないmonacaのangular.elementについて

monacaでnendを実装するに当たりいくつかのパターンがあり、そのうちの一つにOnsenUIを使ってかつAngularJSを使用しない場合についてのソースコードがありました。

<!-- index.html -->
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/style.css">
    <script>
      ons.bootstrap();
      var nend_params = {"media":xxxx,"site":xxxx,"spot":xxxx,"type":xxxx,"oriented":xxxx};
      ons.ready(function() {
          var nendOriginalElem = angular.element(document.querySelector('#nend_wrapper'));
          var nendInjectElem1 = angular.element(document.querySelector('#new_nend_wrapper'));
          nendInjectElem1.replaceWith(nendOriginalElem.clone());
      });
    </script>
  </head>
  <body>
    <ons-navigator var="myNavigator" page="page1.html"></ons-navigator>
    <div id="nend_wrapper"><script type="text/javascript" src="http://js1.nend.net/js/nendAdLoader.js"></script></div>
  </body>
</html>

<!-- page1.html -->
<ons-page>
  <div id="new_nend_wrapper"></div>
</ons-page>

よくよく見ると、

ons.bootstrap();
var nend_params = {"media":xxxx,"site":xxxx,"spot":xxxx,"type":xxxx,"oriented":xxxx};
ons.ready(function() {
  var nendOriginalElem = angular.element(document.querySelector('#nend_wrapper'));
  var nendInjectElem1 = angular.element(document.querySelector('#new_nend_wrapper'));
  nendInjectElem1.replaceWith(nendOriginalElem.clone());
});

とあり、そもそも、

var nendOriginalElem = angular.element(document.querySelector('#nend_wrapper'));
var nendInjectElem1 = angular.element(document.querySelector('#new_nend_wrapper'));
nendInjectElem1.replaceWith(nendOriginalElem.clone());

がよくわかっていない。

AngularJS

angularの公式リファレンスで確認すると、jQueryをインクルードしている場合は、jQueryエイリアスを返してくれるみたいで、jQueryが使えない場合は、jQuery liteまたはjqLiteと呼ばれるオブジェクトを返してくれるようだ。

実際に簡単なプログラムを作って試してみる。

<!DOCTYPE html>
<html ng-app="mainApp">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/css/onsenui.min.css"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/css/onsen-css-components.min.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/js/onsenui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/js/angular-onsenui.min.js"></script>
<body>
  <div id="hoge">this is hoge</div>
  <div id="foo"></div>
<script>
var module = angular.module('mainApp',['onsen']);
ons.ready(function(){
  var originalElem = angular.element(document.getElementById('hoge'));
  var injectElem = angular.element(document.getElementById('foo'));
  injectElem.replaceWith(originalElem.clone());
});

</script>
</body>
</html>

cloneメソッドはjQueryのcloneメソッドと同じなのでdomのコピーをしてid="foo"のdivタグにreplace(この場合はappendでもいいのかもしれないが。)している。

ただ、この場合、同じようなdomが二つできてしまうので、下のように最後にremoveメソッドを使えばコピー元のdomを消すことができる。

<!DOCTYPE html>
<html ng-app="mainApp">
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/css/onsenui.min.css"/>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/css/onsen-css-components.min.css"/>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/js/onsenui.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.7.0/js/angular-onsenui.min.js"></script>
<body>
  <div id="hoge">this is hoge</div>
  <div id="foo"></div>
<script>
var module = angular.module('mainApp',['onsen']);
ons.ready(function(){
  var originalElem = angular.element(document.getElementById('hoge'));
  var injectElem = angular.element(document.getElementById('foo'));
  injectElem.replaceWith(originalElem.clone());
  originalElem.remove();
});
</script>
</body>
</html>