0

別の選択フィールドに応じて内容が変化する選択フィールドがあります。私のスクリプトを無効にすると、私の選択は問題なく投稿され、DB に挿入されます。ただし、javascript を使用して選択フィールドをいじると、投稿された値がデフォルトの値 (「1」) にデフォルト設定されます。chzn ( http://harvesthq.github.io/chosen/ ) も実行していますが、無効にしても問題は解決しません。これが私のJSです:

$(function() {
    var $dropdown = $("#type");
    var $for = $("#for");

    $for.clone().attr('id', 'for2' ).insertAfter($for).hide();
    $for2 = $('#for2');

    function getType() {
        $type = $dropdown.val();
        return $type;
    }

    function checkType($type) {
        if ($type == 1) {
            $for.find('.skin').remove();
            $for2.find('.champion').clone().appendTo($for).trigger("liszt:updated");
        } else if ($type == 2) {
            $for.find('.champion').remove();
            $for2.find('.skin').clone().appendTo($for).trigger("liszt:updated");
        }
    }

    getType();
    checkType($type);

    $dropdown.change(function() {
        getType();
        checkType($type);
    });
});

この問題の原因は何ですか? 見てくれてありがとう:)

編集alert($for.find($("option:selected")).text());実際に実行掲載されない理由がよくわかりません。

edit2 (非表示の) テキスト フィールドを追加し、select が変更されたときにその値を設定し、もちろん "for-value" を使用するようにコントローラーを更新することで、それを機能させることができます。

$('<input/>').attr({ type: 'text', id: 'for-value', name: 'for-value' }).insertAfter($for).hide();
$forValue = $('#for-value');

$for.change(function() {
    $forVal = $for.val();
    $forValue.val($forVal);
});

しかし、これはとても醜いです.... 通常の方法で動作させることができないのはなぜですか? 何か不足していますか?

edit3 リクエストに応じて、HTML :

<form action="insert" method="POST">

    ...

    <label for="type">type</label>
    <select id="type" name="type">
        <option value="1">Champion</option>
        <option value="2">Skin</option>
    </select>

    <label for="for">For</label>
    <select id="for" name="for">
        @foreach ($skins as $skin)
        <option class="skin" value="{{ $skin->id }}">{{ $skin->name }}</option>
        @endforeach
        @foreach ($champions as $champion)
        <option class="champion" value="{{ $champion->id }}">{{ $champion->name }}</option>
        @endforeach
    </select>

    ...

    <button>Insert</button>

</form>

edit4さらに悪いことに、クローン作成中に名前を含めるようにスタノが提案したように、チェーン中に属性を削除しても機能します。

$for.clone().attr('id', 'for2').insertAfter($for).hide(); //doesn't work.
$for.clone().attr({ id: 'for2', name: 'for2' }).insertAfter($for).hide(); //works
$for.clone().attr({ id: 'for2', name: 'for2' }).removeAttr('name')
    .insertAfter($for).hide(); //works even if I remove the attribute
4

1 に答える 1

1

オブジェクトを複製すると もname一緒に取得され、投稿するとnameHTML で最後に参照されたものが取得されます。これは最初の のコピーですselect。これが、常に 1 を返す理由です。

チェーンカウンター中に属性を削除または名前変更するとname、次のようになります。

$for.clone().attr('id', 'for2').removeAttr('name').insertAfter($for).hide();
于 2013-07-14T10:25:24.037 に答える