JavaScript在页面内可以正常工作,但在代码后台无法正常工作。

3
我有一个放置在 MasterPage 中的函数,它会显示一个 mp3 播放器:
<script type="text/javascript">
    $(document).ready(function() {
        var stageW = 500;
        var stageH = 216;
        var cacheBuster = Date.parse(new Date());

        var flashvars = {};
        var params = {};

        params.bgcolor = '#F6F6F6';
        params.allowfullscreen = 'true';


        flashvars.stageW = stageW;
        flashvars.stageH = stageH;

        flashvars.pathToFiles = '';

        flashvars.settingsPath = '../mp3player/mp3player_settings.xml';
        flashvars.xmlPath = '<%# getRestXmlPlayerUrl() %>';

        flashvars.keepSelected = 't';
        flashvars.selectedWindow = '4';
        flashvars.slideshow = 't';

        flashvars.imageWidth = '130';
        flashvars.imageHeight = '130';

        swfobject.embedSWF('swf/preview.swf?t=' + cacheBuster, 'myContent', stageW, stageH, '9.0.124', 'swf/expressInstall.swf', flashvars, params);
    }); 
    </script>

一切运作良好。但是,因为页面上有一些带有更新面板的ajax,当发生ajax请求时,flash不会呈现,所以我需要注册此功能,我尝试了以下内容:

protected void Page_PreRender(object sender, EventArgs e)
    {
    Type cstype = this.GetType();
    String csnameForPlayer = "applyStyleToMp3Player";
        if (!Page.ClientScript.IsClientScriptBlockRegistered(cstype, csnameForPlayer))
        {
            StringBuilder cstextForPlayer = new StringBuilder();
            cstextForPlayer.Append(" $(document).ready(function() { "
    + " var stageW = 500;"
    + " var stageH = 216;"
    + " var cacheBuster = Date.parse(new Date());"

    + " var flashvars = {};"
    + " var params = {};"

    + " params.bgcolor = '#F6F6F6';"
    + " params.allowfullscreen = 'true';"


    + " flashvars.stageW = stageW;"
    + " flashvars.stageH = stageH;"

    + " flashvars.pathToFiles = '';"

    + " flashvars.settingsPath = '../mp3player/mp3player_settings.xml';"
    + " flashvars.xmlPath = '<%# getRestXmlPlayerUrl() %>';"

    + " flashvars.keepSelected = 't';"
    + " flashvars.selectedWindow = '4';"
    + " flashvars.slideshow = 't';"

    + " flashvars.imageWidth = '130';"
    + " flashvars.imageHeight = '130';"

   + " swfobject.embedSWF('swf/preview.swf?t=' + cacheBuster, 'myContent', stageW, stageH, '9.0.124', 'swf/expressInstall.swf', flashvars, params);"
   + "});   ");
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), csnameForPlayer, cstextForPlayer.ToString(), true);
    }
}

很遗憾,这不起作用了。Flash播放器不再出现,因此我认为cstextForPlayer出了问题。

我花了一个多小时来弄清楚,但是我失败了。

有人看到问题了吗?

提前致谢。


请提供我们HTML输出! - user57508
2个回答

3

<%# getRestXmlPlayerUrl() %> 是导致问题的部分。当在 RegisterStartupScript 中使用时,它不会返回任何值,但它将被硬编码。现在,我建议您将此脚本外部化为一个函数,而不是费尽心思地混合 C# 和 javascript,因为使用正确的工具总是更好的:

function embedPlayer(xmlPath) {
    var stageW = 500;
    var stageH = 216;
    var cacheBuster = Date.parse(new Date());

    var flashvars = {};
    var params = {};

    params.bgcolor = '#F6F6F6';
    params.allowfullscreen = 'true';


    flashvars.stageW = stageW;
    flashvars.stageH = stageH;

    flashvars.pathToFiles = '';

    flashvars.settingsPath = '../mp3player/mp3player_settings.xml';
    flashvars.xmlPath = xmlPath;

    flashvars.keepSelected = 't';
    flashvars.selectedWindow = '4';
    flashvars.slideshow = 't';

    flashvars.imageWidth = '130';
    flashvars.imageHeight = '130';

    swfobject.embedSWF('swf/preview.swf?t=' + cacheBuster, 'myContent', stageW, stageH, '9.0.124', 'swf/expressInstall.swf', flashvars, params);
}

这将简化您的服务器端代码,只需调用先前的函数并将xml路径作为参数传递即可:
string csnameForPlayer = "applyStyleToMp3Player";
if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), csnameForPlayer))
{
    var script = string.Format("embedPlayer('{0}');", this.getRestXmlPlayerUrl());
    ScriptManager.RegisterStartupScript(
        this.Page, 
        this.Page.GetType(), 
        csnameForPlayer, 
        script, 
        true
    );
}

1
这不是关于重复代码的问题,在你的情况下,你没有重复任何代码,而是关于拥有适当的代码。例如,当你将JavaScript代码放入js文件中时,你的Web应用程序将自动受益于诸如缓存、gzip压缩等功能。如果你将此放入C#代码中,你的ajax请求将更加沉重且未经优化。 - Darin Dimitrov

2

我对于代码后台并不是很了解,但是这一行代码:

+ " flashvars.xmlPath = '<%# getRestXmlPlayerUrl() %>';"

...看起来可能会有问题。难道不应该是:

+ " flashvars.xmlPath = '" + getRestXmlPlayerUrl() + "';"

...还是什么别的东西?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接