0

我有一个幻灯片 Web 应用程序,对于某些幻灯片,它包括从服务器端与该幻灯片一起呈现的 beforeSlideshowAction,javascript 与该幻灯片的内容一起呈现,因为它是生成此内容的幻灯片模板的一部分。

但是,以下的 javascript 函数不会与我的内容一起更新。例如,如果我要加载幻灯片,然后在这两张幻灯片上切换位置(更新将在幻灯片运行完整周期后由 ajax 完成),下面的 beforeSlideshowAction_slide1() 现在将呈现为 beforeSlideshowAction_slide2( ),但是当被调用时,只会存在一个名为 beforeSlideshowAction_slide1() 的函数,我假设所有 javascript 函数仅在页面初始加载时注册。

我记得通过在包含更新函数的脚本块上调用 eval 再次解决了类似的问题,我的问题是否有不那么骇人听闻的解决方案?

{# comment: from here the document will be updated by Ajax #}
<div id="slideshowbody">

    {# comment: ordernumber is now 1 #}
    <div id="slide{{ ordernumber }}">

        //some content goes here

        <script>
        function beforeSlideshowAction_slide{{ ordernumber }}() {

            //assign appropriate value to videoContent for current slide
            videoContent[{{ ordernumber }}]='video={{ data0 }}&height={{ data1 }}&width={{ data2 }}&codec={{ data3 }}&fullscreen={{ data5 }}';

        }
        </script>

    </div>


    {# comment: ordernumber is now 2 #}
    <div id="slide{{ ordernumber }}">

        //some content goes here

        //slide 2 doesn't have a function for a "beforeSlideshowAction"

    </div>

</div>

不要担心我可能正在调用一个不存在的函数,我在 try/catch 块中执行它,我已经设置它以便为 try/catch 中的每张幻灯片调用一个 beforeSlideshowFunction,并且在幻灯片模板 如果我想要一个函数,我只是在那里定义一个函数,如果不是,我就跳过它。

4

1 回答 1

0

这是我最终解决的方法

<script id="beforeSlideshowAction{{ ordernumber }}_script" type='text/javascript'>

//define the function for later use (page updates)
window.beforeSlideshowAction_slide{{ ordernumber }} = function() {  

    console.log('runnin beforeSlideshowAction for slide {{ ordernumber }}');

    //assign appropriate value to videoContent for current slide
    videoContent[{{ ordernumber }}]='video={{ data0 }}&height={{ data1 }}&width={{ data2 }}&codec={{ data3 }}&fullscreen={{ data5 }}';

}

//run
var x = window['beforeSlideshowAction_slide{{ ordernumber }}'];
x();

</script>

...后来,当这已被 ajax 更改时,slide1 函数可能改为 slide3 函数...

            //replace the innerHTML of body with the new stuff
            document.getElementById('slideshow_body').innerHTML=newContent;


            //update the videoContents and run other beforeSlideshow-actions
            for (var i=1;i<(pauseTimes.length+1);i++)
            { 

                try {
                    console.log('slide '+i+' action...');

                    //set previous version of beforeSlideshowAction i to null
                    window['beforeSlideshowAction_slide'+i] = null;

                    //define it anew (will this run it too?)
                    ie_compatible_eval( document.getElementById('beforeSlideshowAction'+i+'_script').innerHTML )

                }
                catch(e) {
                    console.log('slide '+i+' none');
                    //do nothing since we will not have a function named that for every slide, error is expected
                }

            }
于 2013-01-28T21:06:26.537 回答