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
640
社内勉強会資料 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.4k
サーバーサイドから見るChatworkの現状と未来 / Now and future of Chatwork from server side perspective
shmurakami
3
1.2k
php grpc-client in phpcon2018
shmurakami
0
1.6k
lumen e2e test
shmurakami
0
1.1k
decoded_php.pdf
shmurakami
3
750
良心的にまじめに開発するための心構え
shmurakami
0
180
TypeScriptでKnockoutを書いてみた
shmurakami
3
1.2k
社内勉強会資料 JavaScriptの基本 その1
shmurakami
5
1.7k
Other Decks in Programming
See All in Programming
Why Jakarta EE Matters to Spring - and Vice Versa
ivargrimstad
0
1k
Amazon Qを使ってIaCを触ろう!
maruto
0
400
3rd party scriptでもReactを使いたい! Preact + Reactのハイブリッド開発
righttouch
PRO
1
600
Better Code Design in PHP
afilina
PRO
0
120
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.2k
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
Jakarta EE meets AI
ivargrimstad
0
120
「今のプロジェクトいろいろ大変なんですよ、app/services とかもあって……」/After Kaigi on Rails 2024 LT Night
junk0612
5
2.1k
弊社の「意識チョット低いアーキテクチャ」10選
texmeijin
5
24k
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
350
イベント駆動で成長して委員会
happymana
1
320
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
2
660
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.3k
Building Applications with DynamoDB
mza
90
6.1k
We Have a Design System, Now What?
morganepeng
50
7.2k
Code Reviewing Like a Champion
maltzj
520
39k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Rails Girls Zürich Keynote
gr2m
94
13k
A Philosophy of Restraint
colly
203
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
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Λͬͪ͝Όʹͯ͠ॻ͘ͱྑ͍͜ͱ͕ ແ͍ͷͰͤ͞Δ