Передача переменных Javascript в URL

Я пытаюсь передать переменную javascript на страницу php через URL-адрес. Код ниже запускает php-страницу, но не получает переменную. Я написал код, используя window.location.href, и он отлично работает, проблема в том, что он загружает страницу tracker.php.

Ниже мой код.

<script type = "text/javascript">
var siteId = "VT0013";
</script>
<script type = "text/javascript" src = "http://www.domainame.com/tracker.php?siteId = "+ siteId ;> 
</script>

PHP-страница

$siteId = $_GET["siteId"];

Как только я получаю siteId, я отправляю результат по электронной почте в качестве теста, это работает нормально, за исключением того, что я не получаю значение siteId. При использовании того же кода с window.location.href все работает нормально.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
0
367
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно использовать document.write для написания любого HTML, который содержит переменные JavaScript:

<script type = "text/javascript">
var siteId = "VT0013";
document.write('<script type = "text/javascript" src = "http://www.domainame.com/tracker.php?siteId='+encodeURIComponent(siteId)+'">
</script>')
</script>

Это равносильно написанию

<script type = "text/javascript">
var siteId = "VT0013";
</script>
<script type = "text/javascript" src = "http://www.domainame.com/tracker.php?siteId=VT0013"></script>

Отредактировано, чтобы правильно экранировать переменную JavaScript.

Обратите внимание, что не рекомендуется использовать document.write для загрузки скриптов из стороннего домена, потому что Google Chrome может не загружать скрипт, если соединение слишком медленное. См. https://developers.google.com/web/updates/2016/08/removing-document-write.

Если скрипт можно загрузить асинхронно, я рекомендую вместо этого этот метод, потому что он не замедлит анализатор HTML:

<script>
var siteId = "VT0013";
(function(d, s){
    s = d.createElement("script");
    s.src = "http://www.domainame.com/tracker.php?siteId = "+encodeURIComponent(siteId);
    d.getElementsByTagName("head")[0].appendChild(s);
})(document)
</script>

Не используйте document.write(). stackoverflow.com/q/802854/362536 Есть гораздо лучшие методы. Кроме того, как и в случае с другим ответом здесь, вы, вероятно, включаете XSS. Вам нужно экранировать свои данные, если вы собираетесь использовать их в контексте HTML.

Brad 22.12.2020 06:59

Если он не использует document.write, скрипт не будет загружаться синхронно, как в его примере. В этом случае нет ничего плохого в использовании document.write.

PHP Guru 22.12.2020 07:11

@Brad Я обновил свой ответ, чтобы решить проблемы, на которые вы указали.

PHP Guru 22.12.2020 07:43

Я предполагаю, что, поскольку это называется tracker.php, вам просто нужно нажать на этот URL? Если это так, рассмотрите возможность использования Beacon API.

navigator.sendBeacon('https://example.com/tracker.php' {
  siteId: 'VT0013'
});

Это приводит к запросу HTTP POST, но в любом случае это лучше для этого. Вам не придется беспокоиться о кэшировании. Кроме того, Beacon API будет по-прежнему работать, даже если запрос не завершен и страница выгружается.

Если вы действительно хотите вместо этого динамически загружать JavaScript, текущий способ сделать это — использовать import().

const siteId = 'VT0013';
await import (`https://example.com/tracker.php?siteId${encodeURIComponent(siteId)}`);

Наконец, если вам нужно динамически загрузить этот JavaScript, и этот скрипт должен выполняться в контексте остальной части страницы (т. е. не в модуле), то лучше всего добавить новый тег скрипта: https:/ /stackoverflow.com/a/8578840/362536

Независимо от того, что вы делаете, убедитесь, что вы избегаете данных, используемых в ваших URL-адресах и в вашем HTML.

Не используйте document.sendBeacon(). Он не загружает и не выполняет скрипты, а в старых браузерах вызывает ошибку, останавливающую любой код JavaScript, следующий за ним. Было бы упущением не поддерживать такие браузеры, как Internet Explorer и другие старые браузеры, потому что буквально миллионы людей все еще используют их. Внедрение тега скрипта может сработать, но только если скрипт можно загрузить асинхронно.

PHP Guru 23.12.2020 07:17

@PHPGuru Как я уже сказал в своем ответе, API-интерфейс маяка подходит только в том случае, если для этого достаточно сделать запрос к этому URL-адресу. Что касается поддержки браузера, это зависит от ваших потребностей. Beacon API поддерживается уже много лет. caniuse.com/beacon Разработчик должен найти решение, подходящее для его конкретного варианта использования, поэтому я объясняю компромиссы.

Brad 23.12.2020 07:31

Это превосходное решение для меня, хотя и откровенно современное. Отличный ответ! Для тех, кто хочет быстрый способ старой школы, который действительно поддерживает IE из коробки, мой ответ, надеюсь, охватит это.

Yes Barry 23.12.2020 14:54

@Brad Я предполагаю, что вы правы в том, что OP просто нужно нажать на URL-адрес, и Navigator.sendBeacon() подойдет для этого. Но он существует всего несколько лет. Если вам просто нужно перейти по URL-адресу из другого источника, лучший способ сделать это — создать новое изображение с помощью new Image(), а затем изменить его свойство src, которое работает во всех браузерах. Вы также не должны использовать импорт для чего-то подобного, потому что он не нужен для такой простой задачи и не будет работать в старых браузерах. Вам лучше ввести тег скрипта, предполагая, что скрипт может работать асинхронно, что не подразумевалось, но не маловероятно

PHP Guru 23.12.2020 20:24

Вы можете просто сделать быстрый запрос XHR, если вам нужна поддержка старых браузеров без полифиллов:

var siteId = 'VT0013'; 
var xhr = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');

xhr.open('GET', 'http://www.domainame.com/tracker.php?siteId=' + encodeURIComponent(siteId));
xhr.send();

Это просто альтернативное решение, ответ @Brad должен быть принят.

Это будет работать только в том случае, если ваш трекер находится в том же источнике. Чтобы заставить его работать на стороннем источнике, вам нужен соответствующий заголовок ответа Access-Control-Allow-Origin и современный веб-браузер. Если вы просто пытаетесь загрузить сторонний трекер, есть способы получше.

PHP Guru 23.12.2020 17:24

Другие вопросы по теме