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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
800
良心的にまじめに開発するための心構え
shmurakami
0
200
TypeScriptでKnockoutを書いてみた
shmurakami
3
1.3k
社内勉強会資料 JavaScriptの基本 その1
shmurakami
5
1.9k
Other Decks in Programming
See All in Programming
AI時代でも変わらない技術コミュニティの力~10年続く“ゆるい”つながりが生み出す価値
n_takehata
2
650
Claude Code、ちょっとした工夫で開発体験が変わる
tigertora7571
0
200
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
210
Head of Engineeringが現場で回した生産性向上施策 2025→2026
gessy0129
0
210
Ruby x Terminal
a_matsuda
7
580
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
120
浮動小数の比較について
kishikawakatsumi
0
380
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.6k
株式会社 Sun terras カンパニーデック
sunterras
0
2k
ご飯食べながらエージェントが開発できる。そう、Agentic Engineeringならね。
yokomachi
1
280
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
520
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.2k
Featured
See All Featured
Ethics towards AI in product and experience design
skipperchong
2
210
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.4k
Mind Mapping
helmedeiros
PRO
1
110
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
200
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
120
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
80
Site-Speed That Sticks
csswizardry
13
1.1k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
60
42k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
RailsConf 2023
tenderlove
30
1.4k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.4k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
140
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Λͬͪ͝Όʹͯ͠ॻ͘ͱྑ͍͜ͱ͕ ແ͍ͷͰͤ͞Δ