2015-04-22 3 views
2

У меня есть внешний скрипт, а затем встроенный скрипт внизу моего <body>. Похоже, что инлайн скрипт работает до внешнего скрипта, который не должен произойти, в соответствии с этим ответом:Сценарии не работают в Chrome

Если вы не динамической загрузки скриптов или пометив их, как отсрочка или асинхронном, то скрипты загружаются в порядке, указанном на странице. Не имеет значения, является ли это внешним скриптом или встроенным скриптом - они выполняются в том порядке, в котором они встречаются на странице. Встроенные скрипты, которые поступают после внешних скриптов, сохраняются до , все внешние скрипты, которые были перед ними, загружены и запущены.

Src: https://stackoverflow.com/a/8996894/114855

Это мой код:

<script src="https://checkout.stripe.com/checkout.js"></script> 
    <script> 
    var handler = StripeCheckout.configure({ 
    key: 'pk_live_HhFqemZFyEUJVorFzYvjUK2j', 
    token: function(res) { 
     $('#pay_token').val(res.id); 
     $('#pay_email').val(res.email) 
     $('#pay_amount').val(parseFloat($("#amount").val())*100); 
     $('#pay_description').val($("#description").val()); 
     $('#pay_real').submit(); 
    } 
    }); 

    /* .. */ 
    </script> 

</body> 

консоль показывает, что StripeCheckout не определен (что внешний скрипт должен определить)

Console

Это имеет смысл, поскольку вкладка сети показывает, что мой exter Запрос nal все еще ожидает. Но я не знаю, почему браузер не ждать checkout.js быть неправдоподобным:

Network

+0

Загрузите внешний файл в 'head' документа – APAD1

ответ

2

Комментарии к обоим ответам в процитированном вопрос указывают, что принятый ответ не подкреплены стандартами ссылка (применима ко всем часто встречающимся версиям браузера) и действительно может быть неверной для всех браузеров все время.

Я могу подтвердить это поведение. Но на наших страницах отзывов есть подсказки, что он может работать только при кэшировании test.php. Знаете ли вы какие-либо спецификации/ссылки на эту ссылку?

Этот ответ неверен. Не всегда бывает, что «динамически добавленные скрипты выполняются, как только они присоединяются к документу». Иногда это верно (например, для старых версий Firefox), но обычно это не так. Порядок выполнения, упомянутый в ответе jfriend00, не определен

Чтобы быть в полной безопасности, дождитесь DOM is fully rendered перед запуском скрипта.

+0

Не выполняет [рекомендации для html5] (http://www.w3.org/TR/html5/scripting-1.html) порядок выполнения сценария ? – Leo

+1

@Leo: Каждый часто встречающийся браузер реализует спецификацию html5? –

+0

Наверное, нет. :-(- Хотя интересная вещь здесь заключается в том, что Chrome почему-то ее пропустил. Глядя на спецификацию, он говорит что-то вроде «каждого элемента скрипта с атрибутом src». Немного обманчивый, я думаю. – Leo

2

Ahha - Я понял это!

Это часть приложения для рельсов, работающего на TurboLinks.

TurboLinks динамически изменяет содержимое тела, а не создает новый запрос каждый раз, когда вы нажимаете ссылку. Это означает, что мои скриптовые теги вставляются динамически, и гарантия, что они выполняются в порядке, теряется.

Поскольку TurboLinks не Переоцените тег сценария на каждом запросе, я думаю, самое простое/лучшее решение здесь будет включать StripeCheckout на каждой странице моего приложения (а не только один-х это необходимо на), в <head>

Я также думаю, что TurboLinks может решить эту проблему, найдя способ запуска сценариев по порядку.Я планирую следить за проблемой в своем github и обновить здесь соответственно.

Смежные вопросы