Javascript IE中的Silverlight控件缓存

Javascript IE中的Silverlight控件缓存,javascript,silverlight,internet-explorer,silverlight-5.0,Javascript,Silverlight,Internet Explorer,Silverlight 5.0,大家好,我们有一个silverlight控件托管在一个隐藏的div和height 0px中,当用户单击页面上的按钮时,它会显示在jquery对话框中 对话框的初始显示调用onLoad参数并正确初始化silverlight控件。但是,用户可以选择关闭对话框并隐藏silverlight控件 然后,用户无需重新加载页面即可再次显示此对话框,然而,在IE中,onLoad参数未触发,因此我们的silverlight控件在处理其中的硬件时未正确初始化。然而,在Chrome中,每次显示jquery对话框时都会

大家好,我们有一个silverlight控件托管在一个隐藏的div和height 0px中,当用户单击页面上的按钮时,它会显示在jquery对话框中 对话框的初始显示调用onLoad参数并正确初始化silverlight控件。但是,用户可以选择关闭对话框并隐藏silverlight控件

然后,用户无需重新加载页面即可再次显示此对话框,然而,在IE中,onLoad参数未触发,因此我们的silverlight控件在处理其中的硬件时未正确初始化。然而,在Chrome中,每次显示jquery对话框时都会触发onLoad参数

两种截然不同的行为。我无法从dom中删除隐藏的div,因为可能再次需要它

是否有强制重新加载silverlight控件的解决方案,以便每次使用jquery对话框显示控件时都触发param onLoad

短暂性脑缺血发作
安德鲁

我不确定我有什么总体想法。提高超负荷绝对不是件好事。 但让我提出上述解决方案

在JS和silverlight中注册通信objectsaka函数。因此,您将能够与JS->Silverlight进行通信

<script type="text/javascript">
    function updateSilverlight() {
        // call silverlight control method
        var control = document.getElementById("silverlightControl");
        control.Content.Page.SomeMethod("someData');
    } 
</script>
在SomePage中注释适当的方法

  [ScriptableMember]
        public void SomeMethod(string somedata)
        {
            var data = somedata;
        }
其中数据是您的重新初始化参数


希望有帮助

下面是打开包含silverlight控件的对话框的代码

$('#ReadCard').on('click', function (e) {

    $('#silverlightControlHost').height('300');

    e.preventDefault();

    //show the read card dialog
    $("#readCardDialog").dialog({
        autoOpen: true,
        height: 390,
        width: 550,
        modal: true,
        resizable: false,
        buttons: {
            'Close': function () {
                Call_SL_OnBeforeUnload();
                $(this).dialog("close");
            }
        }
    });
});
加载silverlight控件时,有一个对SilverlightInitialization的方法调用:

    function onSilverlightLoad(sender, eventargs) {
    .....
    pluginElem.Content.SR_SMT.SilverlightInitialisation(inputArray);
     }
由可选的silverlight参数调用:

  <param name="onload" value="onSilverlightLoad" />
但是,当在IE中再次显示对话框时,除非用户刷新页面,否则永远不会调用SilverlightInitialization方法

解决方法是将方法OnLoad更改为silverlight控件,该控件在对话框打开时始终被调用,但检查标志hasload以查看它之前是否已加载:

银光

[ScriptableMember]
    public string OnLoad()
    {
        string retVal = G4T.SilverlightBadge.Resources.ResourcesFile.Present_Card;

        if (_badgeReadCtrl != null && hasLoaded)
        {
            if (!_badgeReadCtrl.Initialise())
            {
                retVal = "Failed to initialise reader device";
            }
        }

        return retVal;
    }
添加了OnFirstLoad方法,该方法在silverlight控件首次加载时调用,并相应地设置了标志

[ScriptableMember]
    public string OnFirstLoad()
    {
        string retVal = G4T.SilverlightBadge.Resources.ResourcesFile.Present_Card;

        if (_badgeReadCtrl != null)
        {
            if (!_badgeReadCtrl.Initialise())
            {
                retVal = "Failed to initialise reader device";
            }
        }
        hasLoaded = true;
        return retVal;
    }
Javascript

 open: function (event, ui) {
            try {
                var plugin = document.getElementById('SilverlightMainControl');
                if (plugin) {
                    plugin.Content.SR_SMT.OnLoad();
                }
            }
            catch(e){}
        },
正如我上面所说的,这在Chrome中始终有效,没有修改,但在IE中,初始化从未被多次调用


希望所有这些都有意义-但我必须记录它以备将来参考

是的,设置相当复杂。但是,设法找到一个答案,我将在下面添加“技术感知”中的“它很好”。这只是另一种方法,可以做到这一点,并将肯定的工作。此外,您可能会发现关于onLoad的对话很有用
[ScriptableMember]
    public string OnFirstLoad()
    {
        string retVal = G4T.SilverlightBadge.Resources.ResourcesFile.Present_Card;

        if (_badgeReadCtrl != null)
        {
            if (!_badgeReadCtrl.Initialise())
            {
                retVal = "Failed to initialise reader device";
            }
        }
        hasLoaded = true;
        return retVal;
    }
 open: function (event, ui) {
            try {
                var plugin = document.getElementById('SilverlightMainControl');
                if (plugin) {
                    plugin.Content.SR_SMT.OnLoad();
                }
            }
            catch(e){}
        },