20210608のHTMLに関する記事は17件です。

【javascript】シンプルなtableの動的行追加・削除(ボタンクリックで行追加・削除)

やりたいこと tableを、ボタンクリックで行追加、削除する ●次の記事 【javascript】シンプルな動的tableのinputの値取得 完成形、動作 See the Pen table-clickadd/clickdel by Hirofumi Sato (@hfmst) on CodePen. ざっくり解説 行追加 tableとthだけ用意 createElementで、追加するtr(行要素)を作っておく 繰り返しで「td作る→tdに何か入れる→trにどんどん追加 3で作ったtrをtdに入れる 削除 最新のtableの最終行取得 deleteRowで削除 コード index.html <!--ボタン配置--> <div> <button onclick="add()">行追加</button> <button onclick="del()">行削除</button> </div> <!--table作成とヘッダーだけ先に--> <table id="tbl" border="1" style="border-collapse:collapse;"> <tr> <th>名前</th> <th>趣味</th> <th>好きなもの</th> </tr> </table> js.html //繰り返し使うtableだけ先に定数に格納 const tbl = document.getElementById("tbl"); //行追加 function add(){ //空の行要素を先に作成tr let tr = document.createElement("tr"); //以下、繰り返し処理 for(let i=0;i<3;i++){ let td = document.createElement("td"); //新しいtd要素を作って変数tdに格納  let inp = document.createElement("input"); //tdに何か追加。ここは例としてinput  td.appendChild(inp); //tdにinpを追加 tr.appendChild(td); //trにtdを追加 } //完成したtrをtableに追加 tbl.appendChild(tr); } //以下、末尾行削除処理 function del(){ let rw = tbl.rows.length;//行数取得 tbl.deleteRow(rw-1);//最終行を指定して削除 }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

javascriptでシンプルなtableの動的行追加・削除(ボタンクリックで行追加・削除)

やりたいこと tableを、ボタンクリックで行追加、削除する 完成形、動作 See the Pen table-clickadd/clickdel by Hirofumi Sato (@hfmst) on CodePen. ざっくり解説 行追加 tableとthだけ用意 createElementで、追加するtr(行要素)を作っておく 繰り返しで「td作る→tdに何か入れる→trにどんどん追加 3で作ったtrをtdに入れる 削除 最新のtableの最終行取得 deleteRowで削除 コード index.html <!--ボタン配置--> <div> <button onclick="add()">行追加</button> <button onclick="del()">行削除</button> </div> <!--table作成とヘッダーだけ先に--> <table id="tbl" border="1" style="border-collapse:collapse;"> <tr> <th>名前</th> <th>趣味</th> <th>好きなもの</th> </tr> </table> js.html //繰り返し使うtableだけ先に定数に格納 const tbl = document.getElementById("tbl"); //行追加 function add(){ //空の行要素を先に作成tr let tr = document.createElement("tr"); //以下、繰り返し処理 //新しいtd要素を作って変数tdに格納 //tdに何か追加。ここは例としてinput //trにtdを繰り返し追加 for(let i=0;i<3;i++){ let td = document.createElement("td");  let inp = document.createElement("input");  td.appendChild(inp); tr.appendChild(td); } //完成したtrをtableに追加 tbl.appendChild(tr); } //以下、末尾行削除処理 function del(){ let rw = tbl.rows.length;//行数取得 tbl.deleteRow(rw-1);//最終行を指定して削除 }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者でもわかる】iosの端末でフォーム系のタグのCSSをリセットする方法&代替CSS案

