LoginSignup
0
1

More than 1 year has passed since last update.

【PHP】タグ機能②

Last updated at Posted at 2022-03-23

下記投稿の続きで、タグ機能に文字かタグの数で改行するように制御を追加します。

tag9.gif

タグか文字の数で改行

form.php
function inputChange() {

        spans = skill.getElementsByTagName("span"),
        skills = new Array();

    for (i = 0; i < spans.length; i++) {
        skills[i] = spans[i].textContent;
    }

    skills = skills.join('');

    if (3 <= spans.length || 9 <= skills.length) {
        // 改行処理
    }

タグ数と文字数を取得して、条件に合えば改行するようにします。
今回はタグ数が3つ以上または、文字数が9文字以上で設定します。

それでは、改行処理を実装していきます。
条件が一致したときに、div要素を作成して改行するようにします。
image.png
例えば上記のようなタグの場合は、
image.png
このようにdiv要素をタグの間に入れて改行させます。

form.php
:
    div_element = document.createElement("div");
    span_element.setAttribute("id", "child-span" + i + "");
:
    if (3 <= spans.length || 9 <= skills.length) {  
       i--;
       if (document.getElementById('child-span' + i + '') !== null) {
          parentDiv.appendChild(div_element, document.getElementById('child-span' + i + ''));
       }
       i++;
       }
    i++;

span要素に変数iが入ったIDを追加し、1個前のタグ('child-span' + i + ''からi-1したもの)があれば、div要素を追加します。
tag8.gif

しかし、現在のままだと2回目の改行を行うときに、タグ数と文字数が前の状態のため何を入力しても改行してしまいます。
なので、改行があった際の処理を追加します。

form.php
<body>
:
<input type="text" id="sample" />
<div id="skill">
</div>
<input type="hidden" name="skill_count" id="skill_count"> //追加
:
</body>
:
    skill_count = document.getElementById('skill_count').val;
:
    if (0 < document.getElementById('skill_count').val) {
        i--;
        skills = new Array();

        // 改行した列で再度文字数取得
        for (k = 0; k < skill_count; k++) {
            skills[k] = spans[i].textContent;
            i--;
        }
        spans = '';
        skills = skills.join('');

        // skill_countの値で改行後のタグ数を決める
        switch (skill_count) {
            case 2:
                i += 1;
                spans = '@@';
                break;

            case 3:
                i += 2;
                spans = '@@@';
                break;
            case 4:
                i += 3;
                spans = '@@@@';
                break;

            case 5:
                i += 4;
                spans = '@@@@@';
                break;
            default:
        }

        i++;
        document.getElementById('skill_count').val += 1;
    }
    if (3 <= spans.length || 9 <= skills.length) { 
:
     document.getElementById('skill_count').val = 1;
    }

改行を判定する値はブラウザ側(ID属性:skill_count)で持ちます。
skill_countが改行後のタグ数になっているため、こちらで改行後のタグ情報を取得します。

switch文skill_countの値からspans@を代入して、
タグ数を決めています。

こちらの処理を追加すると、2回目以降の改行もタグ数と文字数をカウントするようになります。
tag9.gif

また、最終行タグのバツ印をクリックした際にdocument.getElementById('skill_count').valの値もデクリメントする必要があるので、最終行をクリックしたかの判定が必要になります。
image.png

from.php
// タグのバツ印がクリックされた場合
$(document).on('click', '.far.fa-times-circle', function() {
    var k = 0,
        skills = new Array(),
        skill = document.getElementById("skill"),
        spans = skill.getElementsByTagName("span"),
        span = $(this).parents(".skill_tag")[0].textContent;

    switch (document.getElementById('skill_count').val) {
        case 1:
            var spans_count = spans.length - 1;
            break;

        case 2:
            var spans_count = spans.length - 2;
            break;

        case 3:
            var spans_count = spans.length - 3;
            break;

        default:
    }
    for (i = spans_count; i < spans.length; i++) {
        skills[k] = spans[i].textContent;
        k++;
    }
    $(this).parents(".skill_tag").remove();

    skills = skills.join('');
    if (skills.indexOf(span) != -1) {
        document.getElementById('skill_count').val -= 1;
    }
});

spans_countに総タグ数から最終行のタグ数を引いた値を代入して、
その値からskillsに最終行のタグの文字を入れます。

spanにバツ印をクリックしたタグの文字を代入し、
skillsの中にspanの値があれば、document.getElementById('skill_count').valをデクリメントします。

最後にすでに入力されているものについては、タグ追加しないようにします。

function inputChange() {
:
  // 既に入力済みのものはタグ追加しない
  if (skills.indexOf(fome_x_name) != -1) {
     return false;
  }
:
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1