Передача параметров в файлы JavaScript

\n -> символ новой строки не работает для вставки новой строки.

    str="Hello!!";
    document.write(str);
    document.write("\n");
    document.write(str);

Но если мы используем ниже код, то он отлично работает и дает новую строку.

    document.write(str);
    document.write("<br>");
    document.write(str);

Примечание :: Я пробовал код Visual Studio.

141
задан LWC 10 January 2019 в 07:41
поделиться

8 ответов

Я бы рекомендовал по возможности не использовать глобальные переменные. Используйте пространство имен и ООП, чтобы передать свои аргументы объекту.

Этот код принадлежит file.js:

var MYLIBRARY = MYLIBRARY || (function(){
    var _args = {}; // private

    return {
        init : function(Args) {
            _args = Args;
            // some other initialising
        },
        helloWorld : function() {
            alert('Hello World! -' + _args[0]);
        }
    };
}());

И вашему html-файлу:

<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
   MYLIBRARY.init(["somevalue", 1, "controlId"]);
   MYLIBRARY.helloWorld();
</script>
195
ответ дан 23 November 2019 в 22:46
поделиться

Вы используете глобальные переменные :-D.

Подобно этому:

<script type="text/javascript">
   var obj1 = "somevalue";
   var obj2 = "someothervalue";
</script>
<script type="text/javascript" src="file.js"></script">

JavaScript-код в 'file.js' может без проблем получить доступ к obj1 и obj2.

EDIT Просто добавим, что если 'file.js' хочет проверить, были ли вообще объявлены obj1 и obj2, то можно воспользоваться следующей функцией.

function IsDefined($Name) {
    return (window[$Name] != undefined);
}

Надеюсь, это поможет.

13
ответ дан 23 November 2019 в 22:46
поделиться

Это легко сделать, если вы используете какой-нибудь Javascript-фреймворк, например jQuery. Например,

var x = $('script:first').attr('src'); //Fetch the source in the first script tag
var params = x.split('?')[1]; //Get the params

Теперь вы можете использовать эти параметры, разделив их в качестве параметров переменной.

Этот же процесс может быть выполнен без использования фреймворка, но займет еще несколько строк кода.

6
ответ дан 23 November 2019 в 22:46
поделиться

Ну, файл javascript можно было бы собрать на любом из языков сценариев, вводя свои переменные в файл при каждом запросе. Вы должны будете сказать своему веб-серверу, чтобы он не выдавал js-файлы статически (достаточно использовать mod_rewrite).

Помните, однако, что вы теряете кэширование этих js-файлов, так как они постоянно изменяются.

Пока.

1
ответ дан 23 November 2019 в 22:46
поделиться

Нет, на самом деле вы не можете этого сделать, добавив переменные в квистинговую часть URL JS-файла. Если это написание части кода для разбора беспокоящей Вас строки, возможно, другим способом будет json кодировать Ваши переменные и помещать их во что-то вроде атрибута rel тэга? Я не знаю, насколько это достоверно с точки зрения HTML валидации, если это что-то, что вас очень беспокоит. Тогда вам просто нужно найти атрибут rel скрипта, а затем json_decode это.

eg

<script type='text/javascript' src='file.js' rel='{"myvar":"somevalue","anothervar":"anothervalue"}'></script>
0
ответ дан 23 November 2019 в 22:46
поделиться

Вот очень поспешное доказательство концепции.

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

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

Вызываемый скрипт:

window.onload = function() {
//Notice that both possible parameters are pre-defined.
//Which is probably not required if using proper object notation
//in query string, or if variable-variables are possible in js.
var header;
var text;

//script gets the src attribute based on ID of page's script element:
var requestURL = document.getElementById("myScript").getAttribute("src");

//next use substring() to get querystring part of src
var queryString = requestURL.substring(requestURL.indexOf("?") + 1, requestURL.length);

//Next split the querystring into array
var params = queryString.split("&");

//Next loop through params
for(var i = 0; i < params.length; i++){
 var name  = params[i].substring(0,params[i].indexOf("="));
 var value = params[i].substring(params[i].indexOf("=") + 1, params[i].length);

    //Test if value is a number. If not, wrap value with quotes:
    if(isNaN(parseInt(value))) {
  params[i] = params[i].replace(value, "'" + value + "'");
 }

    // Finally, use eval to set values of pre-defined variables:
 eval(params[i]);
}

//Output to test that it worked:
document.getElementById("docTitle").innerHTML = header;
document.getElementById("docText").innerHTML = text;
};

Скрипт вызывается через следующую страницу:

<script id="myScript" type="text/javascript" 
        src="test.js?header=Test Page&text=This Works"></script>

<h1 id="docTitle"></h1>
<p id="docText"></p>
12
ответ дан 23 November 2019 в 22:46
поделиться

Проверьте этот URL. Он отлично работает в соответствии с требованиями.

http://feather.elektrum.org/book/src.html

Большое спасибо автору. Для быстрого ознакомления я вставил основную логику ниже:

var scripts = document.getElementsByTagName('script');
var myScript = scripts[ scripts.length - 1 ];

var queryString = myScript.src.replace(/^[^\?]+\??/,'');

var params = parseQuery( queryString );

function parseQuery ( query ) {
  var Params = new Object ();
  if ( ! query ) return Params; // return empty object
  var Pairs = query.split(/[;&]/);
  for ( var i = 0; i < Pairs.length; i++ ) {
    var KeyVal = Pairs[i].split('=');
    if ( ! KeyVal || KeyVal.length != 2 ) continue;
    var key = unescape( KeyVal[0] );
    var val = unescape( KeyVal[1] );
    val = val.replace(/\+/g, ' ');
    Params[key] = val;
  }
  return Params;
}
19
ответ дан 23 November 2019 в 22:46
поделиться

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

если у вас есть функция:

function A()
{
    var val = external_value_from_query_string_or_global_param;
}

, вы можете изменить это на:

function B(function_param)
{
    var val = function_param;
}

Я думаю, что это наиболее естественный подход, вам не нужно создавать дополнительную документацию о «параметрах файла», и вы получите то же самое. Это особенно полезно, если вы разрешаете другим разработчикам использовать ваш файл js.

1
ответ дан 23 November 2019 в 22:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: