今さら人に聞けない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());
がよくわかっていない。
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>