モバイル版の一覧表の検索窓設置

パソコン版のコードをモバイル版に修正してモバイル版kintoneの一覧表に検索窓を設置しました。
検索機能は問題ないのですが、並び替え等、一覧表を再表示する(mobile.app.record.index.showイベントが実施される)度に、
検索窓と検索ボタンが増えていってしまいます。

パソコン版では、kintone.app.getHeaderMenuSpaceElement()をつかって、検索窓や検索ボタンを一旦削除し、再作成する以下のコードをいれているのですが、

var node_space = kintone.app.getHeaderMenuSpaceElement()
for (var i =node_space.childNodes.length-1; i>=0; i–) {
node_space.removeChild(node_space.childNodes[i]);
}
var label = document.createElement(‘label’);
label.appendChild(document.createTextNode(’ ‘));
label.appendChild(document.createTextNode(‘カナ氏名検索’));
label.appendChild(document.createTextNode(’ ‘));
label.appendChild(SW_カナ氏名);
label.appendChild(document.createTextNode(’ ‘));
label.appendChild(search_button);
label.appendChild(document.createTextNode(’ '));
kintone.app.getHeaderMenuSpaceElement().appendChild(label);

どうやらモバイル版では
kintone.mobile.app.getHeaderMenuSpaceElement()が無いようです。

mobile.app.record.index.showで再表示した場合でも、検索窓と検索ボタンが増えていかないようにするにはどうすればよいでしょうか?

コードは以下のようになっています。調べながら作った初めてのコードなので、無駄な部分とかもあるかもしれません。よろしくお願いいたします。

(function () {
‘use strict’;

// 検索対象フィールドの名前
const FC_カナ氏名 = ‘検索用カナ氏名’;

// KanaHenkan関数の定義
function KanaHenkan(str) {
var kanaMap = {
“が”: “ガ”, “ぎ”: “ギ”, “ぐ”: “グ”, “げ”: “ゲ”, “ご”: “ゴ”,
“ざ”: “ザ”, “じ”: “ジ”, “ず”: “ズ”, “ぜ”: “ゼ”, “ぞ”: “ゾ”,
“だ”: “ダ”, “ぢ”: “ヂ”, “づ”: “ヅ”, “で”: “デ”, “ど”: “ド”,
“ば”: “バ”, “び”: “ビ”, “ぶ”: “ブ”, “べ”: “ベ”, “ぼ”: “ボ”,
“ぱ”: “パ”, “ぴ”: “ピ”, “ぷ”: “プ”, “ぺ”: “ペ”, “ぽ”: “ポ”,
“ヴ”: “ヴ”, “ヷ”: “ヷ”, “ヺ”: “ヺ”,
“あ”: “ア”, “い”: “イ”, “う”: “ウ”, “え”: “エ”, “お”: “オ”,
“か”: “カ”, “き”: “キ”, “く”: “ク”, “け”: “ケ”, “こ”: “コ”,
“さ”: “サ”, “し”: “シ”, “す”: “ス”, “せ”: “セ”, “そ”: “ソ”,
“た”: “タ”, “ち”: “チ”, “つ”: “ツ”, “て”: “テ”, “と”: “ト”,
“な”: “ナ”, “に”: “ニ”, “ぬ”: “ヌ”, “ね”: “ネ”, “の”: “ノ”,
“は”: “ハ”, “ひ”: “ヒ”, “ふ”: “フ”, “へ”: “ヘ”, “ほ”: “ホ”,
“ま”: “マ”, “み”: “ミ”, “む”: “ム”, “め”: “メ”, “も”: “モ”,
“や”: “ヤ”, “ゆ”: “ユ”, “よ”: “ヨ”,
“ら”: “ラ”, “り”: “リ”, “る”: “ル”, “れ”: “レ”, “ろ”: “ロ”,
“わ”: “ワ”, “を”: “ヲ”, “ん”: “ン”,
“ぁ”: “ア”, “ぃ”: “イ”, “ぅ”: “ウ”, “ぇ”: “エ”, “ぉ”: “オ”,
“っ”: “ツ”, “ゃ”: “ヤ”, “ゅ”: “ユ”, “ょ”: “ヨ”,
“ガ”: “ガ”, “ギ”: “ギ”, “グ”: “グ”, “ゲ”: “ゲ”, “ゴ”: “ゴ”,
“ザ”: “ザ”, “ジ”: “ジ”, “ズ”: “ズ”, “ゼ”: “ゼ”, “ゾ”: “ゾ”,
“ダ”: “ダ”, “ヂ”: “ヂ”, “ヅ”: “ヅ”, “デ”: “デ”, “ド”: “ド”,
“バ”: “バ”, “ビ”: “ビ”, “ブ”: “ブ”, “ベ”: “ベ”, “ボ”: “ボ”,
“パ”: “パ”, “ピ”: “ピ”, “プ”: “プ”, “ペ”: “ペ”, “ポ”: “ポ”,
“ヴ”: “ヴ”, “ヷ”: “ヷ”, “ヺ”: “ヺ”,
“ア”: “ア”, “イ”: “イ”, “ウ”: “ウ”, “エ”: “エ”, “オ”: “オ”,
“カ”: “カ”, “キ”: “キ”, “ク”: “ク”, “ケ”: “ケ”, “コ”: “コ”,
“サ”: “サ”, “シ”: “シ”, “ス”: “ス”, “セ”: “セ”, “ソ”: “ソ”,
“タ”: “タ”, “チ”: “チ”, “ツ”: “ツ”, “テ”: “テ”, “ト”: “ト”,
“ナ”: “ナ”, “ニ”: “ニ”, “ヌ”: “ヌ”, “ネ”: “ネ”, “ノ”: “ノ”,
“ハ”: “ハ”, “ヒ”: “ヒ”, “フ”: “フ”, “ヘ”: “ヘ”, “ホ”: “ホ”,
“マ”: “マ”, “ミ”: “ミ”, “ム”: “ム”, “メ”: “メ”, “モ”: “モ”,
“ヤ”: “ヤ”, “ユ”: “ユ”, “ヨ”: “ヨ”,
“ラ”: “ラ”, “リ”: “リ”, “ル”: “ル”, “レ”: “レ”, “ロ”: “ロ”,
“ワ”: “ワ”, “ヲ”: “ヲ”, “ン”: “ン”,
“ァ”: “ア”, “ィ”: “イ”, “ゥ”: “ウ”, “ェ”: “エ”, “ォ”: “オ”,
“ッ”: “ツ”, “ャ”: “ヤ”, “ュ”: “ユ”, “ョ”: “ヨ”,
“。”: “”, “、”: “”, “ー”: “”, “「”: “”, “」”: “”, “・”: “”,
" ": “”,
‘ァ’: ‘ア’, ‘ィ’: ‘イ’, ‘ゥ’: ‘ウ’, ‘ェ’: ‘エ’, ‘ォ’: ‘オ’,
‘ッ’: ‘ツ’, ‘ャ’: ‘ヤ’, ‘ュ’: ‘ユ’, ‘ョ’: ‘ヨ’,
‘。’: ‘’, ‘「’: ‘’, ‘」’: ‘’, ‘、’: ‘’, ‘・’: ‘’, ‘ー’: ‘’,
’ ': ‘’, ’ ': ‘’ // 全角カナを半角カナにし、小さな文字も大きな文字に変換し、不要なものを削除
};

var reg = new RegExp('(' + Object.keys(kanaMap).join('|') + ')', 'g');
return str.replace(reg, (match) => kanaMap[match]); }

// レコード一覧表示のイベントハンドラー
kintone.events.on(“mobile.app.record.index.show”, function (event) {
// GET引数に格納された直前の検索キーワードを取得して再表示
var result = {};
var query = window.location.search.substring(7);

if (query) {
  var element = query.split(' like ');
  if (element.length === 2) {
    var param_field_code = decodeURIComponent(element[0].trim());
    var param_search_word = decodeURIComponent(element[1].trim().replace(/["]/g, ""));
    result[param_field_code] = param_search_word;
  }
}

// 検索キーワードの入力フィールドとボタンの作成
var searchContainer = document.createElement('div');
var SW_カナ氏名 = document.createElement('input');
SW_カナ氏名.type = 'text';
SW_カナ氏名.placeholder = 'カナ氏名を入力';

var search_button = document.createElement('input');
search_button.type = 'submit';
search_button.value = '検索';

// 既にURLにクエリが含まれている場合、その値を入力ボックスに再表示
if (result[FC_カナ氏名]) {
  SW_カナ氏名.value = decodeURIComponent(result[FC_カナ氏名]);
}

searchContainer.appendChild(SW_カナ氏名);
searchContainer.appendChild(search_button);
kintone.mobile.app.getHeaderSpaceElement().appendChild(searchContainer);

// 検索を実行する関数
function keyword_search() {
  var keyword = SW_カナ氏名.value;
  var convertedKeyword = KanaHenkan(keyword);
  var str_query = '?query=' + FC_カナ氏名 + ' like "' + convertedKeyword + '"';

  if (keyword === "") {
    str_query = "";
  }

  // 検索結果のURLへ
  document.location = location.origin + location.pathname + str_query;
}

// 検索ボタンのクリックイベント
search_button.onclick = function () {
  keyword_search();
};

// Enterキーが押された時のイベント
SW_カナ氏名.onkeypress = function (event) {
  if (event.key === 'Enter') {
    keyword_search();
  }
};
    //重複を避けるため要素をあらかじめクリアしておく
    var node_space = kintone.mobile.app.getHeaderMenuSpaceElement()
    for (var i =node_space.childNodes.length-1; i>=0; i--) {
        node_space.removeChild(node_space.childNodes[i]);
    }
    var label = document.createElement('label');
    label.appendChild(document.createTextNode('  '));    
    label.appendChild(document.createTextNode('カナ氏名検索'));
    label.appendChild(document.createTextNode('  '));  
    label.appendChild(SW_カナ氏名);
    label.appendChild(document.createTextNode('  ')); 
    label.appendChild(search_button);  
    label.appendChild(document.createTextNode(' ')); 
    kintone.mobile.app.getHeaderMenuSpaceElement().appendChild(label);

return event;

});
})();

kintone.mobile.app.getHeaderSpaceElement()を使用して設置されてみては如何でしょうか?

1 Like

できました!ありがとうございます。
場所の指定って色々とあるのですね。
もっと勉強します!

1 Like

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。