2014-02-18 24 views
0

我在項目中使用Google Navigation圖表。爲什麼javascript indexOf()方法在從C#代碼隱藏中調用時拋出錯誤?

當我在客戶端(.aspx頁面)運行javascript代碼時,一切正常,但是當我將它放在代碼後面並回顯/寫出來(通過Response.Write())時,它會引發錯誤,特別是在JavaScript代碼嘗試調用數組上的indexOf()方法的地方。

我試圖檢查錯誤的原因,但我得到的唯一信息是,這是IE8和早期與indexOf()方法的問題 - 這不能是我的問題,因爲正如我說的那樣很好,當我直接從客戶端調用它時 - 它只是給出了代碼隱藏的問題。

這是特定的錯誤我收到:

0x800a01b6 - 微軟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

必須有一些其他的區別。正如你所說,IE8中沒有Array.indexOf()。 –

+0

什麼是'defaultSeries'?它是一個字符串還是數組?它的典型內容是什麼? –

回答

1

假設defaultSeries是一個數組,你將需要填充工具Array.prototype.indexOf爲IE < 9,只支持對字符串的indexOf。

這裏有一個polyfill from MDN

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」的部分 - 但是,這不可能導致您的問題。

  2. 什麼是可能導致您的問題是JavaScript的時間點擊頁面。當response.write被刷新到客戶端時,對象是否存在?爲了確保在需要頁面時所有需要的位都存在,通常需要使用腳本對象方法來添加腳本,然後在加載頁面後調用代碼。看看這個網頁上動態地添加腳本的頁面:http://msdn.microsoft.com/en-us/library/ms178207(v=vs.100).aspx

0

謝謝大家 - 我已經找到一個可行的soltuion:

如果我創建包含的JavaScript的indexOf(相同的字符串)方法然後將其作爲輸出分配給aspx頁面上的文字元素,或者如果我通過<%>特殊標記「回顯」出來,那麼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; 

客戶端/ aspx頁面:

<asp:Literal ID="txtValueA" runat="server></asp:Literal> 
//OR 
<%=jsHtml %> 

奇怪但卻真實.....爲輸入感謝

相關問題