ラベル JavaScript の投稿を表示しています。 すべての投稿を表示
ラベル JavaScript の投稿を表示しています。 すべての投稿を表示

2024年12月12日木曜日

JavaScriptのクロージャーによるカウンタ作成基礎

JavaScriptのクロージャーによるカウンタ作成基礎

function counter() {
    let num = 0;
    return add_one; //関数を返す ()を付けない

    function add_one() {
        return num++; //後置インクリメントで0始まりにする(まずnを返してからn+1を実行)
    }
}

const counter1 = counter();

console.log(counter1()); //結果 0
console.log(counter1()); //結果 1
console.log(counter1()); //結果 2
console.log(counter1()); //結果 3

ポイント:

  • add_one()の中から外側の let num を増加させること
  • return add_one;  のように関数を返すこと(add_one()ではない)
  • n++で0始まりにすること

2024年11月29日金曜日

jQueryでscrollTop, scrollHeight, clientHeightを求める方法

 

scrollTop, scrollHeight, clientHeightをjQueryで求める方法です。

$(document).ready(function() {

    let element = $('#myDiv'); // 対象の要素


    let scrollTop = element.scrollTop();

    let scrollHeight = element[0].scrollHeight;

    let clientHeight = element[0].clientHeight;


    console.log('Scroll Top:', scrollTop);

    console.log('Scroll Height:', scrollHeight);

    console.log('Client Height:', clientHeight);

});


2023年7月27日木曜日

JavaScript: ブラウザ戻るボタンでページ表示されたときのイベント検知

フォームなどでブラウザの戻るボタンで戻ってきたときに、ブラウザのキャッシュにより以前の情報が表示されて困る場合があります。 検索すると、以下のようにすれば良しとあるのですが、どうもこの event.persisted が動作しません。(いつも false)
// 強制リロード
window.addEventListener('pageshow', function (event) {
  if (event.persisted) {
    // bfcache発動時の処理
    window.location.reload();
  }
});
その他、探したところ window.performance.navigation.type というものがあり、これを使うと意図通り動作しました。
window.addEventListener('pageshow', function(event) {
  let flg=window.performance.navigation.type;
  //flg=0が始めてきたとき、flg=1がリロードしたとき、flg=2がブラウザバックで戻ってきたとき
  if (flg == 2) {
      window.location.reload();
    }
});


参考: ブラウザバック を検知したい
https://teratail.com/questions/312782

2023年7月21日金曜日

JavaScript: Cookie値取得関数を作ったときつまずいた3点

問題点1: Cookieをsplit()で配列にするとCookie名で値の取得ができなくなる。

解決方法: Cookieを取得して、";" でsplitではなく、"; " (半角スペース付)でsplitする。
let cookie_arry = document.cookie.split('; ');

参考【JavaScript】Cookieをsplit()で配列にするとCookie名で値の取得ができなくなるhttps://into-the-program.com/javascript-cant-get-value-cookie-name-array/


