我在项目中使用Google导航图表。
当我在客户端(.aspx页面)运行javascript代码时,一切正常,但当我把它放在后面的代码中并回显/写出来(通过Response.Write())时会抛出错误,特别是在javascript代码试图调用数组上的indexOf()方法时。
我试图检查错误的原因,但我得到的唯一信息是这是IE8中的一个问题,早期使用indexOf()方法 - 这不是我的问题,因为我说它工作正常当我直接从客户端调用它时 - 它只是从代码隐藏中产生问题。
这是我收到的具体错误:
0x800a01b6 - Microsoft JScript运行时错误:对象不支持属性或方法'indexOf'
这样可以正常工作(在客户端):
for (var i = 0; i < data.getNumberOfColumns() ; i++) {
if (i == 0 || defaultSeries.indexOf(i) > -1) {
// if the column is the domain column or in the default list, display the series
columns.push(i);
}
....
但这会抛出错误(在代码隐藏中):
htmlJS += "for (var i = 0; i < data.getNumberOfColumns() ; i++) {";
htmlJS += "if (i == 0 || defaultSeries.indexOf(i) > -1) {";
// if the column is the domain column or in the default li";st, display the series
htmlJS += "columns.push(i);";
htmlJS += "}";
....
Response.Write(htmlJS);
有谁知道为什么这个错误只发生在代码隐藏中?
答案 0 :(得分:1)
假设defaultSeries
是一个数组,将需要为IE&lt; 9填充Array.prototype.indexOf
,它只支持字符串上的indexOf。
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement, fromIndex) {
if ( this === undefined || this === null ) {
throw new TypeError( '"this" is null or not defined' );
}
var length = this.length >>> 0; // Hack to convert object.length to a UInt32
fromIndex = +fromIndex || 0;
if (Math.abs(fromIndex) === Infinity) {
fromIndex = 0;
}
if (fromIndex < 0) {
fromIndex += length;
if (fromIndex < 0) {
fromIndex = 0;
}
}
for (;fromIndex < length; fromIndex++) {
if (this[fromIndex] === searchElement) {
return fromIndex;
}
}
return -1;
};
}
答案 1 :(得分:1)
两件事:
根据您的代码,您可能会遇到javascript的空白问题 - 您正在连接字符串,因此,例如,您将有一个看起来像“{if”的部分 - 但是,这不太可能导致您的问题。
可能导致您出现问题的是javascript点击页面的时间。当response.write被刷新到客户端时,对象是否存在?为了确保在需要时存在页面的所有必需位,通常需要使用脚本对象方法添加脚本,然后在加载页面后调用代码。查看此页面,将动态脚本动态添加到页面:http://msdn.microsoft.com/en-us/library/ms178207(v=vs.100).aspx
答案 2 :(得分:0)
谢谢大家 - 我找到了一个有效的解决方案:
如果我创建包含javascript indexOf()方法的相同字符串,然后将其作为输出分配给aspx页面上的文字元素,或者如果我通过&lt; %%&gt;“回显”它。特殊标签然后javascript代码将运行良好。
以下运行:
代码隐藏:
public string jsHtml ="";
jsHtml +="<script type='text/javascript'>";
jsHtml+="var defaultSeries = [1,2,3];";
jsHtml+="alert(defaultSeries.indexOf(2));";
jsHtml+="</script>";
txtValueA.Text = jsHtml;
Client / aspx页面:
<asp:Literal ID="txtValueA" runat="server></asp:Literal>
//OR
<%=jsHtml %>
奇怪但真实.....感谢输入