0

jQueryを使用して何らかの評価フォームを作成しています。これは基本的に、HTML テーブル形式のグリッドまたはマトリックスです。クリック(および後でホバー)イベントを適用したい2x5のテーブルセルがあります。表のセルをクリックすると、すべての要素が列ごとに収集されます。クリックした列と左側の列 (この選択バーと呼びます) にクラスを適用し、右側の列 (これは nar、「バーなし」の略) からクラスを削除します。

改善の余地はありますが、選考プロセスは理解できたと思います。私が行っている .hasClass() テストに失敗した場合でも、クラスが適用されるだけです。

必要に応じて、いくつかのコード。これが私の静的 HTML テンプレートです。

<tr class="boss">
    <td class="question" rowspan="2">Executing for results</td>
    <td class="radio answer-tail click-tail"></td>
    <td class="radio answer-head click-head"></td>
    <td class="radio"></td>
    <td class="radio"></td>
    <td class="radio"></td>
</tr>
<tr class="employee">
    <td class="radio answer-tail click-tail"></td>
    <td class="radio answer-tail click-tail"></td>
    <td class="radio answer-tail"></td>
    <td class="radio answer-head"></td>
    <td class="radio"></td>
</tr>

そして、これは私の .click() です:

$("td.radio").click(function() {
    var bar = $(this).prevUntil("td.question").andSelf();
    var nar = $(this).nextAll("td.click-head, td.click-tail, td.click");
    var row = $(this).parent();
    var bro = null;
    if (row.hasClass("boss")) {
        bro = row.next("tr.employee").children().eq($(this).index() - 1);
    } else if (row.hasClass("employee")) {
        bro = row.prev("tr.boss").children().eq($(this).index() + 1);
    }
    bar.push(bro.prevAll("td.radio").add(bro));
    nar.push(bro.nextAll("td.click-head, td.click-tail, td.click"));
    bar.each(function(i, e) {
        if ($(e).hasClass("answer-head")) {
            $(e).addClass("click-head");
        } else if ($(e).hasClass("answer-tail")) {
            $(e).addClass("click-tail");
        } else {
            $(e).addClass("click");
        }
    });
    nar.each(function(i, e) {
        $(e).removeClass("click-head").removeClass("click-tail").removeClass("click");
    });
});

問題は、このスクリプトが奇妙なバグを引き起こすことです。つまり、2 行目の最後のテーブル セルをクリックすると、次のようになります。

<tr class="boss">
    <td class="question" rowspan="2">Executing for results</td>
    <td class="radio answer-tail click-tail click-head"></td>
    <td class="radio answer-head click-head"></td>
    <td class="radio click-head"></td>
    <td class="radio click-head"></td>
    <td class="radio click-head"></td>
</tr>
<tr class="employee">
    <td class="radio answer-tail click-tail"></td>
    <td class="radio answer-tail click-tail"></td>
    <td class="radio answer-tail click-tail"></td>
    <td class="radio answer-head click-head"></td>
    <td class="radio click"></td>
</tr>

最初の行の最後のセルには、間違ったクラスが与えられています。私の bar.each() では、現在のセルにクラス .answer-head があるかどうかを確認し、そうでない場合は .click を使用する必要があります。これは何らかの形でオーバーライドされ、とにかく .click-head が与えられます。

なんで?

編集: そして、ここにフィドルがあります: http://jsfiddle.net/tSyLj/ (WebKit 依存: Chrome または Safari...)

4

0 に答える 0