Многострочная строка, содержащая специальные символы в javascript?

Я пытаюсь использовать порт обработки javascript, найденный по адресу http://ejohn.org/blog/processingjs/ Я хочу использовать следующий конструктор. Processing(CanvasElement, "some massive block of code"); Я знаю, что javascript изначально не поддерживает многострочные строки, но есть ли способ передать что-то вроде следующего без необходимости объединять каждую строку и экранировать каждый специальный символ?

/**
 * Array. 
 * 
 * An array is a list of data. Each piece of data in an array 
 * is identified by an index number representing its position in 
 * the array. Arrays are zero based, which means that the first 
 * element in the array is [0], the second element is [1], and so on. 
 * In this example, an array named "coswav" is created and
 * filled with the cosine values. This data is displayed three 
 * separate ways on the screen.  
 */

size(200, 200);

float[] coswave = new float[width];

for (int i = 0; i < width; i++) {
  float amount = map(i, 0, width, 0, PI);
  coswave[i] = abs(cos(amount));
}

for (int i = 0; i < width; i++) {
  stroke(coswave[i]*255);
  line(i, 0, i, height/3);
}

for (int i = 0; i < width; i++) {
  stroke(coswave[i]*255 / 4);
  line(i, height/3, i, height/3*2);
}

for (int i = 0; i < width; i++) {
  stroke(255 - coswave[i]*255);
  line(i, height/3*2, i, height);
}

person Jared    schedule 20.01.2009    source источник


Ответы (5)


Javascript на самом деле поддерживает многострочные строки: добавьте обратную косую черту в конец каждой строки:

alert('1\
    2\
    3');

Не очень красиво, но работает.

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

<?=json_encode('your text');?>
person Greg    schedule 20.01.2009
comment
+1. И я думал, что знаю все нюансы синтаксиса Javascript. Хороший ответ. - person AnthonyWJones; 20.01.2009

Для более удобного решения я бы поместил его в теги тегов script в теле страницы, например:

<script type="text/processing" id="code">
/**
 * Array. 
 * ...
 */

size(200, 200);
...
</script>

И создайте свой объект обработки, например:

var canvas = document.getElementById('canvas');
var code = document.getElementById('code');
Processing(canvas , code.textContent);

Для быстрого и грязного решения запустите код обработки через кодировщик JSON как Предложил RoBorg, и вы получите строку, которую можно просто скопировать и вставить во второй параметр.

person Crescent Fresh    schedule 20.01.2009

Поместите «большой блок кода» в отдельный файл на сервере, загрузите его с помощью AJAX и убедитесь, что он имеет разумные заголовки кеша.

person AnthonyWJones    schedule 20.01.2009
comment
Это быстрое и грязное решение проблемы, поэтому не хочу идти по маршруту ajax, если я могу этого избежать. Смотрите этот вопрос. stackoverflow.com/questions/460085/ - person Jared; 20.01.2009

В качестве альтернативы вы можете просто поместить текст на HTML-страницу (например, скрытую) и получить его оттуда...

person PhiLho    schedule 20.01.2009

Другим вариантом было бы использование литералов E4X.

var s = "" + <r><![CDATA[
line 1
line 2
]]></r>;

Хотя я сомневаюсь, что это поддерживается IE6.

person vava    schedule 20.01.2009
comment
Он даже не поддерживается IE7. - person Greg; 20.01.2009