「Possible strict violation」について

勤怠のサンプルアプリ

を自社向けに編集して利用させていただこうとしています。恐縮ですが初心者です。

現状、打刻のボタンが押せる状態で表示されません。

89行目、90行目の this に対して「Possible strict violation」のアラートが出ていることが要因と思いまして、質問させてください。

アラートを解消する方法をご教示お願いいたしたく、宜しくお願い申し上げます。

▼利用したソースコード

/*
* 勤怠管理 タイムカード
* Copyright (c) 2014 Cybozu
*
* Licensed under the MIT License
*/
(function() {
// 定数、変数定義、関数定義
‘use strict’;

// サーバーの時間を取得する
function getUTCDateByServer() {
var r;
return (r = new XMLHttpRequest())
? (r.open(‘HEAD’, ‘#’, false), r.send(null), new Date(r.getResponseHeader(‘Date’))) : null;
}

// 指定された文字の指定された長さのゼロサプレスを取得する
function zero_suppress(s, len) {
var str = ‘’;
for (var i = 0; i < len; i += 1) {
str += ‘0’;
}
str += s;
return str.substr(str.length - len, len);
}

// 時計に表示する関数
function set_digitTime() {
var dt = new Date(getUTCDateByServer());
var yyyy, MM, dd, hh, mm, ss;
var DAY = [‘SUN’, ‘MON’, ‘TUE’, ‘WED’, ‘THU’, ‘FRI’, ‘SAT’];
yyyy = dt.getFullYear();
MM = zero_suppress(dt.getMonth() + 1, 2);
dd = zero_suppress(dt.getDate(), 2);
hh = zero_suppress(dt.getHours(), 2);
mm = zero_suppress(dt.getMinutes(), 2);
ss = zero_suppress(dt.getSeconds(), 2);

$(‘#year’)[0].innerHTML = yyyy;
$(‘#date’)[0].innerHTML = MM + ‘/’ + dd + ’ ’ + DAY[dt.getDay()];
$(‘#time’)[0].innerHTML = hh + ‘:’ + mm + ‘:’ + ss;
}

// イベントハンドラ実行
var events = [‘app.record.index.show’];
kintone.events.on(events, function(event) {
if (event.viewId !== 6425114) {
return;
}
// タイムカード
// アカウント=ログインユーザー、日付=今日 のレコードをすべて取得
var appId = kintone.app.getId();
var user = kintone.getLoginUser();
var qryInfo = ‘アカウント名 = "’ + user.code + ‘" and 日付 = TODAY() order by 出勤 desc limit 1’;
var params = {
app: appId,
query: qryInfo,
fields: [
‘社員番号’,
‘アカウント名’,
‘日付’,
‘始業時刻’,
‘終業時刻’,
]
};
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params, function(resp) {

// resp[‘records’] の長さが 0 or 1以上の場合で状態を変える
// 今日の レコード数 = 0
if (resp.records.length === 0) {
$(‘#syukkin’).replaceWith(“<input id=‘syukkin’ type=‘button’ value=‘出勤’>”);
$(‘#syukkin’).on(‘click’, clickFunction);
} else if (resp.records.length === 1) {
// 今日の レコード数 >= 1
if (resp.records[0][‘退勤’].value === null) {
$(‘#taikin’).replaceWith(“<input id=‘taikin’ type=‘button’ value=‘退勤’>”);
$(‘#taikin’).on(‘click’, clickFunction);
} else {
$(‘#syukkin’).replaceWith(“<input id=‘syukkin’ type=‘button’ value=‘出勤’>”);
$(‘#syukkin’).on(‘click’, clickFunction);
}
}

});

// クリック関数
function clickFunction() {
var status = $(this).val(); ←私が懸念点として挙げているthisです
var id = $(this).attr(‘id’); ←私が懸念点として挙げているthisです
switch (id) {
case ‘syukkin’: syukkin_func(); break;
case ‘taikin’: taikin_func(); break;
}
}

// 出勤関数
function syukkin_func() {
// ルックアップ先のID取得、従業員情報の取得
var applookId = kintone.app.getLookupTargetAppId(‘社員番号’);
var qryInfo = ‘アカウント名= "’ + user.code + ‘" order by レコード番号 desc limit 1’;
var params = {
app: applookId,
query: qryInfo,
fields: [
‘社員番号’,
‘氏名’,
‘アカウント名’
]
};
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params, function(resp) {
// 従業員情報の取得
var employeeNo = resp.records[0][‘社員番号’].value;
var employeeName = resp.records[0][‘氏名’].value;
var employeeAccount = resp.records[0][‘アカウント名’].value;
// 日時取得
var dt = new Date(getUTCDateByServer());
var yyyy = dt.getFullYear();
var MM = zero_suppress(dt.getMonth() + 1, 2);
var dd = zero_suppress(dt.getDate(), 2);
var hh = zero_suppress(dt.getHours(), 2);
var mm = zero_suppress(dt.getMinutes(), 2);
var syukkin_date = yyyy + ‘-’ + MM + ‘-’ + dd;
var syukkin_time = hh + ‘:’ + mm;

var body = {
app: appId,
record: {
‘社員番号’: {
value: employeeNo
},
‘氏名’: {
value: employeeName
},
‘アカウント名’: {
value: employeeAccount
},
‘日付’: {
value: syukkin_date
},
‘始業時刻’: {
value: syukkin_time
}
}
};
// 出退勤アプリに record 登録
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘POST’, body).then(location.reload());
});
}

// 退勤関数
function taikin_func() {
// レコード取得
var appId = kintone.app.getId();
var qryInfo = ‘アカウント名 = "’ + user.code + ‘" order by レコード番号 desc limit 1’;
var params = {
app: appId,
query: qryInfo,
fields: [
‘レコード番号’,
‘日付’,
‘始業時刻’,
]
};

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, params, function(resp) {
// 従業員情報の取得
var employeeRecId = resp.records[0][‘レコード番号’].value;
var syukkin_day = resp.records[0][‘日付’].value;
var syukkin_time = resp.records[0][‘始業時刻’].value;
// 日時取得
var dt = new Date(getUTCDateByServer());
var yyyy = dt.getFullYear();
var MM = zero_suppress(dt.getMonth() + 1, 2);
var dd = zero_suppress(dt.getDate(), 2);
var hh = zero_suppress(dt.getHours(), 2);
var mm = zero_suppress(dt.getMinutes(), 2);
var taikin_time = hh + ‘:’ + mm;

var syukkin_daytime = syukkin_day + ‘T’ + syukkin_time + ‘:00+09:00’;
var taikin_daytime = yyyy + ‘-’ + MM + ‘-’ + dd + ‘T’ + taikin_time + ‘:00+09:00’;
var ST = new Date(syukkin_daytime);
var TT = new Date(taikin_daytime);

var body = {
app: appId,
id: employeeRecId,
record: {
‘終業時刻’: {
value: taikin_time
}
}
};

// レコード更新へ
console.log(‘始業時刻’ + syukkin_time);
console.log(‘終業時刻’ + taikin_time);
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’, body).then(location.reload());
});
}

// 1000ミリ秒ごとにset_digitTime()を繰り返す
set_digitTime();
setInterval(set_digitTime, 1000);
});

})();

pb さん こんにちは

打刻のボタンが押せる状態で表示されないとのことですが、「PC 用の JavaScript ファイル」にCybozu CDNのjQueryは設定済みでしょうか?

junkさん ありがとうございます。

下記2つを設定済ですが、ボタンが押せない状態です。

アラートが表示されるのがクリック関数の箇所に記載されている「this」に関係しているようで、

(※検索して調べました)質問に至りました次第です。

pb さん

ありがとうございます。了解致しました。

確認のため、カスタマイズビューのIDとHTMLを記載していただけないでしょうか?

junkさん ありがとうございます。

カスタマイズビューのIDは 6425114 です。

すみません、HTMLは当該のカスタマイズビューをブラウザで閲覧した状態でのソース、

という理解でよろしいでしょうか。

junkさん

ちなみに、jQueryを最新販へ更新してみましたが、変化ありませんでした。

pb  さん

HTMLはカスタマイズビュー作成時に書いた内容(画像の赤枠のコード)を記載していただきたいです。

よろしくお願い致します。

junkさん

>HTMLはカスタマイズビュー作成時に書いた内容(画像の赤枠のコード)を記載していただきたいです。

ですよね。

最初の投稿に記載したものになります。

利用したソースという表記が紛らわしかったですね。失礼しました。

利用したソースでもあるのですが現状のHTMLでもあります。

お手数をおかけいたします。どうぞ宜しくお願いいたします。

pb さん

最初に投降したソースコードはJavaScriptです。HTMLに記載する内容は別のものになります。

参考にしたサイトの 

\<title\>サンプル\</title\>  
\<meta charset='utf-8' /\>

などが書かれている部分が赤枠に記載するコード(HTML)です。

junkさん

大変失礼しました。素人どころではないド素人感を出してしまいました。

自分がJavaScriptにばかり頭がもっていかれていて本当に申し訳ございません。

こちらです↓

 

<!–
* 勤怠管理 タイムカード
* Copyright (c) 2014 Cybozu
*
* Licensed under the MIT License
–>
<title>サンプル</title>
<meta charset=‘utf-8’ />

<style type=“text/css”>
body, ul, li {margin:0; padding:0; list-style:none;}
/* 日時表示 */
div.date-time {
height:50px;
padding:10px;
background:#44810F;
border-bottom:1px solid #fff;
color:#fff;
}
.year {width:150px; text-align:center; virtical-align:bottom; }
.date {width:150px; text-align:center;}
.time {font-size:200%;}
/* ボタン */
div.buttons {
/*color:#fff;*/
height:170px;
padding-top:30px;
background:#77C434;
}
.buttons li {
float:left;
width:120px;
text-align:center;
}
.buttons li span{
display:block;
background:#3BB111;
margin:auto;
font-size:150%;
color:#ffffff;
opacity:0.3;
width:100px;
height:50px;
line-height:50px;
border:1px solid #BDE7A2;
border-radius:7px;
box-shadow:1px 1px 4px 0 #4CAA2A, 0px 1px 1px 0 #91D877 inset;
}
.buttons li input{
display:block;
background:#3BB111;
margin:auto;
font-size:150%;
color:#ffffff;
opacity:1.0;
width:100px;
height:50px;
line-height:50px;
border:1px solid #BDE7A2;
border-radius:7px;
box-shadow:1px 1px 4px 0 #4CAA2A, 0px 1px 1px 0 #91D877 inset;
}
</style>

<div class=‘date-time’>
<table>
<tr>
<td class=‘year’ id=‘year’>2014</td>
<td rowspan=‘2’ class=‘time’ id=‘time’>16:42:03</td>
</tr>
<tr>
<td class=‘date’ id=‘date’>4/15 Tue</td>
</tr>
</table>
</div>
<div class=‘buttons’>
<ul>
<li><span id=‘syukkin’>出勤</span></li>
<li><span id=‘taikin’>退勤</span></li>
</ul>
</div>

pbさん ありがとうございます。

恐らく、JavaScriptの

var qryInfo = 'アカウント名 = "' + user.code + '" and 日付 = TODAY() order by 出勤 desc limit 1';

が間違えています。正しくは

var qryInfo = 'アカウント名 = "' + user.code + '" and 日付 = TODAY() order by 始業時刻 desc limit 1';

ではないでしょうか。

また、

if (resp.records[0]['退勤'].value === null) {
  // 省略
}

if (resp.records[0]['終業時刻'].value === null) {
  // 省略
}

ではないでしょうか。

 

junkさん

ありがとうございます。ご指摘いただいた箇所を修正しましたら出勤ボタンが押せる状態になりました。