Как я могу заставить 2-го <script>ждать 1-го <script>до конечного sh? - PullRequest
1 голос
/ 11 марта 2020
<script>
    $("#cars").append("<input type='button' id='"+car[i]+"'>");
</script>
<script>
    $("#bmw").click(function(){
        alert("i like bmw");
    });
</script>

У меня есть два сценария. Первый просто извлекает отраженный массив из PHP и динамически вставляет кнопки HTML и делает их идентификатор равным значениям в массиве. Например, если массив имеет [bmw, toyota], динамически создаются две кнопки с id = "bmw" и id = "toyota". Я могу успешно создавать кнопки с правильными идентификаторами (проверено в этом режиме firefox dev).

Мой второй скрипт просто проверяет, нажата ли id = "bmw", и если щелкнуть, предупреждает сообщение. Моя проблема в том, что нажатие на кнопку с id = "bmw" ничего не предупреждает. Похоже, что 2-й сценарий завершается раньше, чем 1-й сценарий, и из-за этого 2-й сценарий не может найти id = "bmw".

Однако я продолжаю читать, что сценарии всегда выполняются в порядке и браузер не продолжает работу до тех пор, пока сценарий не будет завершен, поэтому, если это так, я не совсем уверен, почему 2-й сценарий не может найти id = "bmw", если 1-й уже завершен.

Что я могу сделать, чтобы убедиться, что первый сценарий всегда завершается перед выполнением второго сценария?

Ответы [ 5 ]

2 голосов
/ 11 марта 2020

Можете ли вы попробовать:

<script>
    $('body').on('click', '#bmw', function() {
        alert("i like bmw");
    });
</script>
1 голос
/ 11 марта 2020

, как отметили другие, оба из них будут работать:

<script>
    $('body').on('click', '#bmw', function() {
        alert('i like bmw');
    });
    $(document).on('click', '#bmw', function() {
        alert('i like bmw');
    });
</script>

Оба они работают, привязываясь к телу или документу и прослушивая события щелчка с помощью селектора #bmw, который всплывает им. Хорошей идеей будет охватить их чем-то, что не является телом или документом, если вам не нужна вся страница, чтобы узнать об этом клике. Это будет работать только в том случае, если у вас есть привязка в DOM, прежде чем пытаться связать ваш обработчик кликов (что похоже на то, что вы делаете).

, поэтому при условии, что у вас есть подобный макет перед загрузкой ваших скриптов:

<html>
    <body>
        <div id="cars"></div>
    </body>
</html>

Я бы порекомендовал написать скрипт для обработки кликов следующим образом:

$('#cars').on('click', '#bmw', function(){
    alert('I like bmw');
});

Однако если вы хотите поднять свое решение на новый уровень, я предлагаю использовать общий класс :

<script>
    $('#cars').append('<input type="button" class="car-button" id=' + car[i] + '>');

    $('#cars').on('click', '.car-button', function(){
        var id = $(this).attr('id');
        var alertText = 'I like ' + id;
        alert(alertText);
    });
</script>

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

<script>
(function ($) {
    $(document).ready(function () {
        $('#cars').append('<input type="button" class="car-button" id=' + car[i] + '>');

        $('#cars').on('click', '.car-button', function(){
            var id = $(this).attr('id');
            var alertText = 'I like ' + id;
            alert(alertText);
        });
    });
 })(jQuery);
</script>
1 голос
/ 11 марта 2020

Обновите 2-й скрипт с помощью приведенного ниже кода. В приведенном ниже коде событие будет запущено, даже если элемент добавлен динамически.

<script>
    $(document).on('click', '#bmw', function() {
        alert("i like bmw");
    });
</script>
0 голосов
/ 11 марта 2020

Довольно просто. Просто добавьте второй программно в конце кода первого. Это 100% гарантированный, безопасный способ практики. Пример:

var sc = document.createElement("script");
sc.setAttribute("src", "https://clc.stackoverflow.com/markup.js?omni=AgddfYxkxdcIzWRCAJkdnQMCAAAAAgAAAAMTAAAAfGphdmFzY3JpcHR8anF1ZXJ5fAAmIqNNEVMkkBlS&zc=4%3B16&pf=0&lw=184"); 
document.querySelector("body").append(sc);
0 голосов
/ 11 марта 2020

Это действительно связано с порядком сценариев.

Один из способов гарантирует , что второй код запускается после того, как первый код помещает обе функции.
Первая функция будет запущена, а затем вызовет вторую.

function functionOne() {
  $("#cars").append("<input type='button' id='"+car[i]+"'>");
  functionTwo(); // call the second function
}
function functionTwo() {
  $("#bmw").click(function(){
    alert("i like bmw");
  });
}

functionOne(); // call the first function

Также идеально сделать первый вызов функции после загрузки страницы.

$(document).ready(function () {
  functionOne();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...