• 搜索弹层交互


    现在有这么个需求,图一所示,称红线框这一行为searchRow,当searchRow获取焦点时,搜索按钮显示出,当searchRow失去焦点时,搜索按钮消失掉,当鼠标点击带看房源下面的input时,弹出图二所示的层,用户输入数据后,将数据显示到层上,当用户填写searchRow的数据后,点击搜索,按填写的内容,输出相应的结果,图三所示:

    图一

    图二

    图三

    当删除指定的搜索条件后,searchRow中相应条件也会清除。且图二所示数据有相应的格式要求,当弹层中最后一个input的值不为空时,假如第二个input没有输入数据,那么写到带看房源下input中的数据为1# #34#4;当弹层中最后一个input为空时,假如第三个input不会空,那么写到带看房源下的input中的数据为1#2#34。

    产品交互逻辑大致就是这样,接下来就是程序设计思路:

    整套系统采用的是dojo的模块化思路,这里只列出组件实现交互的相应方法:

    define('my/grid', ['XX'], function() {
        var Grid = {
            ......
            useSearch: function() {
          /**
           * 1、使用场景是假定每次搜索都重载页面,这样就不会存在查找元素个数问题且不需要记录并维护元素数据,因每次能获取到的都是最新的
           * 2、表单元素的查找采用原生的form.elementName方式,因应用中肯定需要定义元素的name,所以可以规避掉各浏览器差异
          */
          
          // TODO 条件不在同一表单里,清除时查找有问题
        
          var $advancedSearchBtn = $('[role="advancedSearchBtn"]', this.pageSection.top); // 高级搜索按钮
          var $advancedSearchPanel = $('[role="advancedSearchPanel"]', this.pageSection.mainHD); // 高级搜索面板
          var $advancedSearchConditions = $('[role="advancedSearchConditions"]', this.pageSection.mainHD); // 高级搜索已搜索条件区域
          var $advancedSearchFormContainer = this.pageSection.main; // 整个表单容器,可能包含多个表单,用于查找搜索条件对应的表单元素
          var $advancedSearchClose = $('[role="advancedSearchClose"]', $advancedSearchPanel);
    
          var $form = $advancedSearchFormContainer.find('form');
          // 没有表单就不干了
          if (!$form.length) {
            return;
          }
          
          var conditionItemLength = $advancedSearchConditions.find('[role="conditionItem"]').length; // 已经输出的条件个数
          
          // 没有条件显示,就隐藏搜索区域
          if (!conditionItemLength) {
            $advancedSearchConditions.hide();
          }
          
          // 搜索面板显示切换
          $advancedSearchBtn.click(function() {
            var $self = $(this);        
            $advancedSearchPanel.toggle();
            $self.toggleClass('btn-link').toggleClass('btn-link-cur');
            
            window.updateFrame();
          });
          
          // 关闭搜索面板
          $advancedSearchClose.click(function() {
            $advancedSearchPanel.hide();
            
            window.updateFrame();
          });
          
          // 删除搜索条件
          $advancedSearchConditions.on('click', '[role="conditionItem"] .close', function(event, isTirgger) {
            var $self = $(this), $conditionItem = $(this).closest('[role="conditionItem"]'), name = $conditionItem.attr('name'), value = $conditionItem.attr('value');
            var $formEl = $advancedSearchFormContainer.find(':input[name="'+ name +'"]');
            if (!$formEl.length) {
              alert('没有找到对应的表单元素啊!');
              return;
            }
            
            // 存在NodeList的节点,比如checkbox这样的,和同一条件在多个区域,因此需要each
            $formEl.each(function() {
              var formEl = this;
              switch (formEl.type) {
                case 'text':
                case 'hidden':
                  formEl.value = '';
                  break;
                case 'checkbox': //  针对这两种类型应该在元素中指定真实的id值,用value="1"的方式写在条件元素上,多个值用","分隔
                case 'radio':
                  if (value) {
                    _value = value.split(',');
                  }
                  for (var j = 0; j < _value.length; j++) {
                    if (formEl.value == _value[j]) {
                      formEl.checked = false;
                      break;
                    }
                  }
                  break;
                case 'select-one': // 与checkbox和radio的处理一样,就在元素上写上当前搜索的值              
                  for (var j = 0, l = formEl.options.length; j < l; j++) {
                    var option = formEl.options[j];
                    if (option.value == value) {
                      option.selected = false;
                      break;
                    }
                  }
                  // ie中手动更新select选中状态,认为第一个元素是默认空值
                  formEl.options[0].selected = true;
                  break;
                default:
                  alert('未捕获的表单元素类型!');
                  break;
              }
            });
    
              //将弹层搜索同级的input中的值也动态修改掉
              //var $searchRow = $('[role="searchRow"]', this.pageSection.mainBD);
              //var $openlayer = $('[role="openlayer"]', $searchRow);
              var $layer=$formEl.parent();    //当前弹层
              var $input=$('input[type="text"]', $layer);
              var str = "";
              $input.each(function(){
                  if($(this).val() != ""){
                      str += $(this).val() + "#";
                  }else{
                      str += " " + '#';
                  }
              });
              var strVal=str.substr(0,str.length-1);
              //去除掉字符串尾巴为空的字符和'#'
              while(strVal.charAt(strVal.length-1) == " "){
                  strVal=strVal.substr(0,strVal.length-2);
              }
    
              $layer.parent().siblings().val(strVal);
    
              $layer.parent().css("display","none");
              console.log(1);
            
            // 删除条件元素从页面上
            $conditionItem.remove();
            
            if (!--conditionItemLength) {
              $advancedSearchConditions.hide();
            }
    
            //$form.trigger('submit');
            if(!isTirgger){
              $form.trigger('submit');
            }
    
            // 不冒泡
            return false;
          });
          
          // 清空搜索条件
          $advancedSearchConditions.find('[role="conditionClear"]').click(function() {
            $advancedSearchConditions.find('[role="conditionItem"] .close').trigger('click', [true]);
            $form.trigger('submit');
          });
        },
        
        userSearchRow: function() {
          var $searchRow = $('[role="searchRow"]', this.pageSection.mainBD);
          var $searchBtn = $('[role="searchBtn"]', $searchRow);
          var searchBtnHover = false;
    
          $searchRow.focusin(function(e) {
            $(this).addClass('search-focus');
          }).focusout(function(e) {
            if (!searchBtnHover) {
              $(this).removeClass('search-focus');
            }
          });
          
          $searchBtn.hover(function() {
            searchBtnHover = true;
          },function(){
            searchBtnHover = false;
          });
    
          /*兼容chrome  点击checkbox不出现搜索按钮*/
          var $input = $('input[type="checkbox"]',$searchRow);
          $input.click(function(){
               $searchRow.addClass('search-focus');
          });
    
        },
    
        layerSearch: function(){
            var self=this;
            self.dataParam={};
            var $searchRow = $('[role="searchRow"]', this.pageSection.mainBD);
            var $openlayer = $('[role="openlayer"]', $searchRow);
            //var $layer=$('[role="popup"]' , $searchRow);
            var $confirm=$('[role="confirm"]' , $searchRow);
            var $cancel=$('[role="cancel"]' , $searchRow);
            $openlayer.focusin(function(e){
                $(this).siblings().css("display","block");
            });
            $confirm.click(function(){
                var $layer=$(this).parent();    //当前弹层
                var $input=$('input[type="text"]', $layer);
                var str = "";
                $input.each(function(){
                    if($(this).val() != ""){
                        str += $(this).val() + "#";
                    }else{
                        str += " " + '#';
                    }
                });
                var strVal=str.substr(0,str.length-1);
                //去除掉字符串尾巴为空的字符和'#'
                while(strVal.charAt(strVal.length-1) == " "){
                    strVal=strVal.substr(0,strVal.length-2);
                }
    
                $layer.siblings().val(strVal);
    
                $layer.css("display","none");
    
                //兼容chrome
                $searchRow.focus();
    
            });
            $cancel.click(function(){
                $(this).parent().css("display","none");
    
                //兼容chrome
                $searchRow.focus();
            });
    
            /*点击页面其它区域隐藏搜索弹层
            $openlayer.click(function() {
                $layer.toggle().attr(app.posAttrName, 'layerPopup');
                return false;
            });
    
            $layer.bind('hide.fangyun', function() {
                $openlayer.trigger('click');
            }).bind('click', function(event) {
                    //千万不能用return false,用的话会导致菜单中的a链接不可用,因为return false = stopPropagation(取消冒泡) + preventDefault(取消默认行为)
                    //return false;
                    event.stopPropagation(); // 防止冒泡到document后触发hide
            });
            */
    
        }
        
    
            ......
        }
        return Grid;
    })    
        
  • 相关阅读:
    C语言I博客作业03
    C语言I博客作业02
    macwingIDE python3.5 配置
    JAVA必会算法插入排序
    java匿名内部类的另一个用途
    JAVA必会算法选择排序
    Mac elasticsearch 5.2.2 单机双节点配置
    JAVA必会算法二分查找法
    AOP 事物连接,记忆连接数据库,连接池
    线程的意义与一些常见面试问题
  • 原文地址:https://www.cnblogs.com/onflying/p/3037296.html
Copyright © 2020-2023  润新知