問題点2: forEachの仕様上、以下のように forEach内でreturnができない。
function getCookieValue(cookie_name) {
  let cookie_arry = document.cookie.split('; ');
cookie_arry.forEach(function(value) {
var content = value.split('='); if (content[0] == cookie_name){ return content[1]; //ここで終了せず、配列最後まで繰り返してしまう。 } }) }

解決方法: ふつうにforを使う。
function getCookieValue(cookie_name) {
  let cookie_arry = document.cookie.split('; ');
for (let value of cookie_arry) {
content = value.split('='); if (content[0] == cookie_name){ return content[1]; } } }

JavaScriptのArray.forEachをbreak、continue、returnさせたい
https://www.deep-rain.com/programming/javascript/778


問題点3: なぜか値を取得できないCookieが一部ある。
解決方法: HttpOnly属性のCookieはJavaScriptで取得できないので無理。

特にログインが必要なサイトで、ログイン後に生成される sessionid等のCookieが undefinedになってしまう。
getCookieValue('sessionid'); //⇒ undefined
これらのCookieをブラウザのデベロッパーツールで確認すると、HttpOnlyが有効になっている。
HttpOnly属性とは、クライアント側でJavaScriptなどからアクセスできないようにするもので、クロスサイトスクリプティング(XSS)攻撃などでCookieの内容を読み取られるのを阻止することができる。そのため、セッションIDなどはHttpOnlyが有効になっている場合が多い。

2023年7月20日木曜日

Tabulatorで他のフィールドを参照して書き換える

Tabulatorで他のフィールド(セル)を参照して書き換える方法です。

formatterに getValue(), getData() を使用して関数を定義します。

cell.getValue() でフィールド自身の値を取得できます。
cell.getData() でフィールドを含む行のデータを取得できます。
cell.getData().[他のフィールド名] で他のフィールドの値を取得できます。


    let table = new Tabulator('#example-table', {
      ajaxURL: './item.json',
      layout:"fitColumns", //fit columns to width of table (optional)
      columns: [
        {
          title: '名称',
          field: 'name',
          formatter: function(cell){
            let name = cell.getValue();
            let pdf_url = cell.getData().pdf_url;
            if (pdf_url) {
              return `<a href="${pdf_url}" target="_blank">${name}</a>`;
            } else {
              return name;
            }
          }
        },
        { title: 'PDF', field: 'pdf_url', visible: false },
・・・・・ ・・・・・


2022年12月28日水曜日

JavaScript/Python: 配列要素の追加と取り出し

 Arry = [0,1,2,3,4,5,6,7,8,9]


JavaScript

先頭要素を取り出す Arry.shift();

末尾要素を取り出す Arry.pop();

先頭に0を追加 Arry.unshift(0);

末尾に9を追加 Arry.push(8);


Python

先頭要素を取り出す Arry.pop(0)

末尾要素を取り出す Arry.pop(-1)

先頭に0を追加 Arry.insert(0, 0) #insert(位置, 値)

末尾に9を追加 Arry.append(8)



2022年10月7日金曜日

JavaScript: URLパラメータを連想配列にする

JavaScriptでURLパラメータを連想配列にするには、以下のようにするのが簡潔です。

var urlSearchParams = new URLSearchParams(window.location.search);
var params = Object.fromEntries(urlSearchParams.entries());


URLパラメータ: ?name=ABC&company=XYZ&address=Tokyo

⇒連想配列: {"name": "ABC", "company": "XYZ", "address": "Tokyo"}


参考: How can I get query string values in JavaScript?
https://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript

2022年6月17日金曜日

JavaScript: ファイルフィールド (input type=file) からファイル名を取得する

ファイルフィールド (input type=file) からファイル名を取得するには

jQueryの場合

$('.class_name').prop('files')[0].name


2021年8月3日火曜日

JavaScript/jQuery 文字列置換 replaceの前方参照でハマったところ

以下のような文字列から先頭のアルファベット(文字数任意)だけ削除したいとします。

var STR1 = "ABCDEFG123456"; //⇒123456にしたい

var STR2 = "OPQRS78901"; //⇒78901にしたい


ダメだった式
STR1.replace(/[A-Z]+(.+?)/g, $1);
STR2.replace(/[A-Z]+(.+?)/g, $1);

OKだった式
STR1.replace(/[A-Z]+(.+?)/g, "$1");
STR2.replace(/[A-Z]+(.+?)/g, "$1");

$1をクオーテーションマーク " で囲まないといけなかった。


2015年4月15日水曜日

JavaScript 即時関数の作り方



//即時関数の構文

(function () {

    //関数の中身・・・

}());


//引数を渡す

(function (para1, para2, ...) {

    //関数の中身・・・

}('abcd', 31, ...));


参考
http://analogic.jp/immediate-function/



2015年1月22日木曜日

JavaScriptでゼロ埋めする

JavaScriptでゼロ埋めする方法 | You Look Too Cool



「ゼロ埋め」 あるいは 「ゼロパディング」の方法
1 → 001
2 → 002
・・・

var a=5;
alert(("0"+a).slice(-2));

「"0"+a」の部分で元の数値の左に「0」を付けます。「5」ならば「05」となります。
「slice(-2)」で右から2文字を切り出します。「05」となります。
「25」ならば「025」の右から2文字を切り出すので「25」となります。
3桁ならば「("00"+a).slice(-3)」とすればよいです。

読み込むjsファイルを振り分けたいとき

読み込むjsファイルを振り分けたいとき、以下のように記述します。


var s = document.createElement("script");

s.type = "text/javascript";

s.src = "custom1.js";    //ここを条件式によって振り分ける

document.getElementsByTagName("head")[0].appendChild(s);


※上記により<head>内最後尾に以下が追加されることになります。
<script type="text/javascript" src="custom1.js"></script>



参考:

読込むjavascriptファイルをユーザーエージェントによって振り分け切替える - Qiita


条件分岐に特化したリソースローダー「yepnope.js」を試してみる

2015年1月13日火曜日

ページの初期描画を高速化させる、yepnope.jsの使い方

ページの初期描画を高速化させる、yepnope.jsの使い方 - ふろしき.js



ページの初期描画を高速化させる、yepnope.jsの使い方 - ふろしき.js
yepnope.jsは、JavaScriptファイルやCSSファイルを遅延して読み込んだり、条件によって読み込む対象ファイルをスイッチさせることで、ページ応答やパフォーマンスを改善するJSライブラリです。yepnop . . .

2014年11月26日水曜日

JavaScript 連想配列のキーを取得するには

JavaScript 連想配列のキーを取得する方法

var sampleArray = { "First":"0001", "Second":"0002", "Third":"0003" };
for (var key in sampleArray) {
  alert(key +" : "+ sampleArray[key] );
}


出力結果

First : 0001

Second : 0002

Third : 0003

2014年11月19日水曜日

JavaScript 文字数カウント関数 全角半角考慮

http://blog.tofu-kun.org/070627210315.php


  function strLength(strSrc) { //文字数カウント関数(半角:0.5字、全角:1字)
    len = 0;
    strSrc = escape(strSrc);
    for (i = 0; i < strSrc.length; i++, len++) {
      if (strSrc.charAt(i) == "%") {
        if (strSrc.charAt(++i) == "u") {
          i += 3;
          len++;
        }
        i++;
      }
    }
    //len = Math.ceil(len.toString() / 2);
    len = len.toString() / 2;
    return len;
  }