以下の投稿の続きです。
【jQuery】.html()を使って自要素も含めたHTMLコンテンツの取得方法が知りたい
現在HTML,jQuery(JavaScript),PHP,cakePHP3を使ってアプリケーションを作っています。
仕様としては、**画面の要素をコピーしてそれを『順番を変えて』別画面に表示する。**というものです。
以下のコードだとその仕様を実装できるのですが、なぜか現場ではそれが実現できません。
ざっくり処理の流れとしては、
1.outerHTMLを使ってHTML文字列を取得し、
2.それをパラメータとしてPOST送信でコントローラに渡し、
3.最後にsetメソッドで別画面に順番を変えて表示しています。
そこで質問としては、結論から言うと
・なぜ現場ではできないのか知りたい。そのできない原因の可能性を推測でいいので教えていただきたい。
あるいは
・以下のコードで厳しそうなら他のやり方を教えていただきたい。
です。
画像のような動きを実現できているコードは以下です。
hoge.ctp
HTML
1<ul id="hoge"> 2 <li class='a'> 3 <div>1番目</div><input type="text" value="1番目"> 4 <div>1番目</div><input type="text" value="1番目"> 5 <div>1番目</div><input type="text" value="1番目"> 6 </li> 7 <li class='b'><div>2番目</div><input type="text" value="2番目"></li> 8 <li class='c'><div>3番目</div><input type="text" value="3番目"></li> 9</ul> 10<a href="javascript:document.frm1.submit()" onclick="hoge()">別画面へ</a> 11 <form name="frm1" method="POST" action="http://localhost/cakephp3/Sample/fuga" target="_blank"> 12 <input type="hidden" name="firstHTML" value=""> 13 <input type="hidden" name="secondHTML" value=""> 14 <input type="hidden" name="thirdHTML" value=""> 15 </form> 16 17 18<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 19<script> 20function hoge(){ 21 22 var firstHTML = $('.a')[0].outerHTML; 23 var secondHTML = $('.b')[0].outerHTML; 24 var thirdHTML = $('.c')[0].outerHTML; 25 26 $("input[name='firstHTML']").val(firstHTML); 27 $("input[name='secondHTML']").val(secondHTML); 28 $("input[name='thirdHTML']").val(thirdHTML); 29 30} 31</script> 32
SampleController.php
php
1<?php 2namespace App\Controller; 3 4use App\Controller\AppController; 5 6class SampleController extends AppController 7{ 8 9 public function hoge() 10 { 11 12 } 13 14 public function fuga() 15 { 16 17 // 現場ではこのように確認したが、HTMLは出力されずテキスト部分のみ出力された。 18 // $this->autoRender = false; 19 // var_dump($this->request->data); 20 21 $this->set('htmlData', $this->request->data); 22 23 } 24} 25 26
fuga.ctp
html
1 2<ul id="hoge"> 3<?= $htmlData['firstHTML'] ?> 4<?= $htmlData['thirdHTML'] ?> 5<?= $htmlData['secondHTML'] ?> 6</ul> 7
現場でも同じやり方をしているのですが、なぜかできません。
どのようにできないかというと、別画面にHTML文字列を渡せずに中のテキストノード(ここで言う1番目、2番目、3番目)を渡しており、それが表示されているようなのです。
実際どこでおかしくなっているか検証しました。
javascriptのouterHTMLの段階、val()でinputタグに詰めこんでいる段階では、ちゃんとHTML文字列になっていて、
PHPのdataメソッドで受け取った段階、dataメソッドの中身をvar_dump()で確かめるとテキスト部分だけになっているのです。
このコードと現場のコードで変わっているところと言えば、
現場のコードは、コピー元の要素がやたら多く、HTML文字列がやたら長いということです。
ただPOST送信なので、ある程度のデータ量にも耐えられると思いますし、文字列の多さが原因であったとしてもテキストだけになってしまう理由がわかりません。
もし何かわかる方や推測できる方がいらっしゃいましたらアドバイスいただけると幸いです。
また他のやり方で実現する方法を知っている方がいらっしゃれば教えていただきたいです。
長くなりましたがよろしくお願い致します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/04/08 20:16
2016/04/09 05:01
2016/04/09 05:09 編集
2016/04/09 05:31
2016/04/09 05:47
2016/04/09 05:57