2011-05-17 68 views
1

我想通過在VB.Net頁面中更改某些javascript中的「window.location」的值來導致瀏覽器重定向。當我點擊「Go」按鈕時,以下代碼正常工作:警報出現,瀏覽器成功重定向。如果我按下從文本框內輸入的內容,盒子就不起作用。我看到警報,但瀏覽器保持在同一頁面上。繞過asp事件處理程序

如果我刪除對ASP主頁面的引用,「輸入」功能開始工作,所以也許在那裏處理按鍵事件並殺死重定向指令?

順便說一句,我最初是在使用.Net組件進行「正常」操作,並在點擊提交按鈕時進行回發。但奇怪地導致目標頁面加載兩次,導致頁面閃爍並且通常效率低下。無論如何,我沒有看到任何理由涉及到.Net的開銷,所以我希望通過直接的客戶端腳本來實現。

有誰知道我怎麼能得到「輸入」鍵功能工作,儘管.net干擾?還是我吠叫錯了樹,應該回到常規的.Net回傳?

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> 

<script type="text/javascript"> 
    function clickHandler() { 
    var dropdown = document.getElementById("dropdown"); 
    var entityID = document.getElementById("textOne").value; 
    var destination = dropdown.options(dropdown.selectedIndex).value + entityID; 
    alert(destination); 
    location = destination; 
    } 

    function goIfEnterPressed() { 
    if ((event.which && event.which != 13) || (event.keyCode && event.keyCode != 13)) { 
     return false; 
    } 
    clickHandler(); 
    } 

</script> 
</asp:Content> 
<asp:Content ContentPlaceHolderID="ContentPlaceHolder2" runat="server"> 
    <select id="dropdown"> 
    <option value="Page1.aspx?typeOneID=">One</option> 
    <option value="Page2.aspx?typeTwoID=">Two</option> 
    <option value="Page3.aspx?typeThreeID=">Three</option> 
    </select> 
    <br /> 
    <input id="textOne" onkeypress="goIfEnterPressed()"/> 
    <br /> 
    <input type="button" value="Go" onclick="clickHandler()" /> 
</asp:Content> 

回答

0

你的輸入事件可能會被.NET的東西抓住。通常在這種情況下,我會在開始工作之前阻止事件的默認行爲。我不知道你是否使用jQuery,但代碼會是這樣的:

$('#buttonid').keydown(function(e) { 
    if (e.keyCode == 13) { 
     e.preventDefault(); 
     //do whatever you want here. 
    } 
    }); 
+0

謝謝,但我實際上不使用jQuery。爲這個問題導入整個庫會感覺像是蚊子,即使它是一個非常惱人的蚊子:)你有一個想法,我怎麼可以用日常原生javascript來做到這一點? – nttaylor 2011-05-17 18:24:56

+0

Double checked,顯然preventDefault()是作爲JavaScript中事件對象的一種方法實現的 - 所以你應該能夠在標準javascript中做同樣的基本事情。 (所以event.preventdefault()應該工作)。 http://www.quirksmode.org/js/events_early.html – Streklin 2011-05-17 18:27:42

+0

啊哈!感謝您的建議。事實證明,preventDefault並未在IE中實現,但要做同樣的事情你設置window.event.returnValue = false。對於非IE瀏覽器,您可以使用preventDefault()。我現在應該走在正確的道路上。看起來,使用.Net的時候,你可以避免使用.Net,因爲你越好越好! – nttaylor 2011-05-17 18:47:42

0

是否有一個按鈕在您的母版頁內容的某處?這聽起來不像是.NET的問題,聽起來更像是對HTML標準的誤解。由於您的所有內容都位於單個<form>元素內,因此瀏覽器將根據它在頁面上找到的第一個<submit>按鈕提交頁面。您可以通過將您的內容分組到<asp:Panel>並將其DefaultButton屬性設置爲您的提交按鈕的ID來解決此問題。您也可以設置文本框和按鈕的ValidationGroup屬性來完成同樣的事情,但我不確定這種情況是否可行,或者隻影響驗證控件。

+0

我確實在ASP面板中有這些控件,但是設置'DefaultButton'並提交表單必須導致回發,對嗎?而當它這樣做的目標網頁加載兩次(這比0次,但仍然不是很好)。 – nttaylor 2011-05-17 18:50:41

0

您沒有將事件傳遞到事件處理函數中。這可能是你的問題的一部分 - 至少在IE以外的瀏覽器中。

<input id="textOne" onkeypress="goIfEnterPressed(event)"/> 

function goIfEnterPressed(e) { 
    if (e.keyCode == 13) { 
     clickHandler(); 
    } 
} 

此外,你是否真的想返回false爲非輸入鍵?看起來你想取消這個活動,但我認爲它不會像寫作一樣。但是,如果它確實起作用,那麼您將防止將任何文本輸入到文本框中。看起來像一個奇怪的行爲。

+0

我傾向於先在IE上進行測試,然後在其他瀏覽器上進行測試之前先完成測試。你絕對是對的,即使在非IE瀏覽器上也沒有通過。我現在已經在兩條戰線上工作了。 – nttaylor 2011-05-17 19:43:58