2014-04-23 21 views
4

我有一個VB .net應用程序,我試圖與以前的deverlopers代碼集成。 該代碼需要一個郵政編碼並返回商店列表以及其在Google地圖畫布上的位置。vb .net,涉及嚴格模式的javascript問題

該過程很好,只有一個例外。

我收到以下錯誤

JavaScript runtime error: Accessing the 'caller' property of a function or arguments object is not allowed in strict mode.

我已經分離出的罪魁禍首

__doPostBack('userControlSearchResults_results', LatLng); 

內部具有以下

function Sys$WebForms$PageRequestManager$_doPostBack(eventTarget, eventArgument) { 
     var event = window.event; 
     if (!event) { 
      var caller = arguments.callee ? arguments.callee.caller : null; 
      if (caller) { 
       var recursionLimit = 30; 
       while (caller.arguments.callee.caller && --recursionLimit) { 
        caller = caller.arguments.callee.caller; // ERRORS HERE 
       } 
       event = (recursionLimit && caller.arguments.length) ? caller.arguments[0] : null; 
      } 
     } 
    ... 

我的第一個傾向是創建一個窗口。事件,所以它通過if(!event)並繼續前進。 因爲,還有些時候我們在代碼中調用了__doPostback並且它是成功的。

但是由於我的JavaScript是有限的,我要麼做錯了,要麼需要找到一種不同的方法。

我已經搜索了這個問題,很少回來。普遍的迴應是隻評論'嚴格使用';並繼續前進。

問題是,我們拉了很多JavaScript庫,其中許多人現在都設置爲「使用嚴格的」

有沒有人有一個建議,或者對如何解決這個問題的想法?

博客引用了試圖在__doPostback調用之前應用setTimeout()。 但是我不明白這將如何解決任何問題。

編輯:增加了一些代碼。

__doPostBack是下面的JavaScript

function CompleteSearch(returnedLatLng) { 

    if (returnedLatLng != '') { 
     alert("dopostback here2- this is where it breaks"); 
     __doPostBack('ucSearchResults_udpResults', returnedLatLng); 
     if (document.getElementById("sidebar_search")) { document.getElementById("sidebar_search").style.display = "none" }; 
     if (document.getElementById("sidebar_login")) { document.getElementById("sidebar_login").style.display = "none" }; 
     if (document.getElementById("promo1")) { document.getElementById("promo1").style.display = "none" }; 
     document.getElementById("sidebar_results").style.display = "block"; 
     //document.getElementById("sidebar_results").style.display = "none"; 
    } 
    return false; 
} 

內凡爲我的更新面板是一個用戶控件中,看起來像這樣...

<form id="Form1" runat="server"> 
<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
<div id="Container" style="zoom:1" onclick=""> 
    <asp:UpdatePanel runat="server" ID="udpResults" OnLoad="UpdatePanel1_Load"> 
     <ContentTemplate> 
      <asp:HiddenField ID="currentLatLong" runat="server" /> 
      <asp:HiddenField ID="triggerSearch" runat="server" Value="0" /> 
      <asp:HiddenField ID="searchString" runat="server" Value="0" /> 

      <asp:HiddenField ID="locationCode" runat="server" /> 
      <asp:HiddenField ID="locationDesc" runat="server" /> 
      <asp:HiddenField ID="locationPhone" runat="server" /> 
      <asp:HiddenField ID="locationZip" runat="server" /> 

      <asp:HiddenField ID="filterPickup" runat="server" /> 
      <asp:HiddenField ID="filterVirtualKiosk" runat="server" /> 
      <asp:HiddenField ID="filterDelivery" runat="server" /> 
      <asp:HiddenField ID="filterAcceptsCash" runat="server" /> 
      <asp:HiddenField ID="filterKey2Key" runat="server" /> 
      <asp:HiddenField ID="filterHODService" runat="server" /> 

      <asp:Label ID="tblResults" runat="server"></asp:Label> 
     </ContentTemplate> 
    </asp:UpdatePanel> 
</div> 
</form> 

這是否幫助或將更多需要的代碼。 我現在真的被卡住了,不知道該怎麼辦。

+0

我不認爲這個__doPostBack JavaScript代碼是由任何開發人員完成的,我認爲它是ASP引擎生成它的。我認爲你應該發佈ASP代碼,也許這些userControlSearchResults_results功能。 – xavigonza

+0

你是對的,Sys $ Web ...是由引擎生成的。然而,「caller = caller.arguments.callee.caller」行是錯誤的原因。該代碼適用於較舊的經典ASP網站。我正在嘗試與新網站進行整合。我將回顧__doPostBack過程。 –

回答

0

我不認爲這個Sys $ WebForms $ PageRequestManager $ _doPostBack的JavaScript代碼是由任何開發人員完成的,我認爲這是ASP引擎生成它。我想你應該發佈ASP代碼,也許這個userControlSearchResults_results函數的代碼。

關於如何使用__doPostBack有很多帖子。檢查你是否正確使用它。

How to use __doPostBack()

2

此問題時window.event包含null發生。

我發現它只在JavaScript定時器事件中包含null。
也許它在其他一些特殊事件中也包含null。

有2種解決方案。

溶液A:

1 /上的定時器事件:上升等點擊
2 /一個用戶界面元素的事件上,此元素的事件的事件處理程序:調用__doPostBack

還有陷阱。
你可能會認爲你可以創建一個事件對象並在一個元素上觸發它。
這會工作,但window.event仍然會包含null。
看起來很奇怪,但我認爲這是設計。

觸發元素事件的唯一方法是讓window.event包含事件而不是null,即調用此元素的click方法。

溶液B:

如果在UpdatePanel包含的輸入類型=「提交」元件,則不需要調用__doPostBack執行異步回發。
調用這個元素點擊方法已經足夠了。

如果UpdatePanel中不包含輸入提交元素,計時器事件處理程序可以創建一個並使用它:

var btn = document.createElement('INPUT'); 
btn.setAttribute('name', 'timer_dummy_button'); 
btn.setAttribute('type', 'submit'); 
btn.setAttribute('value', 'what you like'); 
btn.setAttribute('style', 'display:none;'); 
document.getElementById('yourNiceLittleUpdatePanelID').appendChild(btn); 
btn.click(); 

在異步回,Page.Request.Form將包含以下項目:

["yourNiceLittleScriptManagerControlID"] = "yourNiceLittleUpdatePanelID|timer_dummy_button" 
["__EVENTTARGET"] = "" 
["__EVENTARGUMENT"] = "" 
["timer_dummy_button"] = "what you like"