javascript кнопка остановки onClick от отправки формы - PullRequest
1 голос
/ 04 августа 2020

У меня есть две кнопки внутри формы, которые я хочу не отправлять, а добавлять и удалять строки таблицы. Одна кнопка добавляется динамически.

Я пробовал много способов предотвратить отправку, но, похоже, ни один из них не работает. Когда я получал кнопку по идентификатору и использовал прослушиватель событий, это было нормально, но это не работало с кнопкой, которая добавляется после возрастной загрузки. Я пытаюсь найти решение, которое будет работать с кнопками. Тот, который загружается при загрузке страницы, и те, которые добавляются динамически с помощью JavaScript.

                <table id="conditions-table">
                    <thead>
                        <tr>
                            <th>Name</th>
                            <th>Level</th>
                            <th></th>
                        </tr>
                        <tr>
                            <td>
                                <input id="condtitions-input"></input>
                                <select id="condtitions-level">
                                    <option value="Mandatory">Mandatory</option>
                                    <option value="Important">Important</option>
                                    <option value="Support">Support</option>
                                </select>
                            </td>
                            <td>
                                <button id="add-condtition" onclick="addCondition(e); return false;">Add Conditions</button></td>
                            </td>  
                        </tr>
                    </thead>
                </table>
            </fieldset>
            <?= $this->Form->button(__('Submit')) ?>
            <?= $this->Form->end() ?>
        </div>
    </div>
</div>
<script>
    var counter = 0;

    function addCondition(e){
        e.preventDefault()

        var table = document.getElementById("conditions-table");
        var row = table.insertRow(2);
        var cell1 = row.insertCell(0);
        var cell2 = row.insertCell(1);

        var condtionsInput = document.getElementById("condtitions-input");
        var condtionsInputValue = condtionsInput.value;
        condtionsInput.value = "";

        var selectedLevel = document.getElementById("condtitions-level");
        var selectedLevelValue = selectedLevel.value;
        
        cell1.innerHTML = `<input type="text" name="strategies_conditions[${counter}][name]" value=" ${condtionsInputValue}"></input>
                            <select>
                                <option ${(selectedLevelValue == "Mandatory") ? 'selected="selected"' : ""} value="Mandatory">Mandatory</option>
                                <option ${(selectedLevelValue == "Important") ? 'selected="selected"' : ""} value="Important">Important</option>
                                <option ${(selectedLevelValue == "Support") ? 'selected="selected"' : ""} value="Support">Support</option>
                            </select>`;
        cell2.innerHTML = "<button class='remove-condition' onclick="removeCondition()">X</button></td>";

        counter++;

        return false;
    };

    function removeCondition() {
       // event.target will be the input element.
       var td = event.target.parentNode; 
      var tr = td.parentNode; // the row to be removed
      tr.parentNode.removeChild(tr);       
    };

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Тип кнопки по умолчанию - "submit"; просто переопределите это поведение, установив для него значение "button".

cell2.innerHTML = "<button type='button' class='remove-condition' onclick='removeCondition()'>X</button></td>";

Вам также необходимо определить event как параметр функции обработчика событий.

function removeCondition(event) {
      // event.target will be the input element.
      var td = event.target.parentNode; 
      var tr = td.parentNode; // the row to be removed
      tr.parentNode.removeChild(tr);       
};
0 голосов
/ 04 августа 2020

, чтобы добавить событие к элементу, который еще не существует в DOM, вам необходимо знать о event.target

вот пример, который может вам помочь

document.addEventListener( "click", listenerFunction );

function listenerFunction(event){
    var element = event.target;
    // here you check for that auto generated element
    if(element.tagName == 'A' && element.classList.contains("someBtn")){
        console.log("hi");
    }
}
0 голосов
/ 04 августа 2020

Просто не вставляйте аргумент e внутри события onclick в разметке, вы можете применить событие, используя JavaScript, как показано ниже

btn.onclick = e => {
  e.preventDefault();
}
<form>
  <input type="text" name="" placeholder="Name">
  <input type="submit" name="" id="btn">
</form>

или вы можете просто сделать onclick возврат события false, как показано ниже

<form>
  <input type="text" name="" placeholder="Name">
  <input type="submit" name="" id="btn" onclick="return false">
</form>
...