Среда JavaScript iBooks - неверное имя элемента
Итак, я сузил свою ошибку (ну, по крайней мере, первую) до этой функции:
var genArray = function () {
var arr, len, i;
if(arguments.length > 0) {
len = [].slice.call(arguments, 0, 1)[0];
arr = new Array(len);
for(i = 0; i < len; i++) {
arr[i] = genArray.apply(null, [].slice.call(arguments, 1));
}
} else {
return null; //or whatever you want to initialize values to.
}
return arr;
}
Затем я получаю очень бесполезную ошибку:
error on line 71 at column 23: StartTag: invalid element name
Below is a rendering of the page up to the first error
Теперь эта функция явно не в строке 71 (возможно, она находится в скомпилированном ePub, но я понятия не имею, как они соотносятся). Кроме того, я понятия не имею, что означает эта ошибка в контексте JavaScript. Кроме того, этот код отлично работает в браузере (включая Safari).
Есть идеи, что может быть причиной проблемы?
РЕДАКТИРОВАТЬ: по прихоти я проверил, []
была проблема, изменив его на Array()
, Неудачно.
3 ответа
Итак, я нашел решение моей проблемы. Мне просто нужно заключить JavaScript в теги CDATA, например:
//<![CDATA[
var genArray = function () {
var arr, len, i;
if(arguments.length > 0) {
len = [].slice.call(arguments, 0, 1)[0];
arr = new Array(len);
for(i = 0; i < len; i++) {
arr[i] = genArray.apply(null, [].slice.call(arguments, 1));
}
} else {
return null; //or whatever you want to initialize values to.
}
return arr;
}
//]]>
Я обнаружил это с помощью инструмента epubcheck, который сказал, что файл должен иметь правильно сформированные символы или что-то в этом роде. Я не помню точное сообщение. В любом случае, это напомнило мне о проблеме, с которой я столкнулся в сценарии, когда я использовал несколько символов Юникода. Я вспомнил о CDATA, который решил это. Затем я обнаружил вопрос о стекопереработке, который в основном говорит, что это необходимо для случаев, когда ваши страницы должны также интерпретироваться как XML/XHTML, как в случае ePubs.
Итак, мораль этой истории заключается в том, что javascript обернут в теги CDATA для электронных книг или iBooks.
РЕДАКТИРОВАТЬ: Следует отметить, что стоит делать это вокруг всего вашего JavaScript. Проблема в моем случае была <
меньше, чем оператор, интерпретируемый как начало тега. Тем не менее, вероятно, было бы лучше включить тег CDATA вокруг всего вашего JavaScript, а не пытаться изолировать источники проблемы.
РЕДАКТИРОВАТЬ 2: В интересах агрегирования информации для тех, кто считает этот ответ полезным, следует также отметить, что наличие всего JavaScript во внешних файлах, вероятно, также работает (согласно источнику, связанному в ответе на вопрос, с которым я связан). Я не хочу проверять это в данный момент, но это должно работать, потому что внешний JavaScript не будет анализироваться как XML, как внутри <script>
тег.
Для меня это больше похоже на ошибку XHTML. Когда вы запустите браузер, если вы не открываете его как файл XHTML, сделайте это и посмотрите, не сломается ли он. Браузеры, как правило, более снисходительны, чем читатели EPUB. Скорее всего, вы создаете какой-то недопустимый HTML-элемент со своими кусочками, было бы здорово иметь полную страницу, чтобы точно определить, что возвращает getArray()...
Сообщение об ошибке указывает на то, что источник файла XHTML содержит ошибку. Я бы посмотрел на строку 71, столбец 23 рассматриваемого файла XHTML. Что там? Может ли это быть <StartTag>
? XHTML генерируется как-то программно? EPUB не "компилируются"; они просто заархивированы, и эта информация о строке / столбце относится к фактической позиции в файле XHTML в EPUB. Что значит epubcheck
сказать?
Этот вид сообщения об ошибке не будет генерироваться проблемами в любом динамическом HTML, созданном с помощью скрипта; это приведет к DOMError
,
Я предполагаю, что iBooks обнаруживает некоторую ошибку в функции во время анализа, которая завершает процесс синтаксического анализа до того, как синтаксический анализ XHTML завершен, и об ошибке XHTML можно сообщить. Однако я не могу представить, в чем может быть ошибка; Я сомневаюсь, что в конце функции пропущена точка с запятой, но, возможно, это зависит от того, что находится на следующей строке.
Абсолютно незначительный момент, но
len = [].slice.call(arguments, 0, 1)[0];
такой же как
len = arguments[0];