IE下form.action不能提交表单(用于动态转到地址)

一个网页里时常会写多个提交按钮,可以点击不同按钮时分别设置某个隐藏域的值,都是提交到同一个页面,然后在处理页面可以知道应如何区别对待。也可能各自的 onclick 事件中改变 form 的 action 属性指向不同的处理页面后提交表章。在处理表单页面逻辑复杂且无多少相关性的时候,我会选择后一种处理方式。

可以今天碰到一个事情,在点击某个提交按钮,欲用(假设 form 的 id 为 'post')

document.getElementById('post').action='http://unmi.cc/some'

改变 form 的 action 属性时,提示:

---------------------------
Error
---------------------------
A Runtime Error has occurred.
Do you wish to Debug?

Line: 14
Error: Object doesn't support this property or method
---------------------------
Yes   No  
---------------------------

这在以前都是无可厚非的呀,怎么这次却掉了链,再次换着 jQuery 的方式,$('#post').attr('action',http://unmi.cc/some),也是一样的错误。可是在 FireFox 里是没问题的,可以成功换掉 form 的 action 属性,提交到不同的处理页。

不能设置,那取 form 的 action 值又该为何呢?用

 alert(document.getElementById('post').action) //看到的是一个 object,不是 form 的 action 字符串值吗?

用 jQuery 的办法,alert($('#post').attr('action')), 能够得到 form 预期的 action 属性值,jQuery 果然强大。

在网上查查相关的问题,并结合为何 document.getElementById('post').action 为何会是个 object 这样一个事实,果然在 form 中还暗藏了一个名为 action 的表单域,整个 <form> 元素取出来是这样子的:

1
2
3
< form id = "post" action = "<a href=" http://unmi.cc">http://unmi.cc</ a >">
     < input type = "hidden" name = "action" value = "Save" />
</ form >

就是这个名为 action 的隐藏域搅的局。还记得更早的时候访问表单域是怎么访问的吗?就是用 document.forms[0].fieldName,是的正好 form 中间有一个 name="action" 的隐藏域,所以 document.getElementById('post').action 返回的不是 form 的 action 属性,而是直接指向到 name="action" 的那个隐藏域去了,这也是为什么它会是个 object。

认清了这个,该如何规避这种问题呢,其一可以不在 form 中放置名为 action 的表单域就不会出现混淆了。可如果 name="action" 的那个表单域非要不可(例如作为特定框架约定的),则必须找到一种办法能咬定住是 form 的 action 属性,还不是 form  下的那个名为 action 元素,就必须用下面几行代码来访问或设置 form 的 action 属性值:

1
2
3
4
5
6
  //jQuery 的话可以用注释中的代码
  document.getElementById( 'post' ).attributes[ 'action' ].value= 'http://unmi.cc/another' ;
  //$('#post').attributes['action'].value='http://unmi.cc/another';
  alert(document.getElementById( 'post' ).attributes[ 'action' ].value);
  //alert($('#post').attr('action'));
  //alert($('#post').attr('attributes')['action'].value)

不得不 attributes['action'].value 一下。jQuery  在这里表现的有点暧昧,既然是可以用 $('#post').attr('action') 取到 form 的 action 属性值,为何不让人直接用 $('#post').attr('action','http://unmi.cc/another') 来进行赋值呢?

如果 form 中有名为 action 的表单域,在其他浏览器,我 FireFox 3.6.8,Opera 10.61,Chrome 5.0, Safari 5.0.1 上测试后是发现不用对 form 的 action 属性特别对待,依常理用:

1
2
3
4
5
document.getElementById( 'post' ).action= 'http://unmi.cc/another' ;
//或
$( '#post' ).attr( 'action' )= 'http://unmi.cc/another' ;
//或
$( '#post' ).get(0).action= 'http://unmi.cc/another' ;

统一操作便可,就是 IE 有区别的,所以保险的代码必须用 form.attributes['action'].value 来处理。

还以为这是在 IE 上的通病,回到家里的 IE 8 中却发现在 IE 8 中已经与其他浏览器统一了行为,有问题的浏览器是 IE 7,估计 IE 6 也是走不掉的,所以安全的代码还得写成 form.attributes['action'].value = 'http://unmi.cc/another'。当然,如果你十分的确定在 form 中不可能出现 name='action' 的表单域的话,那就用 form.action='http://unmi.cc/another' 也无妨。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现form表单提交不跳转页面并刷新,可以使用Ajax技术。具体步骤如下: 1. 给form表单添加一个id属性,方便在JavaScript中使用。 2. 使用JavaScript获取form表单元素和提交按钮元素。 3. 给提交按钮元素添加一个click事件监听函数,在函数中使用Ajax发送请求。 4. 在Ajax成功的回调函数中,根据后端返回的数据进行相应的操作,比如更新页面中的数据等。 下面是一个示例代码: HTML代码: ```html <form id="my-form" action="submit.php" method="post"> <input type="text" name="name"> <input type="submit" value="提交"> </form> ``` JavaScript代码: ```javascript var form = document.getElementById('my-form'); var submitBtn = form.querySelector('input[type="submit"]'); submitBtn.addEventListener('click', function(e) { e.preventDefault(); // 阻止默认的提交行为 var xhr = new XMLHttpRequest(); xhr.open('POST', form.action, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { // 后端返回的数据 var data = xhr.responseText; // 对数据进行相应的操作 // ... } }; xhr.send(new FormData(form)); }); ``` 其中,FormData对象用于form表单中的数据打包成一个键值对的对象,方便发送给后端。另外,需要注意的是,这里使用了XMLHttpRequest对象进行Ajax请求,如果需要兼容老版本的IE浏览器,需要使用ActiveXObject对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值