2013-06-25 5 views
3

Итак, я сузил свою ошибку (ну, по крайней мере, первый) эту функцию:JavaScript интерактивной книги Окружающей среда - недопустимое имя элемента

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).

Любые идеи, которые могут вызывать проблему?

EDIT: По прихоти, я проверил, была ли проблема [], изменив ее на Array(). Не повезло.

ответ

4

Итак, я обнаружил решение моей проблемы. Мне просто нужно, чтобы окружить мой 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, который решил это. Затем я нашел this stackoverflow вопрос, который в основном говорит, что это необходимо, когда ваши страницы должны интерпретироваться как XML/XHTML, а также, что относится к ePubs.

Итак, мораль истории - это обертывание javascript в тегах CDATA для ePubs или iBooks.

EDIT: Следует отметить, что стоит сделать это около всего вашего JavaScript. Проблема в моем случае была < меньше, чем оператор, интерпретируемый как начало тега. Тем не менее, вероятно, чище просто включить тег CDATA вокруг всего вашего JavaScript, а не пытаться изолировать источники проблемы.

EDIT 2: В интересах агрегирования информации тому, кто находит этот ответ полезным, следует также отметить, что, вероятно, также работает работа со всем своим JavaScript во внешних файлах (согласно источнику, связанному в ответе на вопрос I связанный с). Я не хочу проверять это на данный момент, но он должен работать, потому что внешний JavaScript не будет анализироваться как XML, как внутри тега <script>.

+1

Ввод вашего JS во внешние файлы будет не только «вероятно, тоже работает», это настоятельно рекомендуется. –

+1

+1. lol Я обещаю, что я делаю это для нормального веб-разработки. :) Я просто хотел получить быстрое доказательство концепции, не имея дело с манифестом, пока я учился тому, как были структурированы ePubs. – Logan

0

Звучит для меня скорее как ошибка XHTML. Когда вы запустите браузер, если вы не открываете его как файл XHTML, сделайте это и посмотрите, не сломается ли он. Браузеры, как правило, более мягкие, чем читатели EPUB. Скорее всего, вы создаете какой-то недействительный HTML-элемент с вашими фрагментами, было бы здорово, чтобы полная страница точно идентифицировала, что возвращает getArray() ...

+0

'genArray' возвращает массив с размерами аргументов. т.е. 'genArray (64,64)' возвращает массив 64x64. Таким образом, эта функция фактически не возвращает «элемент». И я согласен, что это больше похоже на ошибку XHTML, но удаление этого объявления функции (даже если оно не вызвано) исправляет ошибку. К сожалению, мне нужна эта функция. – Logan

0

Сообщаемая вами ошибка указывает файл XHTML источник является ошибкой. Я бы посмотрел на колонку 23 строки 71 файла XHTML, о которой идет речь. Что там? Может ли это быть <StartTag>? Является ли XHTML генерируемым программным образом каким-то образом? EPUB не компилируются; они просто заархивированы, и эта информация о строках/столбцах относится к фактической позиции в файле XHTML в EPUB. Что говорит epubcheck?

Такое сообщение об ошибке будет не быть вызвано проблемами в любом динамическом HTML, созданном с помощью скрипта; это приведет к DOMError.

Я полагаю, что iBooks обнаруживает некоторую ошибку в функции во время разбора, что завершает процесс синтаксического анализа до завершения синтаксического анализа XHTML и сообщения об ошибке XHTML. Однако я не могу представить, что может быть ошибкой; Я сомневаюсь, что это недостающая точка с запятой в конце функции, но может быть в зависимости от того, что находится на следующей строке.

Полностью Мелочь, но

len = [].slice.call(arguments, 0, 1)[0]; 

такого же, как

len = arguments[0]; 
+0

Справа. Я немного позаботился о форматах ePub и узнал о том, что они являются почтовыми индексами. Это просто (по какой-то странной причине) мне никогда не приходило в голову, чтобы открыть файл и посмотреть, на какой строке он ссылался. Однако это было не очень полезно. 'for (i = 0; i Logan