javascript setTimeout перестает работать после включения createElement

Я пытаюсь добавить новое слайд-шоу на свой сайт. В слайд-шоу есть все, что мне нужно, кроме опции «height = «80%»», т.е. я хочу, чтобы слайд-шоу масштабировалось с помощью браузера, потому что новый дизайн сайта будет похож на приложение для Android; полное погружение.

Поскольку само слайд-шоу не имеет этой опции, я создаю код javascript, который будет проверять размер окна документа/браузера каждые 2 секунды и перезагружать/изменять размер самого слайд-шоу, чтобы оно всегда соответствовало размеру экрана. Но проблема в том, что javascript запускается только один раз, загружается и не вызывает «setTimeout» после того, как я вставлю в скрипт определенную строку кода.

Итак, проблема в том, что setTimeout на самом деле перестает работать, поэтому он работал раньше, после того как я включил эту строку кода:

var thescript = document.createElement("script");
thescript.type = "text/javascript";
thescript.innerHTML="jQuery.flashgallery('gallery/ArtGallery.swf', 'gallery/gallery.xml', {width: '100%', height: '"+calcheight+"px', background: '#000000'});";
document.getElementById('galleryid').appendChild(thescript);

Полная функция проверки javascript находится здесь:

function getDocSpecs() {

    clearTimeout(t);
    var D = Math.max(
        Math.max(document.body.scrollHeight, document.documentElement.scrollHeight),
        Math.max(document.body.offsetHeight, document.documentElement.offsetHeight),
        Math.max(document.body.clientHeight, document.documentElement.clientHeight));

    var Le = Math.max(
        Math.max(document.body.scrollWidth, document.documentElement.scrollWidth),
        Math.max(document.body.offsetWidth, document.documentElement.offsetWidth),
        Math.max(document.body.clientWidth, document.documentElement.clientWidth));

    calcheight = (0.80 * D);
    alert(preheight + "_" + prewidth + "_" + D + "_" + Le + "_");
    if (preheight != D || prewidth != Le) {

        var thescript = document.createElement("script");
        thescript.type = "text/javascript";
        thescript.innerHTML = "jQuery.flashgallery('gallery/ArtGallery.swf', 'gallery/gallery.xml', {width: '100%', height: '" + calcheight + "px', background: '#000000'});";
        document.getElementById('galleryid').appendChild(thescript);
    }


    preheight = D;
    prewidth = Le;

    t = setTimeout('getDocSpecs()', 2000);
}

Эти двое, кажется, не любят друг друга:

var thescript = document.createElement("script");
thescript.type = "text/javascript";
thescript.innerHTML="jQuery.flashgallery('gallery/ArtGallery.swf', 'gallery/gallery.xml', {width: '100%', height: '"+calcheight+"px', background: '#000000'});";
document.getElementById('galleryid').appendChild(thescript);

а также

t = setTimeout('getDocSpecs()', 2000);

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


person Marc Brown    schedule 30.04.2013    source источник
comment
Как вы думаете, зачем нужно создавать элемент <script>, добавлять к нему код и куда-то добавлять? Просто выполните код.   -  person Ian    schedule 30.04.2013
comment
..святая корова..., я не знаю, с чего начать...   -  person jAndy    schedule 30.04.2013
comment
Вместо тайм-аута, почему бы вам не использовать интервал? Или событие лучше, почему бы не window.onresize? Просто добавьте газ, чтобы он не звонил тысячу раз.   -  person Karl-André Gagnon    schedule 30.04.2013
comment
Проблема сохраняется, если вы не передаете строку для оценки window.setTimeout, а передаете саму функцию; window.setTimeout(getDocSpecs, 2000);?   -  person Paul S.    schedule 30.04.2013
comment
Почему бы вам не заменить свой первый фрагмент на jQuery.flashgallery('gallery/ArtGallery.swf', 'gallery/gallery.xml', {width: '100%', height: calcheight+'px', background: '#000000'});?   -  person Kevin B    schedule 30.04.2013


Ответы (1)


Они не должны влиять друг на друга, но в то же время вам не нужно использовать createElement для того, что вы пытаетесь сделать.

Я немного привел его в порядок, разделил биты на понятные функции и удалил createElement части. Надеюсь, теперь вам будет легче выполнять отладку. Однако в остальном я пытался сохранить поведение таким же.
Как упоминалось в комментариях, вы также можете перейти на использование прослушивателя событий для resize, что избавит функцию от необходимости звонил так часто.

var getDocSpecs = (function () {
    var t,
        pre = {h: -1, w: -1},
        getDocSpecs;

    function asyncFlashGallery(p1, p2, p3) {
        return window.setTimeout(function () {jQuery.flashgallery(p1, p2, p3)}, 0);
    }

    function dMax(nx) {
        return Math.max(document.body[nx] || 0, document.documentElement[nx] || 0);
    }

    getDocSpecs = function getDocSpecs() {
        window.clearTimeout(t);
        var D = Math.max(
                dMax('scrollHeight'), dMax('offsetHeight'), dMax('clientHeight')
            ),
            Le = Math.max(
                dMax('scrollWidth'), dMax('offsetWidth'), dMax('clientWidth')
            ),
            calcheight = (0.80 * D);

        alert(pre.h + "_" + pre.w + "_" + D + "_" + Le + "_"); // consider console.log
        if (pre.h !== D || pre.w !== Le) {
            asyncFlashGallery(
                'gallery/ArtGallery.swf',
                'gallery/gallery.xml',
                "{width: '100%', height: '" + calcheight + "px', background: '#000000'}"
            );
        }

        pre.h = D;
        pre.w = Le;

        t = window.setTimeout(getDocSpecs, 2000);
    };
    getDocSpecs.CANCEL = function () {window.clearTimeout(t);}
    return getDocSpecs;
}());
person Paul S.    schedule 30.04.2013
comment
Как вы сказали, они не должны влиять друг на друга. Я переключился на другое средство для создания слайд-шоу, и теперь скрипт работает нормально. Причина, по которой вы получаете правильный ответ, заключается в том, что вы предоставили какое-то решение; они не должны влиять друг на друга. Это приведет к тому, что другие люди с той же проблемой просто попробуют другой создатель слайд-шоу. - person Marc Brown; 04.05.2013