【问题标题】:Jquery 1.4.2 Form submit event handler is firing after form submit in IE 7/8Jquery 1.4.2 表单提交事件处理程序在 IE 7/8 中的表单提交后触发
【发布时间】:2012-10-02 15:33:49
【问题描述】:

我在表单提交事件处理程序中遇到问题。这是我的代码 我正在使用 Jquery 1.4.2

<FORM id="mysearchform" method="get" action="http://www.abc.com/results.aspx?q=" target=_blank sizcache="1694" sizset="0" jQuery1347023310528="3">

<DIV class="search">
<span><span>
<LABEL class=hide for=q>Search:</LABEL>
<INPUT accessKey=S id="a" class="abc" name="a" maxLength="50" value="Images" size=69 type="search" autocomplete="off" selectionStart="0" jQuery1347023310528="108">
<INPUT style="WIDTH: 185px; HEIGHT: 33px" class="img" title="Search" alt="Search" value="Search" src="http://dummyimage.com/180x35" type=image>
<INPUT name="form" value="abcd" type="hidden"></SPAN></SPAN></DIV>
</FORM>

我有一个用于 mysearchform 的事件处理程序,用于更改表单输入元素的值和 id 为“a”的文本框的值,以便在提交表单时我可以更改文本框的值,即(添加附加值)

$("#mysearchform").submit(mysubmitHandler);

在 mysubmitHandler 中,我正在更改“a”和表单输入元素的值。此代码在 IE9、FF 4.0 和最新版本的 chrome 中运行良好。但是在 IE 7 和 IE8 中,在进入“mysubmitHandler”之前,新窗口正在打开(我在新窗口中显示搜索结果)。所以我的更改没有附加到搜索窗口上的查询字符串。

在其他浏览器中,“mysubmitHandler”首先触发,然后新窗口打开。

【问题讨论】:

  • 你能发布你的jQuery代码吗?
  • var searchForm=$("#mysearchform"); searchForm.submit(onSubmit);函数 onSubmit() { var $formElement=$("input[name=form]",$(this)); $formElement.attr("value",($("​​#a").val() +"search"));但是这段代码并不重要,因为它是在表单提交之后调用的。这么说,这意味着在选项卡中打开了新页面,然后我的处理程序被调用,这并没有反映我的更改。
  • jQuery 1.4.2,复古风格....
  • 我不是在谈论复古风格。如果您的问题是哪个版本,那么我使用的是 1.4.2 min js
  • 我只是在评论您使用的 jquery 版本,它很旧或“复古”

标签: jquery internet-explorer


【解决方案1】:

我确实重现了这个问题。这是我的设置解决问题的原因:

(在代码中注释了我更改的内容)

// Wrapped everything in jquery onready event function $(function() { }) 
$(function() {
    var $searchForm = $("#mysearchform");

    function onSubmit() {
        var $formElement = $("input[name=form]", $(this));
        $formElement.attr("value", ($("#a").val() + "search"));
    }

    // Put the handler *after* the function definition
    $searchForm.submit(onSubmit);
});

【讨论】:

  • 我试过了,但它对我不起作用。我有 4 个附加到该表单的事件处理程序做不同的工作。所有处理程序都在触发,但在打开新标签后。我不能将所有处理程序都放在声明之上。是否有任何特定原因它不能仅在 IE 8 和 7 中工作。在 IE 9 和其他最新浏览器中运行良好
  • 为什么不能事先声明处理函数?为了测试您的代码,我使用了这个小提琴:jsfiddle.net/3VvEk,它在 IE7 中不起作用,就像您的描述一样,如果您单击 JSLint,它也不会验证,因为未定义 onSubmit。只需在声明之后放置事件处理代码,即可使 jsfiddle 验证,并且,它在 IE7 中工作