当前位置: 首页 > 图文教程 > 网络编程 > Javascript > javascript表单域与json数据间的交互

Javascript
动态改变图片尺寸(一)
JavaScript+PHP 应用一:网页制作中双下拉菜单的动态实现
JavaScript + PHP 应用二:网页设计中树形菜单的动态实现
在Javascript中为String对象添加trim,ltrim,rtrim方法
纯JavaScript时钟
网页之定时器详解
为网页添加活动的背景音乐
Javascript Game
实用的检测分辨率的程序代码
【推荐】一个非常漂亮的列表框
绝对精彩:在网页里做类似window右键的弹出式菜单
怎样使网页中的元素可编辑??
JavaScript和Java的区别
怎样编写IE和NN6通用的闪烁(blank)效果
关于如何动态地在同一页面实现两个 < select > 互传 (s1 <==> s2)
COOKIE欺骗
连串英文自动换行的方法
JavaScript中的正则表达式(1)
JavaScript中的正则表达式(2)
JavaScript窗口功能指南之定制新窗口

Javascript 中的 javascript表单域与json数据间的交互


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 209 ::
收藏到网摘: n/a

找了几个javascript的框架,都没有找到我想要的: 提供函数,把某个表单的所有域封装成json数据格式的对象,唯有自己实现一个。 包括对象中有集合属性、对象中引用其他对象属性:
复制代码 代码如下:
挑一些 小毛病:
不用 var 声明函数级变量是个坏习惯
if(eValue && eValue != "undefined" && eValue != "null") 这句判断欠妥
json 中包含数组的情况考虑不周
form中有多个name相同元素的情况考虑不周
多选select情况考虑不周
checkbox radiobox 考虑不周
disabled 和 readonly 的情况 考虑不周
元素没有name时的策略是什么? 没有name就不处理 还是没有name取id?? 最后给个参数选择
总结:
lz写的函数 目前还不适合在实际中使用
哈哈,终于看到有人和我有相同的想法了,(以前没有发现).
不过,其实这个想法可以延伸的,而且我已经延伸了.那就是:
既然是要得到JSON的数据,那一定和form有关么?非要从form中获取么?
当然不是.因此我写了一个基于jQuery的扩展
找了几个javascript的框架,都没有找到我想要的: 提供函数,把某个表单的所有域封装成json数据格式的对象,唯有自己实现一个。
复制代码 代码如下:

/*
* jQuery Ajax By Name Plugin
*
* licensed under the MIT licenses:
* http://www.opensource.org/licenses/mit-license.php
*
* Author achun (achun.shx at gmail.com)
* Create Date: 2008-6-21
* Last Date: 2008-6-21
* Revision:2.8.6.21
*/
(function($) {
/**
* 获取鼠标点击的元素坐标
*/
$.fn.clickPos = function(e){
var pos ={x:0,y:0};
if (e.offsetX != undefined) {
pos.x = e.offsetX;
pos.y = e.offsetY;
} else if (typeof $.fn.offset == 'function') {
var offset = this.offset();
pos.x = e.pageX - offset.left;
pos.y = e.pageY - offset.top;
} else {
pos.x = e.pageX - this[0].offsetLeft;
pos.y = e.pageY - this[0].offsetTop;
}
return pos;
}
/**
* ajaxName() 根据标签name属性来提交数据,替代form提交方式
* options:{//与ajax的options是一样的结构
* data:{}//要附加提交的数据
* }
* successful:如果元素有有效值,defualt:true
*/
$.fn.ajaxName = function(options,successful) {
if(options==undefined) options={};
options.data = options.data || {};
successful = successful == undefined ? true:successful;
var data = {};
var name= options.name || '';
this.each(function() {
var el=this,o=$(this),n = o.attr('name'),hasval = o.attr('value')!=undefined;
if (!n) return;
var t = el.type, tag = el.tagName.toLowerCase();
if (n=='/'){
if (name=='') name = hasval?o.attr('value'):o.text();
return;
}
if (successful && (el.disabled || t == 'reset' || t == 'button' ||
(t == 'checkbox' || t == 'radio') && !el.checked ||
(t == 'submit' || t == 'image') ||
tag == 'select' && el.selectedIndex == -1))
return;
var v= hasval? o.attr('value') :o.hasClass('ValueByText')?o.text():o.html();
if (v == undefined) return;
if (n.indexOf('.')>0){
n=n.split('.');
var len=n.length - 1;
var b=data;
$.each(n,function(i){
if (i!=len){
if(b[this] == undefined) b[this]={};
b=b[this];
}else
b[this]=v;
});
}else if (n.indexOf('[]')>0){
n=n.slice(0,n.length-2);
if(data[n] == undefined) data[n]=[];
data[n].push(v);
}else{
data[n]=v;
}
});
var dat={};
if (name){
dat[name]=data;
data=dat[name];
}else
dat=data;
for (var o in options.data){
data[o]=options.data[o];
};
options.data=dat;
return options.data;
};
})(jQuery);

其中的clickPos扩展是为了取得图片点击提交点击坐标使用的扩展.
使用方法:
首先要调用这个使用,肯定需要element有name属性.调用类似这样的语法:
Js代码
var jsondat=$('#id [@name]').ajaxname()
var jsondat=$('#id [@name]').ajaxname()其次:我对name='/'的element做了特殊处理,比如:
Html代码
<div name='/' value='foo'><span name='user'>youname</span></div>
<div name='/' value='foo'><span name='user'>youname</span></div> 得到的结果是:
Js代码
{foo:{user:"youname"}}
{foo:{user:"youname"}}至于提交那是另外一件事情了.
另外就是:
1.我的这个获取数组下标是自动增加下标的,写法类似这个
Html代码
<li name='a[]'>a0</li><li name='a[]'>a1</li><li name='a[]'>a2</li>
<li name='a[]'>a0</li><li name='a[]'>a1</li><li name='a[]'>a2</li> 如果不符合你的习惯,可以按照你上面的代码修改一下了.
2.支持"."操作符
Html代码
<li name='a.a'>a</li><li name='a.b'>b</li><li name='a.c'>c</li>
<li name='a.a'>a</li><li name='a.b'>b</li><li name='a.c'>c</li>将获得
Js代码
{a:{a:'a',b:'b',c:'c'}}