ScriptManager.RegisterStartupScript保持多次添加脚本块
ScriptManager.RegisterStartupScript Keeps adding script blocks multiple times
我有一个带有定时器控制的更新面板,可以每隔一分钟左右自动检查一些数据更新
如果它看到数据更新,则设置为使用序列化的JSON数据调用本地脚本。
ScriptManager.RegisterStartupScript(UpdateField, GetType(HiddenField), ACTION_CheckHistoryVersion, "updateData(" & data & ");", True)
"数据"可能看起来像
{
"someProperty":"foo",
"someOtherProperty":"bar",
"someList":[
{"prop1":"value"},
{"prop2":"value"}, ...
],
"someOtherList":[{},...,{}]
}
"数据"可能会变得相当大,有时只有少数项目发生变化。
我遇到的问题是这样的。每次我将其发送回客户端时,它都会被添加为一个全新的脚本块,而现有的块不会被删除或替换。
输出看起来像这样:
<script type="text/javascript">
updateData({
"someProperty":"foo",
"someOtherProperty":"bar",
"someList":[
{"prop1":"value"},
{"prop2":"value"}, ...
],
"someOtherList":[{},...,{}]
});
</script>
<script type="text/javascript">
updateData({
"someProperty":"foo",
"someOtherProperty":"bar",
"someList":[
{"prop1":"changed"},
{"prop2":"val"}, ...
],
"someOtherList":[{},...,{}]
});
</script>
<script type="text/javascript">
updateData({
"someProperty":"foos",
"someOtherProperty":"ball",
"someList":[
{"prop1":"changed"},
{"prop2":"val"}, ...
]
});
</script>
每次数据发生变化时都会创建一个新的脚本块。
随着时间的推移,如果我们继续添加这些数据,浏览器上积累的数据量可能会变得巨大,我无法想象大多数人的浏览器会如何处理,但我认为这不太好。
有人知道是否有办法只替换已经发送回浏览器的代码,而不是像这样不断添加它吗?
我想出了一个似乎适合我的破解方法。
我使用jQuery来查找我正在创建的脚本标记,并在调用后将其删除。
这里有一个例子:
首先我生成一个guid:
Dim guidText as string = GUID.NewGuid().ToString()
我创建了一个如下的函数:
function RemoveThisScript(guid){
$("script").each(function(){
var _this = $(this);
if(_this.html().indexOf(guid)>-1)
_this.remove();
});
}
然后,我将以下代码添加到我的输出字符串中:
... & " RemoveThisScript('" & guidText & "');"
这导致jQuery在页面上的所有脚本中查找具有GUID的脚本(本质上是调用函数的脚本),并将其从DOM中删除。
我建议将web服务与一些您将在window.setInterval内调用的web方法一起使用。在web方法的成功处理程序中(在客户端),您可以只接受响应并用它做任何您想做的事情。它不会保存在您的页面中(好吧,如果您做错了所有事情)。好处是,您可以最大限度地减少请求大小(更新面板将传递所有视图状态数据,这些数据可能足够大),并限制服务器资源的使用(更新面板会导致整个页面的实时循环,假设有轻微修改,但无论如何-所有这些page_load、page_init等…),使用web服务,您将只需要您需要的内容。
这里有一篇文章,您可以看到如何在客户端创建和使用它。看起来已经足够好了。
- ScriptManager.RegisterStartupScript保持多次添加脚本块
- 如何在 JavaScript 中的 HTML head 标记中动态添加脚本值
- 添加脚本包括一个顶点:组件
- 如何在正文元素之前添加脚本
- 如何使用 javascript 添加脚本代码
- 如何使用javascript在子窗口中添加脚本文件
- 在 CakePHP 中,现在 View->addScript() 已被弃用,我如何向我的布局添加脚本*一次*
- 在页面加载 c# 上添加脚本
- 如何在 iframe for jQuery 中添加脚本元素
- 如何在 PHPBB3 Teamplate 中动态添加 <脚本> 标签
- 在页面 JavaScript 中动态添加脚本
- 如何从HTML字符串动态添加脚本到网页
- Javascript性能-使用$.getScript()添加脚本
- 动态添加脚本时未定义$/jQuery
- Google+Business帐户,添加脚本以自动将同事添加到新用户的同事圈中
- 添加<脚本>元素时,CSS 翻译过渡停止工作
- 不能在header中添加脚本
- 在window.onload后添加脚本src
- 添加脚本路径到xslt文件
- 如何在html文件中添加脚本标签,在jquery.js被包含之后,但在结束正文标签之前只使用javascript