Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
社内勉強会資料 PHPプロジェクトでのJavaScript
Search
shmurakami
April 28, 2014
Programming
0
690
社内勉強会資料 PHPプロジェクトでのJavaScript
社内勉強会でJSについて話した時の資料
jQueryについてのちょっろとした話と
JSの中にPHPのタグを入れざるを得ない時の対処法を考えてみた
shmurakami
April 28, 2014
Tweet
Share
More Decks by shmurakami
See All by shmurakami
レガシーなPHPの限界とレガシーからの脱却 / phpcon2019
shmurakami
2
3.8k
サーバーサイドから見るChatworkの現状と未来 / Now and future of Chatwork from server side perspective
shmurakami
3
1.3k
php grpc-client in phpcon2018
shmurakami
0
1.8k
lumen e2e test
shmurakami
0
1.1k
decoded_php.pdf
shmurakami
3
810
良心的にまじめに開発するための心構え
shmurakami
0
200
TypeScriptでKnockoutを書いてみた
shmurakami
3
1.3k
社内勉強会資料 JavaScriptの基本 その1
shmurakami
5
1.9k
Other Decks in Programming
See All in Programming
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
170
20260320登壇資料
pharct
0
130
今からFlash開発できるわけないじゃん、ムリムリ! (※ムリじゃなかった!?)
arkw
0
160
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
260
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
180
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
270
守る「だけ」の優しいEMを抜けて、 事業とチームを両方見る視点を身につけた話
maroon8021
3
1.5k
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.3k
夢の無限スパゲッティ製造機 -実装篇- #phpstudy
o0h
PRO
0
170
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
170
[PHPerKaigi 2026]PHPerKaigi2025の企画CodeGolfが最高すぎて社内で内製して半年運営して得た内製と運営の知見
ikezoemakoto
0
300
Strategy for Finding a Problem for OSS: With Real Examples
kibitan
0
120
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
240
Everyday Curiosity
cassininazir
0
180
Mobile First: as difficult as doing things right
swwweet
225
10k
Unsuck your backbone
ammeep
672
58k
Prompt Engineering for Job Search
mfonobong
0
240
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
82
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
120
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
330
Become a Pro
speakerdeck
PRO
31
5.9k
Transcript
ࣾษڧձ͚ࢿྉ jQueryͱ͔ PHPϓϩδΣΫτͰͷJavaScriptʹ͍ͭͯͱ͔
Twitter: @sk_mrkm ࠷ۙgolang+AngularJS+TypeScriptͰ ͳΜ͔࡞Ζ͏ͱͯ͠·͢ 自己紹介 (公開時用)
今日話すこと ݸਓతʹϝϯς͕·ͩϚγʹͳΔjQuery ͷॻ͖ํ PHPͷϓϩδΣΫτͰJSΛॻ͘ͱ͖ʹΔ ͖͜ͱ
jQuery
jQuery使ってますよね
jQueryの導入 ࠓߋΔඞཁͳ͍Ͱ͢ΑͶ CPXFSͱ͔ͬͨΓదʹམͱ͖ͯͨ͠Β ͍͍ͱࢥ͍·͢
jQueryのオブジェクト jQueryΛಡΈࠐΉͱwindow.$ɹͱ window.jQuery͍ͬͯ͏ΦϒδΣΫτ͕ੜ ͞Ε·͢ ͍ͭ͜Βಉ͡ͷͰ͢ ($ === jQuery)
jQueryの使い方 $(‘’)ͰηϨΫλࢦఆͯ͠ॲཧॻ͚OK $(‘#hoge’).css(‘color’, ‘#ff0000’); $(‘.piyo’).hide(); $===jQueryͳͷͰ͜͏͍͏ॻ͖ํ jQuery(‘#hoge’).css(‘color’, ‘#ff0000’);
jQueryの使い方 jQueryͷॲཧେମ $(ducument).ready(function()); ͱ͔Ͱғ·Ε·͢ $(function(){})ͬͯͷͨ·ʹݟ·͢Ͷ
$(document).ready(...); $(function() {}); この2つの意味は同じです。 実行タイミングに違いがあると思ってたorz
$(document).ready() って?
ready(handler) Description: Specify a function to execute when the DOM
is fully loaded. DOMͷಡΈࠐΈ͕ྃͨ͠λΠϛϯάͰ handler͕࣮ߦ͞ΕΔ
ready(handler) Description: Specify a function to execute when the DOM
is fully loaded. DOMͷಡΈࠐΈ͕ྃͨ͠λΠϛϯάͰ handler͕࣮ߦ͞ΕΔ
$(document).ready(function(){}) $().ready(function() {}) この2つも同じ挙動になる。 (けれども下の方は非推奨の模様)
K2VFSZͷ෦ͰԿ͕ߦΘΕͯ ͍Δ͔͍ͬͯ·͔͢ʁ
$(‘#hoge’).show(); $(‘#hoge’).hide(); ͬͨ͜ͱ͕͋Δͱࢥ͍·͢ɻ ͍ͭ͜ΒԿΛͯ͠ΔͰ͠ΐ͏ʁ
$(‘#hoge’).show(); ! $(‘#hoge’).css(‘display’, ‘block’) $(‘#hoge’).hide(); ! $(‘#hoge’).css(‘display’, ‘none’) styleΛॻ͖͑ͯදࣔඇදࣔΛͯ͠Δ ͚ͩɻDOM͔Βফ͑ΔΘ͚Ͱͳ
͍ɻ
jQuery͕ԿΛͯ͘͠Ε͍ͯΔ͔ ͓͖ͬͯ·͠ΐ͏
jQueryの所感とか評判 ϑΝΠϧαΠζ͕Ͱ͔͍(minifyͰ100KB) HTML͕ԚΕΔ (IDͱ͔classͱ͔͍ͬͺ͍) େମϝϯςͰ͖ͳ͘ͳͬͯٽ͘ ຊମͷιʔεқߴ͍
一方で AngularJSͷதʹjQueryͷܰྔ൛͕͍Δ BackbonejQuery͕ඞཁ KnockoutjQueryΛར༻͢Δͷ͕Ұൠత ͡Όͳ͍͔ͱࢥ͏(ݸਓͷײͰ͢)
ѱධ͋Δ͚ͲjQuery͏ΑͶ
ଟϝϯς͕·ͩϚγ ͳॻ͖ํΛߟ͑ͯΈͨ
メンテがしんどい理由 JSͷ࣮ߦϧʔϧ͕͔Βͳ͍ ॲཧ͕σβΠϯʹґଘ͗͢͠ ԿΛͲ͏͍ͨ͠ͷ͔Θ͔Βͳ͍هड़͕ଟ͍
方針 Ͱ͖Δ͚ͩࡉ͔͍୯ҐͰؔԽ͔ͯ͠Γ͍͢ ໊લΛ͚ͭΔ ηϨΫλΛͨͬͱΘͳ͍Ͱมʹ͔ͯ͠Γ ໊͍͢લ(ry parentͱ͔childͱ͔ґଘ͕ߋʹ૿͔ͯ͠Γͮ Β্͍ʹॏ͍ͷͰͳΔ͘Θͳ͍ (ͦͦfindͬͨ΄͏͕͍)
(function(App){ var Edit = (function(){ return { isText: function(type){return type
=== Hoge.TypeText; }, isImage: function(type) {return type === Hoge.TypeImage; }, toggleImage: function($selector, $imageRow) { if (this.isText($selector.val())) {$imageRow.hide();} else {$imageRow.show();} }};! })(); ! App.nEdit = Edit; })(App); $(document).ready(function(){ ! var $checkedType = $('.typeSelector:checked'); ! var $imageRow = $('.questionImageRow'); ! $('.typeSelector').change(function(){ ! ! App.Edit.toggleQuestionImage($(this), $imageRow); ! }); ! App.Edit.toggleQuestionImage($checkedType, $imageRow); });
݁ہϝϯς͠ΜͲ͍ɻ ϑϨʔϜϫʔΫΛ͍·͠ΐ͏
フレームワーク νʔϜͰ͏ʹ͖ͪͬͱϧʔϧΛܾΊͳ͍ͱίʔυ͕ࢄΒ͔Δ ػೳগͳ͍͚ͲϑΝΠϧαΠζখ͍͍͍͢͞͠ɻখ ͍͞نͩͱඞཁेͳײ͡ ϞόΠϧͩͱͪΐͬͱॲཧ͕ॏ͍ؾ͕͢Δ େن͚ɻͳΜͱͳ͘ආ͚ͯΔ
PHPͰੜ͢ΔϖʔδͰ JSΛॻ͘ͱ͖ʹࢥ͏͜ͱ
PHPʹݶΒͣαʔόଆͰ HTMLΛੜ͢Δ໘Ͱ ى͜Γ͏Δ
PHPでJSを書く <?php $hoge = true; ?> <script> var hoge; if
(‘<?php echo $hoge ?>’) { hoge = ‘hoge’; } else { hoge = ‘fuga’; } console.log(hoge); // hoge </script>
ؾ࣋ͪѱ͍
やるべきじゃない理由 JS͕PHPʹґଘ͍ͯ͠Δ ςετ͕ॻ͚ͳ͍ ݟ௨͕͠ѱ͍ ͖ͪΘΔ(ry
ରॲ๏ʁ
対処法 αʔόαΠυͷॲཧΛAPIԽͯ͠AjaxͰ JSONΛड͚औΔ PHPΛೖΕ͟ΔΛಘͳ͍ॴΛ·ͱΊΔ
JSONを受け取る αʔόαΠυͰϨϯμϦϯάجຊ͠ͳ͍ ͰJSONΛు͔ͤΔ ରॲ๏ͱ͍͏͔Ή͠Ζ͜Ε͕ݱͷ࡞Γํ ͡Όͳ͍͔ͳ͊ͱࢥ͏ αʔϏεͷ࡞ΓํΛࠜຊ͔Βม͑Δඞཁ͕ ͋ΔͷͰίετେ
PHPが絡む場所をまとめる PHPͱJSΛ͢Δ ͱΓ͋͑ͣͷରॲ๏͚ͩͲΒͳ͍ΑΓ ͣͬͱϚγ ͦΜͳʹ͍͜͠ͱͰͳ͍ͷͰΓ͍ͨ
コード var App = App || {}; (function(App){ // ςετͰ͖ͳ͍͔͠ΓͮΒ͍
if ('<?php echo $hoge; ?>') ... else ... App.Bridge = { hoge: '<?php echo $hoge ?>', fuga: '<?php echo $fuga ?>' }; if (App.Bridge.hoge) ... else ... })(App);
// Bridge໊ͬͯલదͳͷ͔͔ΒΜ // PHPͷهड़͕ඞཁͳͷΛ୯ҰͷΦϒδΣΫτʹ͍Δ App.Bridge = { hoge: '<?php echo
$hoge ?>', fuga: '<?php echo $fuga ?>' };
Կ͕خ͍͠ͷʁ
<script> // PHP͕ඞཁͳͱ͜ΖHTMLʹهड़͢Δ App.Bridge = { hoge: '<?php echo $hoge
?>' }; </script> <script src=”app.js”></script> (function() { // PHPͱͰ͖Δ if (App.Bridge.hoge) { // doSomething } })() HTML app.js
<script> // ͦΕͧΕgetterͱ͔ஔ͍͓͚ͯ ɹɹApp.Bridge.getHoge()ͰΛऔΕΔ // ͜ͷؔΛmockʹͯ͠ςετॻ͘ͱ͔Ͱ͖Δ App.Bridge = { getHoge:
function() { return ‘<?php echo $hoge ?>’; } }; </script>
var App = App || {}; (function(App){ // ςετͰ͖ͳ͍͔͠ΓͮΒ͍ if
('<?php echo $hoge; ?>') // doSomething else // doSomething App.Bridge = { hoge: '<?php echo $hoge ?>', fuga: '<?php echo $fuga ?>' }; if (App.Bridge.hoge) // doSomething else // doSomething })(App);
+4ͷதʹαʔόଆͷίʔυ ͕ೖͬͯΔͱ ςετ͕ॻ͚ͳ͍ ϑϩϯτΤϯυ / όοΫΤϯυ͕ᐆດʹͳ ͬͯอकੑ͕ѱ͍ ͳͲσϝϦοτͩΒ͚
まとめ jQueryͷ෦ͰԿΛͬͯΔ͔ͬͱ͘ jQueryΛ͏ͳΒɺͤΊͯϝϯς͍͢͠ॻ ͖ํΛ৺͕͚Δ JSϑϨʔϜϫʔΫ͍͍ͨσεω PHPͱJSΛͬͪ͝Όʹͯ͠ॻ͘ͱྑ͍͜ͱ͕ ແ͍ͷͰͤ͞Δ