jquery ajax生成无限级关联SELECT

32 篇文章 0 订阅
23 篇文章 0 订阅

/* 多级选择相关函数,如地区选择,分类选择
* multi-level selection
 */
/* 地区选择函数 */
function regionInit(divId)
{
    $("#" + divId + " > select").get(0).onchange = regionChange; // select的onchange事件
    $("#" + divId + " .edit_region").click(regionEdit); // 编辑按钮的onclick事件
}
function regionChange()
{
    // 删除后面的select
    $(this).nextAll("select").remove();
    // 计算当前选中到id和拼起来的name
    var selects = $(this).siblings("select").andSelf();
    var id = 0;
 var ids = new Array();
    var names = new Array();
    for (i = 0; i < selects.length; i++)
    {
        sel = selects;
        if (sel.value > 0)
        {
            id = sel.value;
            name = sel.options[sel.selectedIndex].text;
            names.push(name);
   ids.push(id);
        }
    }
    $(".city_id").val(id);
    $(".city_ids").val(ids.join(","));
    $(".city_names").val(names.join(","));
    // ajax请求下级地区
    if (this.value > 0)
    {
        var _self = this;
        var url = '/index.php?app=admin&mod=Base&act=select_option&type=city';
        $.getJSON(url, {'pid':this.value}, function(data){
            if (data.done)
            {
                if (data.retval.length > 0)
                {
                    $("<select><option>请选择</option></select>").change(regionChange).insertAfter(_self);
                    var data  = data.retval;
                    for (i = 0; i < data.length; i++)
                    {
                        $(_self).next("select").append("<option value='" + data.area_id + "'>" + data.title + "</option>");
                    }
                }
            }
            else
            {
                alert(data.msg);
            }
        });
    }
}
function regionEdit()
{
    $(this).siblings("select").show();
    $(this).siblings("span").andSelf().hide();
}

/* 商品分类选择函数 */
function gcategoryInit(divId)
{
    $("#" + divId + " > select").get(0).onchange = gcategoryChange; // select的onchange事件
    window.onerror = function(){return true;}; //屏蔽jquery报错
    $("#" + divId + " .edit_gcategory").click(gcategoryEdit); // 编辑按钮的onclick事件
}
function gcategoryChange()
{
    // 删除后面的select
    $(this).nextAll("select").remove();
    // 计算当前选中到id和拼起来的name
    var selects = $(this).siblings("select").andSelf();
    var id = 0;
 var ids = new Array();
    var names = new Array();
    for (i = 0; i < selects.length; i++)
    {
        sel = selects;
        if (sel.value > 0)
        {
            id = sel.value;
            name = sel.options[sel.selectedIndex].text;
            names.push(name);
   ids.push(id);
        }
    }
    $(".mls_id").val(id);
    $(".mls_ids").val(ids.join('#'));
    $(".mls_names").val(names.join("#"));
    // ajax请求下级分类
    if (this.value > 0)
    {
        var _self = this;
        var url = '/index.php?app=admin&mod=Base&act=select_option&type=industry';
        $.getJSON(url, {'pid':this.value}, function(data){
            if (data.done)
            {
                if (data.retval.length > 0)
                {
     console.log(data.retval);
                    $("<select><option>请选择</option></select>").change(gcategoryChange).insertAfter(_self);
                    var data  = data.retval;
                    for (i = 0; i < data.length; i++)
                    {
                        $(_self).next("select").append("<option value='" + data.industry_id + "'>" + data.industry_name + "</option>");
                    }
                }
            }
            else
            {
                alert(data.msg);
            }
        });
  //获得该行业工种
  var url = '/index.php?app=admin&mod=Base&act=select_option&type=work_type';
   $.getJSON(url, {'pid':this.value}, function(data){
            if (data.done)
            {
                if (data.retval.length > 0)
                {
                    var data  = data.retval;
     $("#work_type_id").empty();  
                    for (i = 0; i < data.length; i++)
                    {
                         $("#work_type_id").append("<option value='" + data.id + "'>" + data.work_name + "</option>");
                    }
     $("#work_type_id").prepend("<option selected>请选择</option>");
                }
    
            }
            else
            {
                alert(data.msg);
            }
        });
   
 
    }
}
function gcategoryEdit()
{
    $(this).siblings("select").show();
    $(this).siblings("span").andSelf().remove();
}

