Среда 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];
Другие вопросы по тегам