【问题标题】:circumvent asp event handlers绕过asp事件处理程序
【发布时间】:2011-05-17 18:15:09
【问题描述】:

我想通过更改 VB.Net 页面中某些 javascript 中“window.location”的值来引起浏览器重定向。当我单击“开始”按钮时,以下代码可以正常工作:出现警报并且浏览器已成功重定向。如果我从文本内部按“输入”,也会发生同样的情况,这不起作用。我确实看到了警报,但浏览器停留在同一页面上。

如果我删除了对 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>

【问题讨论】:

    标签: javascript .net browser redirect enter


    【解决方案1】:

    您的 enter 事件可能被 .Net javascript 内容捕获。通常在这种情况下,我会在工作之前阻止事件的默认行为。我不知道你是否使用 jQuery,但代码会是这样的:

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

    【讨论】:

    • 谢谢,但我实际上并没有使用 jQuery。为这个问题导入整个库感觉就像是在消灭一只蚊子,即使它是一只非常烦人的蚊子 :) 你知道我可以如何使用日常原生 javascript 来做到这一点吗?
    • 双重检查,显然 preventDefault() 是作为 JavaScript 中事件对象的方法实现的——因此您也应该能够在标准 JavaScript 中执行相同的基本操作。 (所以 event.preventdefault() 应该可以工作)。 quirksmode.org/js/events_early.html
    • 啊哈!感谢您的建议。事实证明,preventDefault 没有在 IE 中实现,而是做同样的事情,你设置 window.event.returnValue = false。对于非 IE 浏览器,您可以使用 preventDefault()。我现在应该走在正确的道路上。使用 .Net 时,您似乎越能避免使用 .Net,您的生活就越好!
    【解决方案2】:

    您的 MasterPage 内容中是否有按钮?这听起来不像是 .NET 问题,听起来更像是对 HTML 标准的误解。因为您的所有内容都在单个 &lt;form&gt; 元素内,所以浏览器将根据在您的页面上找到的第一个 &lt;submit&gt; 按钮提交页面。您可以通过将内容分组到 &lt;asp:Panel&gt; 中并将其 DefaultButton 属性设置为提交按钮的 ID 来解决此问题。您还可以设置文本框和按钮的 ValidationGroup 属性来完成相同的操作,但我无法确定这是否适用于这种情况,或者是否只影响验证控件。

    【讨论】:

    • 我一开始在 ASP 面板中确实有这些控件,但是设置 DefaultButton 并提交表单必须导致回发,对吗?当它这样做时,目标页面加载了两次(这比 0 次要好,但仍然不是很好)。
    【解决方案3】:

    您没有将事件传递给事件处理程序。这可能是您的问题的一部分 - 至少在 IE 以外的浏览器中。

    <input id="textOne" onkeypress="goIfEnterPressed(event)"/>
    
    function goIfEnterPressed(e) {
        if (e.keyCode == 13) {
            clickHandler();
        }
    }
    

    另外,你真的想为非输入键返回 false 吗?看起来您正试图取消该活动,但我认为它不会像所写的那样工作。但是,如果它确实有效,您将阻止在文本框中输入任何文本。似乎是一种奇怪的行为。

    【讨论】:

    • 我倾向于先在 IE 上进行测试,然后再在其他浏览器上进行测试。尽管在非 IE 浏览器上不通过,但您是绝对正确的。我现在已经在两个方面都发挥了作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2011-12-16
    • 2019-11-18
    • 1970-01-01
    相关资源
    最近更新 更多