PHP代码:
//AJAX生成无限关联select
 function select_option(){

        $pid = empty($_GET['pid']) ? 0 : intval($_GET['pid']);
        switch ($_GET['type'])
        {
  //行业
            case 'industry':
                $mod_region = M('industry');
                $regions = $mod_region->where('parent_id='.$pid)->select();
                $this->json_result(array_values($regions));
                break;
  //省份城市
            case 'city':
                $mod_gcategory = M('area');
                $cates = $mod_gcategory->where('pid='.$pid)->select();
                $this->json_result(array_values($cates));
                break;
  //工种
    case 'work_type':
    $mod = M('work_type');
    $pid_list = array();
    $pid_list = get_childID_list($pid);
    $pid_list[] = $pid;
    $list = $mod->where('industry_id in('.join(',',$pid_list).')')->field('id,work_name')->select();
    $this->json_result(array_values($list));
          break;
        }

 }
 //JSON格式化返回
     function json_result ($retval = '', $msg = '', $jqremote = false)
    {
        $this->json_header();
        $json = ecm_json_encode(array('done' => true , 'msg' => $msg , 'retval' => $retval));
        if ($jqremote === false)
        {
            $jqremote = isset($_GET['jsoncallback']) ? trim($_GET['jsoncallback']) : false;
        }
        if ($jqremote)
        {
            $json = $jqremote . '(' . $json . ')';
        }
        echo $json;
    }
 //谢绝缓存
     function json_header()
    {
        header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
        header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
    }

用到的函数:
function ecm_json_encode($value)
{
    if (CHARSET == 'utf-8' && function_exists('json_encode'))
    {
        return json_encode($value);
    }
    $props = '';
    if (is_object($value))
    {
        foreach (get_object_vars($value) as $name => $propValue)
        {
            if (isset($propValue))
            {
                $props .= $props ? ','.ecm_json_encode($name)  : ecm_json_encode($name);
                $props .= ':' . ecm_json_encode($propValue);
            }
        }
        return '{' . $props . '}';
    }
    elseif (is_array($value))
    {
        $keys = array_keys($value);
        if (!empty($value) && !empty($value) && ($keys[0] != '0' || $keys != range(0, count($value)-1)))
        {
            foreach ($value as $key => $val)
            {
                $key = (string) $key;
                $props .= $props ? ','.ecm_json_encode($key)  : ecm_json_encode($key);
                $props .= ':' . ecm_json_encode($val);
            }
            return '{' . $props . '}';
        }
        else
        {
            $length = count($value);
            for ($i = 0; $i < $length; $i++)
            {
                $props .= ($props != '') ? ','.ecm_json_encode($value[$i])  : ecm_json_encode($value[$i]);
            }
            return '[' . $props . ']';
        }
    }
    elseif (is_string($value))
    {
        //$value = stripslashes($value);
        $replace  = array('\\' => '\\\\', "\n" => '\n', "\t" => '\t', '/' => '\/',
                        "\r" => '\r', "\b" => '\b', "\f" => '\f',
                        '"' => '\"', chr(0x08) => '\b', chr(0x0C) => '\f'
                        );
        $value  = strtr($value, $replace);
        if (CHARSET == 'big5' && $value{strlen($value)-1} == '\\')
        {
            $value  = substr($value,0,strlen($value)-1);
        }
        return '"' . $value . '"';
    }
    elseif (is_numeric($value))
    {
        return $value;
    }
    elseif (is_bool($value))
    {
        return $value ? 'true' : 'false';
    }
    elseif (empty($value))
    {
        return '""';
    }
    else
    {
        return $value;
    }
}

http://www.damicms.com/bbs/thread-258-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值