どうも7noteです。iPhoneなどででるデフォルトのフォーム系タグのCSSを無効化してかつ代わりのCSS案を考えます iOS端末ではフォーム系のタグであるinputやbuttonの表示でデフォルトのCSSが聞いてしまうため、デザインがイマイチになってしまいます。 ・ios端末のデフォルトのセレクトボックスとボタン これのCSSを無効化してさらにオリジナルのCSSをあてていきます。 ios端末のフォーム系のCSSを無効化する方法 style.css /* 何もかも無効にしたい場合 */ input,select{ -webkit-appearance: none; border: none; } /* ボタン系だけ無効化したい場合 */ input[type="submit"], input[type="button"] { -webkit-appearance: none; } /* ラジオボタンやチェックボックスを無効化(正確には非表示)*/ input[type="radio"], input[type="checkbox"] { display: none; /* これだけ対策方法がちょっと違います */ } これで無効にすることができました。 次は代わりとなるCSSを入れていきます。 PCのGoogleChromeでみた場合に近いCSSを入れてみましょう。 無効化した後に変わりに入れるCSS例 index.html <input type="submit"> <div class="selectBox"> <select name="" id=""> <option value="">選択してください</option> </select> </div> style.css input[type="submit"], input[type="button"] { color: #fff; background-color: #2D9D53; } .selectBox { display: inline-block; border: 1px solid #000; border-radius: 5px; position: relative; padding-right: 15px; } .selectBox::before { content: ""; width: 5px; height: 5px; border-right: 1px solid #000; border-bottom: 1px solid #000; display: inline-block; position: absolute; top: 0; bottom: 0; right: 10px; margin: auto; transform: rotate(45deg); } まとめ iPhoneはめちゃくちゃ普及率が高いのに、こういうかゆいところに手が届かないのが難点。 iPhoneのためだけに余計なCSSが増えるのはソースを管理する側としては大変ですが、iPhoneで見る人が多いので時代の波には逆らえません。 その時代に合わせたコーディング方法を常に実践していくことが重要ですね。本日の学びです。 おそまつ! ~ Qiitaで毎日投稿中!! ~ 【初心者向け】WEB制作のちょいテク詰め合わせ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HTML/CSSで作成したポートフォリオをGitHubで公開する

はじめに プログラミングスクールでポートフォリオサイトを公開する方法を教えてもらいましたが、忘れないようにするために今回記事を書きました。 手順1 リポジトリを作成する コードを公開するためには、GitHubに「リポジトリ」を作成しなければなりません。 まずは、GitHubにアクセスします。 https://github.com/ 次に、ログインまで終わらせたら左上にあるNewボタンを押します。 リポジトリ名を入力して、「Create repository」ボタンを押します。 リポジトリには、Public(公開)とPrivate(非公開)の2種類あります。 今回作成したポートフォリオサイトは全体に公開したいので、Publicにしました。 これでリポジトリの作成は完了です。 完了した後の画面は後ほど使用するので、開いたままにしておきます。  手順2 Git管理する 次に公開したいコードをGit管理します。 公開したいコードが置いてあるフォルダまで移動します。 以下のコマンドを順番に実行します。 git init git add . git commit -m "first commit" git branch -M main git remote add origin 「gitHubのリポジトリのURL」 git push origin main コマンドが無事に実行されると、公開されています。 手順3 GitHub Pagesを利用してHTMLを公開 GitHubのリポジトリページの上部右側にあるSettingsボタンを押します。 左側のメニューに、Pagesがあるので、そちらへ移動します。 Branchにmainを選択して、Saveボタンを押します。 Saveボタンを押すとリンクが表示されます。 このリンクを確認していただくと、公開されたポートフォリオが見ることができます。 その他 ポートフォリオが表示されない時は 公開したいHTMLのファイル名が「index.html」になっていることを確認してください。 他のファイル名になっていると、表示されません。 HTMLを修正した場合 以下のコマンドを実行します。 git add . git commit -m "修正内容" git push origin main
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【2021】How to resize an image from the web and send it to Cloud Storage for Firebase

【2021】How to resize an image from the web and send it to Cloud Storage for Firebase I have implemented a process to resize a logo image and send it to Cloud Storage for Firebase. I struggled a bit with the conversion to base64, blob, etc., so I'll share it so that new implementers can realize the process they want to do as quickly as possible. index.html <!-- Optional image file button (This is implemented in my case because the file selection button is an image instead of the default button, but the normal file function is also acceptable. --> <label> <!-- Show part --> <span class="filelabel" title="Select a file"> <img src="images/camera.png"" width="32" height="26" alt="Image"> <!-- Selsect --> </span> <!-- Hide the original selection form. --> <input type="file" name="datafile" id="logo-img-input" onChange="imgPreView(event)"> </label> <div id="preview"></div> <canvas id="for-resize-canvas" style="display: none;"></canvas> <button id="send" class="btn btn-primary">SEND</button> style="display: none; As for the canvas, I hide it because without it, another image view would be created. The resizing process can be done without displaying it. index.js //===Preview Image function imgPreView(event) { let file = event.target.files[0]; let reader = new FileReader(); let preview = document.getElementById("preview"); let previewImage = document.getElementById("previewImage"); if(previewImage != null) { preview.removeChild(previewImage); } reader.onload = function(event) { let img = document.createElement("img"); img.setAttribute("src", reader.result); /// Size of the image to be displayed in the preview (Warning : not the size to be resized) img.width = 200; img.height = 200; img.setAttribute("id", "previewImage"); preview.appendChild(img); }; reader.readAsDataURL(file); } ///When the "SEND" button is pressed document.getElementById("send").onclick = function() { let files = document.getElementById('logo-img-input').files; ///=== register/update to DB /// If a file is selected if (files.length == 1) { ///===Resize the image -> Drawto the canvas -> Conversion process to blobe format (get and use previewImage image instead of file) let orgImage = document.getElementById('previewImage'); let orgWidth = orgImage.width; // Save the original width let orgHeight = orgImage.height; // Save the original height let targetImg = new Image(); targetImg.src = $("#previewImage").attr('src'); ///Specify the horizontal length as width, and calculate the reduced height while maintaining the aspect ratio. let width = 300; let ratio = width / targetImg.width; let height = targetImg.height * ratio; ///Draw to the canvas let canvas = $("#canvas"); let ctx = canvas[0].getContext('2d'); $("#canvas").attr("width", width); $("#canvas").attr("height", height); ctx.drawImage(targetImg, 0, 0, width, height); /// Get the image from canvas as base64 let base64 = canvas.get(0).toDataURL('image/jpeg'); /// Uncomment this section if you want to see the base64 values displayed. /// console.log("base64 : " , base64); /// Creating image data from base64 let barr, bin, i, len; bin = atob(base64.split('base64,')[1]); len = bin.length; barr = new Uint8Array(len); i = 0; while (i < len) { barr[i] = bin.charCodeAt(i); i++; } blob = new Blob([barr], {type: 'image/jpeg'}); /// Uncomment this section if you want to see the blob values displayed. // console.log("blob : " , blob); let file_path = "/anyPathOf/" + "/outputImg.jpg"; let logImgRef = firebase.storage().ref().child(file_path); logImgRef.put(blob).then(function(snapshot) { /// If you want to know the URL where the image is saved logImgRef.getDownloadURL().then(img_url => { console.log("savedImgUrl : ", img_url); /// Once the URL of the image is obtained, it is registered in the DB. /// [Any Codes] }); }); } //If no file is selected else { /// [Any Codes] } } I'm hoping this article will help some of you out! Please be nice to me on Twitter! https://twitter.com/funny_man_daa
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【2021】WEBから画像を縦横比を維持してリサイズし、Cloud Storage for Firebaseに送信する方法

【2021】WEBから画像をリサイズしてCloud Storage for Firebaseに送信する方法 ロゴ画像をリサイズしてCloud Storage for Firebaseに送信する処理を実装しました。 base64, blobへの変換などに少し苦戦したので、新たに実装する方が少しでも早く行いたい処理を実現できるように共有します。 index.html <!-- 任意画像ファイルボタン(自分の場合はファイル選択ボタンをデフォルトのボタンではなく画像にしているためこのような実装になっているが、通常のファイル機能でもOK。) --> <label> <!-- ▽見せる部分 --> <span class="filelabel" title="ファイルを選択"> <img src="images/camera.png"" width="32" height="26" alt="+画像"> <!-- 選択 --> </span> <!-- 本来の選択フォームは隠す --> <input type="file" name="datafile" id="logo-img-input" onChange="imgPreView(event)"> </label> <div id="preview"></div> <canvas id="for-resize-canvas" style="display: none;"></canvas> <button id="send" class="btn btn-primary">SEND</button> style="display: none; に関しては、これをつけないともう一つ画像のViewができてしまうので、canvasを非表示にしています。 表示をしなくともリサイズ処理は問題なくできますので。 index.js //===画像プレビュー function imgPreView(event) { let file = event.target.files[0]; let reader = new FileReader(); let preview = document.getElementById("preview"); let previewImage = document.getElementById("previewImage"); if(previewImage != null) { preview.removeChild(previewImage); } reader.onload = function(event) { let img = document.createElement("img"); img.setAttribute("src", reader.result); /// プレビューに表示する画像のサイズ(Warning : リサイズするサイズではない) img.width = 200; img.height = 200; img.setAttribute("id", "previewImage"); preview.appendChild(img); }; reader.readAsDataURL(file); } ///アカウント情報の登録ボタンが押されたら document.getElementById("send").onclick = function() { let files = document.getElementById('logo-img-input').files; //=== DBへ登録/更新 if (files.length == 1) { console.log("ファイル選択ありの場合"); ///===画像をリサイズ -> canvasへDraw -> blobe形式への変換処理(fileからではなくpreviewImageの画像を取得して使用する) let orgImage = document.getElementById('previewImage'); let orgWidth = orgImage.width; // 元の横幅を保存 let orgHeight = orgImage.height; // 元の高さを保存 let targetImg = new Image(); targetImg.src = $("#previewImage").attr('src'); //横の長さをwidthとして指定し、縦横比を維持した縮小後の高さを計算 let width = 300; let ratio = width / targetImg.width; let height = targetImg.height * ratio; //canvasに描画 let canvas = $("#canvas"); let ctx = canvas[0].getContext('2d'); $("#canvas").attr("width", width); $("#canvas").attr("height", height); ctx.drawImage(targetImg, 0, 0, width, height); /// canvasから画像をbase64として取得する let base64 = canvas.get(0).toDataURL('image/jpeg'); /// base64の値を表示して見る場合はここのコメントアウトを外す /// console.log("base64 : " , base64); /// base64から画像データを作成する let barr, bin, i, len; bin = atob(base64.split('base64,')[1]); len = bin.length; barr = new Uint8Array(len); i = 0; while (i < len) { barr[i] = bin.charCodeAt(i); i++; } blob = new Blob([barr], {type: 'image/jpeg'}); /// blobの値を表示して見る場合はここのコメントアウトを外す // console.log("blob : " , blob); let file_path = "/anyPathOf/" + "/outputImg.jpg"; let logImgRef = firebase.storage().ref().child(file_path); logImgRef.put(blob).then(function(snapshot) { /// 画像の保存先URLを知りたい場合 logImgRef.getDownloadURL().then(img_url => { console.log("savedImgUrl : ", img_url); /// 画像のURLが取得できたらDBへ登録の処理など /// [省略] }); }); } else { //===画像が設定されていない時の処理 /// [省略] } } 少しでも救われる方がいればと思います! Twitterでも仲良くしてください! https://twitter.com/funny_man_daa
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ブログをするなら被リンクを貼れ

ブログを運用したいなら、まずドメインランクを上げることを考えましょう。 中古ドメインを購入してもいいですが、過去にペナルティを受けてしまったドメインもあるので注意しましょう。 被リンクは、自然につく被リンクとそうでない被リンクがあります。 やる過ぎてしまうとあまり良くないので、自演で被リンクを設定する際はほどほどに行いましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

readonlyのセレクトボックスを値変更不可にするjquery

概要 htmlのselectタグにreadonly属性をつけても、見た目それっぽくなるだけで変更できてしまう。 それを解決する方法の1つである「選択中以外の選択肢をすべてdisabledにする」の汎用コード。 本題 $(function(){}) の中に入れておけばいい感じにやってくれる $("form select[readonly] > option:not(:selected)").attr('disabled', 'disabled'); ポエムな背景 そこそこ汎用的だと思うのだけどそのへんに転がってると思ったら見当たらなくて久しぶりにセレクタ調べました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

readonlyのセレクトボックスを値変更不可にするjavascript

概要 htmlのselectタグにreadonly属性をつけても、見た目それっぽくなるだけで変更できてしまう。 それを解決する方法の1つである「選択中以外の選択肢をすべてdisabledにする」の汎用コード。 本題 jQuery版 $(function(){ $("form select[readonly] > option:not(:selected)").attr('disabled', 'disabled'); }) 素のjs版 @sgn9 さんにコメントで頂きましたので並べておきます window.addEventListener('DOMContentLoaded', () => { document.querySelectorAll('select[readonly] option') .forEach(e => e.disabled = !e.selected); }); ポエムな背景 そこそこ汎用的だと思うのだけどそのへんに転がってると思ったら見当たらなくて久しぶりにセレクタ調べました
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

外部のHTML,CSS,JavaScriptをRailsで表示させる。

自作のWebアプリケーションを作成するときに、あらかじめHTMLテンプレートでテンプレートを作成した後に、それをRailsのアプリケーションに反映させよう、と言う考えのもと、作成しました。 結論めっちゃ失敗した 簡単に失敗したところ記載します。 単純にassets/stylesheet/に配置 CSSは読み込んでくれました。 ただ中身に注意。 特にimage-urlなどrubyのcssと通常のcssで記法が異なる点があります。 ここまではまだ良かったです。 ネックはJavaScript もうこれは思い出したくないくらいエラーが出ました。 その度に解決方法を模索して、結果として下記を実行したら、解消されました。 ①jQueryの導入 これは割と初期でやりました。 ②複数のjsファイルを全部application.jsに転記 これは全然ダメでした。 ③application.jsの初期で記述されているrequireをコメントアウトして、importで追加のjsファイルを読み込む これが効果抜群でほぼ解決しました。 言ってもまだ全部解決してない まだ解決してないし、なぜ初期で記述されているrequireがダメだったのかは考察が必要ですが、一旦、やりたいことできたので、ほんとにホッとしてます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

外部のHTML,CSS,JavaScriptをRailsで表示させる(Turbolinksが原因っぽい)

自作のWebアプリケーションを作成するときに、あらかじめHTMLテンプレートでテンプレートを作成した後に、それをRailsのアプリケーションに反映させよう、と言う考えのもと、作成しました。 結論めっちゃ失敗した 簡単に失敗したところ記載します。 単純にassets/stylesheet/に配置 CSSは読み込んでくれました。 ただ中身に注意。 特にimage-urlなどrubyのcssと通常のcssで記法が異なる点があります。 ここまではまだ良かったです。 ネックはJavaScript もうこれは思い出したくないくらいエラーが出ました。 その度に解決方法を模索して、結果として下記を実行したら、解消されました。 ①jQueryの導入 これは割と初期でやりました。 ②複数のjsファイルを全部application.jsに転記 これは全然ダメでした。 ③application.jsの初期で記述されているrequireをコメントアウトして、importで追加のjsファイルを読み込む これが効果抜群でほぼ解決しました。 追記:Turbolinksが悪さをしていたっぽい 特にエラーが出ていた時はjQueryが読み込まれていないことが原因でした。 Uncaught TypeError: webpack_require(...) is not a functionが出ていました。 該当の行を確認すると、確かにjQueryが読み込まれていないことが原因。 で、調べてみるとTurbolinksが悪さをしている可能性が。 【Rails】初心者向け!画面遷移の高速化を行うTurbolinksについて図を用いて詳しく解説 Turbolinksは簡単に言うとページの表示を高速化させるためのライブラリです。 いわゆる非同期処理というものです。 しかし一方で、readyやwidowのイベントが発火しない、といったトラブルが発生しているようです。 今回はこれがほぼ可能性が高い。 なぜならapplication.jsに window.jQuery = window.$ = require("./jquery.min") というwindowのイベントを定義していたにもかかわらず、イベントが発火していなかったから。 特にRails4以降は標準で入っているライブラリなので、jsが読み込まない、ということであれば、デフォルトで入っているライブラリを一つずつコメントアウトしてみると良いかもしれません。 (もちろんページの表示速度は遅くなるだろうが。) 言ってもまだ全部解決してない まだ解決してないし、なぜ初期で記述されているrequireがダメだったのかは考察が必要ですが、一旦、やりたいことできたので、ほんとにホッとしてます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CSSの詳細度について

はじめに cssで装飾する場合に詳細度というものがあり、どのCSSプロパティが適用されるかを決める手段があるのでアウトプットしていきます。 適用されるstyleについて spanタグ  まずは簡単に記述していきます。 index.html <!DOCTYPE html> <html lang="en"> <head> <!-- 省略 --> <link rel="stylesheet" href="style.css"> </head> <body> <span>こんにちは! </span> <span>こんにちは! </span> </body> </html> style.css span { width: 100px; height: 200px; background-color: darkgray; } このような形でタグ全ての大きさや色を変える事ができます。 では1つだけ変えたい場合がどのようにするのか。 classやidを使います。 適用されるstyleについて class id index.html <!-- 省略 --> <body> <span class="first">こんにちは! </span> <span id="first">こんにちは! </span> </body> classに名前をつけてそれだけを指定する事ができます。 ポイントはclassの場合は . が先頭に必要になります。 style.css .first { width: 100px; height: 200px; background-color: darkgray; } またidの場合は先頭に#が必要になります。 style.css #first { width: 100px; height: 200px; background-color: red; } 今回はあえて同じ名前にしましたが同じ名前でもclassとidは別ものなので適用されます。 同じ要素に対して複数のstyleが適用された場合 index.html <!-- 省略 --> <body> <span class="first" id="second">こんにちは! </span> <span>こんにちは! </span> </body> style.css .first { width: 100px; height: 200px; background-color: darkgray; } #second { width: 100px; height: 200px; background-color: red; } このように同じ要素に複数のstyleが適用された場合どうなるのか。 結論、id="second"が適用されます。 これは詳細度を元にしてどのstyleが当たるのかが決定されます。 MDN Web Docsに記載されています。 詳細度Specificityは、どの CSS プロパティが要素に最も関係があるか、すなわち適用されるかをブラウザーが決定する手段です。詳細度は様々な組み合わせの CSS セレクターで構成される一致規則に基づいています。 以下のリストは、セレクターを詳細度の小さな順に並べたものです。 要素型セレクター (例えば h1) と 擬似要素 (例えば ::before) クラスセレクター (例えば .example)、属性セレクター (例えば [type="radio"])、擬似クラス (例えば :hover) ID セレクター (例えば #example) 以下の場合はどうなるでしょうか。 style.css .first { width: 100px; height: 200px; background-color: darkgray; } span { width: 100px; height: 200px; background-color: red; } classの方がより詳細度があるので適用されます。  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Chrome内蔵PDFviewerに設定可能なパラメータ

Qiitaに記事が無かったので自分で書いてみることにしました。 以下の方法はFirefox等の他のブラウザでは機能しませんが、同様に設定方法があるかもしれません。(未調査) とりあえずChromeだけ。 はじめに ChromeでPDFを表示する時、内臓のPDFビューアで表示されますが、 このPDFビューアの表示をカスタマイズすることが出来ることはご存知でしょうか? Chromeのドキュメント等を探しても特に記載は無いのですが、 Chroniumのissueにこんなものがあります。 設定方法 以下のようにURLの末尾にパラメータを設定するだけ <object data="./test.pdf#toolbar=0" style="width:600px; height:800px;"></object> 設定可能なパラメータ 編集中
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

夢小説/名前変換小説でdocument.writeを使わずに変換する

夢小説界を牛耳っていた(?)DreamMakerさんの機能がたぶんもう使えなくなってしまう。 でも誰も書いてくれないなぁ、もうオワコンなのかなぁ… 私たちは迫害されて死にゆく運命なんや… 新しい仕組みを作ってくださってるサイトさんもありますが、 あんまり広まってるようには感じられない(まぁ他のサイトさん見ないから知らんけど) わいずあとりえさん…(検索避け)のシステムを利用しているのですが、 Javascript に長けていないので中身みても難しくて改変などができないのであった。 それで仕方ないので自分で書きました。誰かの参考になれば幸いであります。 ※ 私はちょっとプログラムを触るのでちょっと書けたけど、あんまりそういうのができない人には参考になるかもしれない程度であり、プロ(?)のひとが見たらクソみたいなコードかもしれないです。ゆるして。 やりたかったこと ローマ字名をいただいて、イニシャルを小説中で使うということがしたかった。 もう二度と使わないかもしれないから一時的にDream1(プロンプト式+document.write)を使ってたけど また使うかもしれないし長い目で見たらやっぱりdocument.writeは使いたくないので勉強することにした。 まあ、ここではとりあえずダイアログで一つ名前をいただいて とりあえずCookieに保存したり消したりする方法をご紹介いたします。 結論:innnerHTMLをつかう まぁ話が長くなるのでとりあえずHTMLを載せますから見てくださいよ。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-style-type" content="text/css"> <META NAME="GOOGLEBOT" CONTENT="NOINDEX, NOFOLLOW"> <META NAME="ROBOTS" CONTENT="NOARCHIVE,NOINDEX,NOFOLLOW"> <title>名前変換テスト1</title> </head> <body> <!-- ■ ■ ■ ↓ わからない人向け/ここからコピー(1) ↓ ■ ■ ■ --> <script language="JavaScript"> <!-- var fname; //今回覚えさせたい変換名を入れる変数のなまえ function GetCookie(name){ var result = null; var cookieName = name + '='; var allcookies = document.cookie; var position = allcookies.indexOf( cookieName ); if( position != -1 ){ var startIndex = position + cookieName.length; var endIndex = allcookies.indexOf( ';', startIndex ); if( endIndex == -1 ){ endIndex = allcookies.length; } result = decodeURIComponent( allcookies.substring( startIndex, endIndex ) ); } return result; } function DeleteCookie(){ document.cookie = 'firstName=;max-age=0'; location.reload(); } fname = GetCookie("firstName"); //fnameが空だったときダイアログを出す if(fname == null || fname == ""){ fname = prompt("名前を教えてくださいね"); if(fname == null || fname ==""){ fname = "花子"; } //Cookie書き込み var expires = new Date(); expires.setTime(expires.getTime() + (6 * 30 * 24 * 60 * 60 * 1000)); document.cookie = 'firstName='+fname+'; expires='+expires.toUTCString(); } // --> </script> <!-- ■ ■ ■ ↑ わからない人むけ/ここまでコピー(1) ↑ ■ ■ ■ --> なまえ:<span class="yourfirstname"></span> <a href="#" onClick="DeleteCookie()">【変更する】</a><br /> <br /> <br /> <br /> 「あなたの名前は<span class="yourfirstname"></span>さんですか?」<br /> 「はいそうです」<br /> <br /> ~ 完 ~<br /> <!-- ■ ■ ■ ↓ わからない人むけ/ここからコピー(2) ↓ ■ ■ ■ --> <script language="JavaScript"> <!-- var names = document.getElementsByClassName('yourfirstname'); for (i = 0; i < names.length; i++) { names[i].innerHTML = fname; } //--> </script> <!-- ■ ■ ■ ↑ わからない人むけ/ここまでコピー(2) ↑ ■ ■ ■ --> </body></html> 上記コードのサンプルが、下記URLの内容です。(スタイルとかは上のは省いてる) ほんとうに分からないひと向け HTML自体がわからないひとは…、勉強してくれ… 1:ここからコピー(1)と書いてあるのの中身を<body>のすぐ下に貼る 2:ここからコピー(2)と書いてあるのの中身を</body>のすぐ上に貼る 3:名前部分を<span class="yourfirstname"></span>に変換する ふたつ以上(苗字と名前とか)変換したいひとは、言ってください。 ちょっとなら分かるというひとは↓のおまけが参考になるかもしれない… やってること解説と言い訳(不親切) メインのJavascriptコードはbody内に書いたけど(最初に参考にしたDreamMakerさんのがそうだったので…)headの中でもいいのかもしれない(Javascriptに明るくないのでよくしらない) firstName, fname, yourfirstnameなど適当に変数とかの名前をつけたけど、どれとどれが同じかを差別化する目的であって深い意味はない function GetCookie() → クッキーの使用方法 | JavaScript プログラミング解説 さんの「指定クッキーの値の取得」を丸々コピーさせていただいた。ほしいcookieの変数名?を入れるとその値を返してくれる。今回はfirstNameという名前のCookieの変数をGetしたので、そこに入ってる名前を返してもらえることになった function DeleteCookie() → 呼び出すと、firstNameを消してCookieの有効期限を0にすることでクッキーを削除する その下では、初めて(というかCookieがまだない際)ファイルにアクセスしたときとかDeleteCookieの直後とか(とにかく名前がまだないとき)にifの中を通って、ダイアログを出してfnameの中に入力された名前を代入します。なんにも入力されないとデフォルトで「花子」が入ります。その下はそのまんまですがCookieを書き込む文です。 Webページとして表示される部分 → spanタグのclass名でyourfirstnameを指定すると、そこの中身が、今回はCookieが覚えている名前で置きかわる。【変更する】の部分は押すとDeleteCookie()が呼び出されます(現在の名前を消して新しく入力させる)。 body下部のJavascript → document.getElementsByClassName()とかいう便利な関数があったんやなあ…。詳しく調べてないけどそのファイル中にあるyourfirstnameという名前のクラスがついてるとこの何かをgetしてnamesに入れれるんでしょうね(てきとう)(ほぼこちら→ページ内の特定クラスに属する要素をJavaScriptで置き換える方法 | TechMemo さんのコピペ) その次でnames.lengthというかんじに総数を取得することができるようなので、yourfirstnameをいくつあるか取得してfor文でひとつずつfname(変換名)に置き換えているみたいです。 以上! おまけ:私のやりたかったイニシャルのやつ ローマ字で入力すると頭文字を取得するやつ(べつに日本語でも1文字目を取るんですけど…) 間違ってたらアレだからスタイルもそのまんま載せるぜ! 変数名がクソすぎですが… <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <meta http-equiv="content-style-type" content="text/css"> <META NAME="GOOGLEBOT" CONTENT="NOINDEX, NOFOLLOW"> <META NAME="ROBOTS" CONTENT="NOARCHIVE,NOINDEX,NOFOLLOW"> <title>名前変換テスト2</title> <style type="text/css"> <!-- body{ padding: 100px; font-family: 'MS UI GOTHIC'; letter-spacing: 3px; line-height: 150%; } br{ letter-spacing: normal; } --> </style> </head> <body> <script language="JavaScript"> <!-- var eigo; //今回覚えさせたい英語名を入れる変数のなまえ function GetCookie(name){ var result = null; var cookieName = name + '='; var allcookies = document.cookie; var position = allcookies.indexOf( cookieName ); if( position != -1 ){ var startIndex = position + cookieName.length; var endIndex = allcookies.indexOf( ';', startIndex ); if( endIndex == -1 ){ endIndex = allcookies.length; } result = decodeURIComponent( allcookies.substring( startIndex, endIndex ) ); } return result; } function DeleteCookie(){ document.cookie = 'eigoName=; max-age=0'; location.reload(); } eigo = GetCookie("eigoName"); //eigoが空だったときダイアログを出す if(eigo == null || eigo == ""){ eigo = prompt("おなまえをローマ字で"); if(eigo == null || eigo ==""){ eigo = "HANAKO"; } //Cookie書き込み var expires = new Date(); expires.setTime(expires.getTime() + (6 * 30 * 24 * 60 * 60 * 1000)); document.cookie = 'eigoName='+eigo+'; expires='+expires.toUTCString(); } // --> </script> <div style="width:750px; margin-left:auto; margin-right:auto;"><font size="3"> 英語名:<span class="english"></span> <a href="#" onClick="DeleteCookie()">【変更する】</a><br /> <br /> <br /> <br /> <span class="english"></span>さん<br /> イニシャルは <span class="inisyaru"></span><br /> <script language="JavaScript"> <!-- var name1 = document.getElementsByClassName("english"); var name2 = document.getElementsByClassName("inisyaru"); for (i = 0; i < name1.length; i++) { name1[i].innerHTML = eigo; } for (i = 0; i < name2.length; i++) { name2[i].innerHTML = eigo.slice(0, 1); } // --> </script> </font></div></body></html> おわりに 複数変換とかDreamMaker2?みたいなフォーム式とかもできると思いますが、 もしも万が一ご要望があったら考えますね。。 とりあえず今回はこれだけ。 参考 HTML要素の中身を変えるinnerHTML | JavaScript入門編 - ウェブプログラミングポータル クッキーの使用方法 | JavaScript プログラミング解説 ページ内の特定クラスに属する要素をJavaScriptで置き換える方法 | TechMemo
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

python で html img タグに base64 で画像を埋め込む

概要 png とか jpg 画像を読み取って、 base64 形式の img タグを吐き出す python コードスニペット。 (自分用メモ) コード def get_base64_image_tag(image_path, mime_type): with open(image_path, "rb") as f: src = base64.b64encode(f.read()).decode('utf-8') return f'''<img src="data:image/{mime_type};base64,{src}" />''' 使用例 画像名 画像 aaa.png bbb.jpg >>> tag = get_base64_image_tag("aaa.png", "png") >>> tag '<img src="data:image/png;base64,iVBORw0KG[...]kSuQmCC" />' >>> tag2 = get_base64_image_tag("bbb.jpg", "jpeg") >>> tag2 '<img src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQE[...]/r5f1uf/9k=" />' 参考 Data URI scheme (Wikipedia) base64 --- Base16, Base32, Base64, Base85 データの符号化
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録〜htmlの構造〜

この記事ではhtml.cssのプロゲートでの学習を自分の言葉で書き出しています。何か訂正や付け足しなどがございましたらご教授いただけると大変嬉しいです。 HTMLの全体構造 大きく分けてHTMLは3つのマトリョーシカがある 1.HTMLのマトリョーシカ qiita.html <html> htmlのコードを全てここに記入していく </html> 2.headとbodyのマトリョーシカ qiita.html <html> <head> htmlで使う部品を記入 </head> <body> htmlの見た目の構造を組み立てる部分 </body> </html> 3.bodyの中にdivで分けたマトリョーシカ 主にheader、main、footer qiita.html <html> <head> </head> <body> <div class="header"> </div> <div class="main"> </div> <div class="footer"> </div> </body> </html> あとはdiv中で分けたマトリョーシカの中に同じくdivで分けるなどしてデザインを作っていく
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

押したボタンを見分ける Google Apps Script 備忘録

目的は FORM の SUBMIT ボタンを色々置きたい時の方法です. Google Apps Scriptでの利用を説明します. そもそももっと優れたやり方があるのかもしれません, セキュリティとかはなんとも言えません. それでも,ボタンを並べたいときもあります,タブン 画面の具合とHTML側コード 入力フォームはこんなかんじです. FORM部分のみ <form method="post" action="https://script.google.com/macros/s/~~yourAddress~~/dev"> <br> in1 &nbsp&nbsp&nbsp <input type="text" name="inDat" value="<?=Dat0?>"></input><br> in2 &nbsp&nbsp&nbsp <input type="text" name="inDat" value="<?=Dat1?>"></input><br> key &nbsp&nbsp <input type="text" name="inDat"></input><br> name <input type="text" name="inDat"></input><br> code &nbsp <input type="text" name="inDat"></input><br> date &nbsp <input type="text" name="inDat"></input><br> <br> <input type="submit" name="sub1" value="INPUT1" ></input><br> <input type="submit" name="sub2" value="INPUT2" ></input><br> <input type="submit" name="sub3" value="INPUT3" ></input><br> <br><br> <input type="submit" name="subb" value="SET1" ></input><br> <input type="submit" name="subb" value="SET2" ></input><br> <input type="submit" name="subb" value="SET3" ></input><br> <br><br> <input type="button" onclick="inc()" value="INC"></input><br> <br> <input type="button" onclick="dec()" value="DEC"></input><br> <br> </form> submitに nameとvalueを決めています. INPUT1~3は nameがそれぞれ sub1, sub2, sub3 でvalueも INPUT1,2,3と分けました. SET1~3は nameはsubbで同じ, valueが SET1,2,3としてあります. 入力部分のデータをPOSTで送って,一応 SpreadSheet に書き込むようにしてます. GAS側 class sstest{ //入力フォームのデータをやりくりするクラス constructor(key, name, code, date){ this.key = key; this.name = name; this.code = code; this.date = date; } isEmpty(){ if(this.key.length = 0){ return 1; } return 0; } //まだ使っていないがhtmlオブジェクトに値を返すために用意 setElem( html ){ html.key = this.key; html.name = this.name; html.code = this.code; html.date = this.date; return html; } //押したボタンに応じて以下のいずれかの文字列を追加をする. arrange1(){ this.name = this.name + "(20)"; } arrange2(){ this.name = this.name + "(30)"; } arrange3(){ this.name = this.name + "(無職)"; } nop(){ this.name = this.name } } 大事なdoPOST function doPost(e){ var in1 = e.parameters.inDat[0].toString(); var in2 = e.parameters.inDat[1].toString(); //全部表示 console.log(e); //inDatが取れているか console.log("myTest-",in1, in2); //入力ページへの返却 var html = HtmlService.createTemplateFromFile("index"); html.Dat0 = in1; html.Dat1 = in2; //sstestを作成 var inst = new sstest( e.parameters.inDat[2], e.parameters.inDat[3], e.parameters.inDat[4], e.parameters.inDat[5]); console.log(inst); //INPUTボタン側の操作 if(e.parameters.sub1!=null){ inst.arrange1(); } if(e.parameters.sub2!=null){ inst.arrange2(); } if(e.parameters.sub3!=null){ inst.arrange3(); } //SETボタン側の操作 if(e.parameters.subb == "SET1"){ inst.arrange1(); }else if(e.parameters.subb == "SET2"){ inst.arrange2(); }else if(e.parameters.subb == "SET3"){ inst.arrange3(); }else{ inst.nop(); } //SpreadSheet var ss = openSS(); ss.appendRow([inst.key, inst.name, inst.code, inst.date]); return html.evaluate(); } その他コード function openSS() { const SHEET_ID = "~~yourSheetID~~"; var spreadSheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName("Sheet1"); return spreadSheet; } function doGet(){ var html = HtmlService.createTemplateFromFile("index"); //とりあえずデフォルトをいれてみる html.Dat0 = "111"; html.Dat1 = "222"; return html.evaluate(); } 実行結果(INPUT1~3ボタン) INPUTボタンのほうでそれぞれ実行してみたところ, ちゃんと名前は編集されてはいりましたね. 実行ログより, INPUT1を押したとき--- parameters: { inDat: [ '111', '222', 'S1234', 'さとう', 'SIO', '6/7' ], sub1: [ 'INPUT1' ] },~ INPUT2を押したとき--- parameters: { inDat: [ '111', '222', 'S321', 'さとう', '塩', '6/7' ], sub2: [ 'INPUT2' ] }, INPUT3を押したとき--- parameters: { sub3: [ 'INPUT3' ], inDat: [ '111', '222', 'S54123', 'さとう', '塩', 'KOSYO' ] } //INPUTボタン側の操作 if(e.parameters.sub1!=null){ inst.arrange1(); } if(e.parameters.sub2!=null){ inst.arrange2(); } if(e.parameters.sub3!=null){ inst.arrange3(); } e.parameters.にそれぞれsub1~3が入っているかどうかでどのarrangeを実行するかを切り替え. なんとも乱暴な方法にも思える. 本当はtryに入れた方がいいような気もしますが,これでもできますね. 実行結果(SET1~3ボタン) 続けてSET1~3でも実行してみた結果. こちらもログから, SET1を押したとき--- parameters: { inDat: [ '111', '222', '1212', 'しお', '胡椒', '6/7' ], subb: [ 'SET1' ] } } SET2を押したとき--- parameters: { inDat: [ '111', '222', '4321', '塩', '胡椒', '6/7' ], subb: [ 'SET2' ] }, SET3を押したとき--- parameters: { inDat: [ '111', '222', '4649', '塩', 'ごま', '6/7' ], subb: [ 'SET3' ] }, こちらのやり方だとすべてのボタンで name="subb"になっているので, どのPOSTにも subb が入ってきます ただし,その中身が異なる. //SETボタン側の操作 if(e.parameters.subb == "SET1"){ inst.arrange1(); }else if(e.parameters.subb == "SET2"){ inst.arrange2(); }else if(e.parameters.subb == "SET3"){ inst.arrange3(); }else{ inst.nop(); } e.parameters.subb を if に入れているので多少煩雑ですが, ちゃんと取り出して使うならこっちのほうがスッキリするようにも思います. まとめ やりました! いっぱいボタン置いてもどれを押したのかわかりました! INPUT3もしくはSET3を押せば無職になれる('ω')ノ ずばりこの方法について書いてある記事が見当たらなかったので書いてみましたが, じつは禁忌を犯していたりするのだろうか,という不安. 次は HTML側に値を渡したり <?=VARNAME?> で表示したりという部分と クラスで躓いた部分を書いておこうと思います.
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む