Часто у меня будет файл JavaScript, который я хочу использовать, который требует, чтобы определенные переменные были определены на моей веб-странице.
Итак, код выглядит примерно так:
<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
var obj1 = "somevalue";
</script>
Но то, что я хочу сделать, это:
<script type="text/javascript"
src="file.js?obj1=somevalue&obj2=someothervalue"></script>
Я пробовал разные методы, и лучший из них - проанализировать строку запроса следующим образом:
var scriptSrc = document.getElementById("myscript").src.toLowerCase();
А потом ищи мои ценности.
Интересно, есть ли другой способ сделать это без создания функции для анализа моей строки.
Вы все знаете другие методы?
Ответы:
Я бы порекомендовал не использовать глобальные переменные, если это возможно. Используйте пространство имен и ООП, чтобы передать свои аргументы объекту.
Этот код принадлежит в file.js:
И в вашем HTML-файле:
источник
var MYLIBRARY = MYLIBRARY || (function(){}());
? Почему должноMYLIBRARY
быть установлено логическое значение?Вы можете передавать параметры с произвольными атрибутами. Это работает во всех последних браузерах.
Внутри somefile.js вы можете получить значения переданных переменных следующим образом:
........
...и т.д...
источник
document.currentScript
, см. Caniuse.com/#feat=document-currentscript для совместимости (или использовать polyfill)$(..)
Синтаксис JQuery, не забудьте включить его.Еще одна идея , которую я наткнулся был Назначив
id
к<script>
элементу и передавая аргументы какdata-*
атрибуты. Получившийся<script>
тег будет выглядеть примерно так:Затем скрипт может использовать идентификатор, чтобы программно найти себя и проанализировать аргументы. Учитывая предыдущий
<script>
тег, имя может быть получено так:Мы получаем
name
=helper
источник
helper.js
скрипт просматривал всеscript
теги на странице, отыскивал один с помощьюscr="helper.js"
, а затем извлекалdata-name
.var this_js_script = $('script[src*=somefile]');
(скопировано сверху )Проверьте этот URL. Это работает отлично для требования.
http://feather.elektrum.org/book/src.html
Большое спасибо автору. Для быстрого ознакомления я вставил основную логику ниже:
источник
Вы используете Глобальные переменные :-D.
Как это:
Код JavaScript в file.js может получить доступ
obj1
иobj2
без проблем.EDIT Просто хочу добавить , что если «file.js» хочет , чтобы проверить,
obj1
иobj2
даже были объявлены вы можете использовать следующую функцию.Надеюсь это поможет.
источник
return typeof window[$Name] !== 'undefined';
. Обратите внимание, что вы передадите этой функции строку, содержащую имя переменной. Вероятно, проще просто проверить, существует ли переменная в вызывающем коде (это не может быть реализовано как функция) черезif (typeof var !== 'undefined')
.var
.Вот очень поспешное доказательство концепции.
Я уверен, что есть как минимум 2 места, где могут быть улучшения, и я также уверен, что это не продержится долго в дикой природе. Любые отзывы, чтобы сделать его более презентабельным или пригодным для использования, приветствуются.
Ключ устанавливает идентификатор для вашего элемента скрипта. Единственный улов в том, что это означает, что вы можете вызвать скрипт только один раз, так как он ищет этот идентификатор, чтобы получить строку запроса. Это можно исправить, если вместо этого сценарий перебирает все элементы запроса, чтобы увидеть, указывает ли на них какой-либо из них, и, если это так, использует последний экземпляр такого элемента сценария. В любом случае, с кодом:
Сценарий называется:
Скрипт вызывается через следующую страницу:
источник
может быть очень простым
например
Затем вы можете конвертировать строку запроса в JSON, как показано ниже
а затем можно использовать как
источник
Это легко сделать, если вы используете Javascript-фреймворк, например, jQuery. Вот так,
Теперь вы можете использовать эти параметры, разделяя их в качестве параметров вашей переменной.
Тот же процесс может быть выполнен без какой-либо инфраструктуры, но займет еще несколько строк кода.
источник
Ну, вы могли бы создать файл javascript любым из языков сценариев, вставляя ваши переменные в файл при каждом запросе. Вы должны сказать своему веб-серверу, чтобы он не выдавал js-файлы статически (достаточно использовать mod_rewrite).
Имейте в виду, что вы потеряете любое кэширование этих js-файлов, поскольку они постоянно изменяются.
До свидания.
источник
<script>
блока вы можете использовать что-то вроде того,MyModule.Initialize( '<%: Model.SomeProperty%>', '<%: Model.SomeOtherProperty%>', ...);
что отображается на сервере. Внимание:<%:
экранирует значение, а<%=
отправляет значение без экранирования.MyModule
будет пространством имен (т. е. переменная внутри файла .js, которая вызывается самостоятельно, которая предоставляет функциюInitialize
). Я проголосовал за ваш ответ, потому что это полезный вклад.Хороший вопрос и креативные ответы, но я предлагаю сделать ваши методы параметризованными, и это должно решить все ваши проблемы без каких-либо уловок.
если у вас есть функция:
Вы можете изменить это на:
Я думаю, что это наиболее естественный подход, вам не нужно создавать дополнительную документацию о «параметрах файла», и вы получаете то же самое. Это особенно полезно, если вы разрешаете другим разработчикам использовать ваш файл js.
источник
Нет, вы действительно не можете сделать это, добавив переменные в часть строки запроса URL-адреса файла JS. Если он пишет часть кода для анализа строки, которая вас беспокоит, возможно, другим способом было бы json кодировать ваши переменные и помещать их в нечто вроде атрибута rel тега? Я не знаю, насколько это правильно с точки зрения валидации HTML, если это то, что вас очень беспокоит. Тогда вам просто нужно найти атрибут rel в скрипте и затем json_decode.
например
источник
Это недействительный HTML (я не думаю), но, похоже, он будет работать, если вы создадите пользовательский атрибут для тега script на своей веб-странице :
<script id="myScript" myCustomAttribute="some value" ....>
Затем получите доступ к пользовательскому атрибуту в JavaScript:
var myVar = document.getElementById( "myScript" ).getAttribute( "myCustomAttribute" );
Не уверен, что это лучше или хуже, чем анализ исходной строки скрипта.
источник
Если вам нужен способ, который проходит проверку CSP (которая запрещает unsafe-inline), то вам нужно использовать метод nonce, чтобы добавить уникальное значение как в сценарий, так и в директиву CSP, или записать свои значения в html и прочитать их снова.
Nonce метод для express.js:
или записать значения в метод HTML. в этом случае с помощью Jquery:
источник
Хотя этот вопрос был задан некоторое время назад, он все еще актуален на сегодняшний день. Это не тривиальный подход с использованием параметров файла сценария, но у меня уже было несколько крайних вариантов использования, которые наиболее подходили для этого способа.
Я наткнулся на этот пост, чтобы найти лучшее решение, чем писал некоторое время назад, с надеждой найти, возможно, нативную функцию или что-то подобное.
Я поделюсь своим решением, пока не будет реализовано лучшее. Это работает на большинстве современных браузеров, может быть, даже на старых, не пробовал.
Все решения, приведенные выше, основаны на том факте, что он должен быть внедрен с предопределенным и хорошо маркированным тегом SCRIPT и полностью полагаться на реализацию HTML. Но что, если скрипт внедряется динамически или, что еще хуже, что, если вы напишите библиотеку, которая будет использоваться на различных веб-сайтах?
В этих и некоторых других случаях все приведенные выше ответы являются недостаточными и даже становятся слишком сложными.
Во-первых, давайте попробуем понять, чего нам нужно достичь здесь. Все, что нам нужно сделать, это получить URL-адрес самого скрипта, оттуда это будет просто.
На самом деле есть хороший трюк, чтобы получить URL скрипта от самого скрипта. Одной из функциональных возможностей нативного
Error
класса является возможность обеспечения трассировки стека «проблемного местоположения», включая точную трассировку файла до последнего вызова. Чтобы добиться этого, я буду использовать свойство стека экземпляра Error, который после создания даст полную трассировку стека.Вот как работает магия:
Теперь в любом случае вызова скрипта, как в случае с OP:
В
file.js
скрипте теперь вы можете сделать:Это также будет работать с RequireJS и другими динамически внедренными файловыми сценариями.
источник