1. 程式人生 > >jQuery實現調查問卷功能

jQuery實現調查問卷功能

選項 分享 .com check 以及 png 獲取 ons ddd

效果圖:

技術分享圖片技術分享圖片技術分享圖片

需求:

1.有10道測試題目,單選,選中答案之後,500ms後自動跳轉至下一題

2.如果當前題目沒有選擇答案,將彈窗提示“請選擇答案!”

3.點擊“上一題”,“下一題”將實現跳轉題目,第一題的時候,“上一題”按鈕為灰色

4.第10題選擇答案之後將選中的題目分數相加,自動出現評測結果,對評測結果不滿意的可以點擊“重新測評”再測一次

5.單頁功能,不實現頁面跳轉

構思:

1.單選按鈕需要替換背景圖片,可以通過class來切換,並用另外一個class來標識選中

2.用li來代表每一道題

需要使用的圖片

技術分享圖片技術分享圖片技術分享圖片技術分享圖片技術分享圖片

技術分享圖片技術分享圖片

代碼實現以及講解:

html部分:

1.題目:

<section class
="risk"> <div class="select"> <ul id="subjectBox"> </ul> </div> <div class="pro-box"> <div class="pro-bg"> <div class="pro-col" id="scroller"></div> </div> <p><span
id="current"></span>/<span id="total"></span></p> </div> <div class="btns"> <div id="preBtn">上一題</div> <div id="nextBtn" class="blue">下一題</div> </div> </section>

2.提示彈窗

<section>
    <div id="choice-tip"
>請選擇答案!</div> </section>

3.評測結果

<section class="result-box">
    <p>-您當前的風險承受能力-</p>
    <div class="result-1">
        <img src="" id="result-img">
        <div class="result-txt">
            <div id="result-type"></div>
            <div class="result-money">
                <p>建議最大投資金額:<span id="max-money"></span></p>
                <p>您當前已投資金額:<span id="invest-money"></span></p>
            </div>
        </div>
    </div>
    <div class="ok-btn">確定</div>
    <div id="reset">重新測評</div>
</section>

css部分:

body{background: #f5f6fb;}
.risk{margin-top:1rem;color:#333;font-size:1.3rem;}
.risk .select ul li{display: none;}
.risk .select ul li.active{display: block;}
.risk .select ul li .line{transition:all 0.5s;border-bottom: 1px solid #ccc;padding:1rem 2rem 1rem;position:relative;}
.risk .select ul li p.line{font-size:1.4rem;}
.risk .select ul li div.line{padding:1rem 3.5rem 1rem 2rem}
.risk .select ul li input[type=radio]{position:absolute;top:50%;transform:translate(0,-50%);right:1rem;}
.risk .select ul li .check-img{background:url("../img/risk-test/checked-mark.png") no-repeat center;height: 2rem;background-size: 100%;position:absolute;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);right:1rem;width:2rem;}
.risk .pro-box{text-align: center;}
.risk .select ul li .check-img.uncheck{background:url("../img/risk-test/unchecked-mark.png") no-repeat center;height: 2rem;background-size: 100%;position:absolute;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);right:1rem;width:2rem;}
.risk .pro-box{text-align: center;}
.risk .pro-box .pro-bg{width: 90%;background: #e4e4ea;height: .6rem;margin: 2rem auto auto;border-radius: 2rem;}
.risk .pro-box .pro-bg .pro-col{width: 10%;background: #5175b3;height: 100%;border-radius: 2rem;}
.risk .btns{position: fixed;bottom: 0;left: 0;width:100%;text-align: center;box-sizing: border-box;}
.risk .btns div{width:49.7%;height:3.5rem;line-height: 3.5rem;float:left;border-top:1px solid #ddd;border-right: 1px solid #ddd;}
.risk .btns div:nth-child(2){border-right: 0;}
.risk .btns div.blue{color:#5175b3;}
#choice-tip{display:none;border-radius:.5rem;font-size:1.5rem;background: #000;color:#fff;padding:1rem;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);}

.result-box{font-size:1.2rem;color:#666;padding-top: 3rem;text-align: center;display: none;position:absolute;top:0;left:0;}
.result-box img{width:45%;margin:1.5rem auto;}
.result-box .result-txt{padding:0 4rem;text-align: justify;line-height: 1.8rem;}
.result-box .result-txt .result-money{color:#5175b3;}
.result-box .ok-btn{width:70%;margin:2rem auto 1rem;padding:1rem 0;background: #5175b3;color:#fff;font-size:1.3rem;border-radius: .5rem;}
#reset{color:#5175b3;margin-bottom: 2rem;font-size:1.3rem;}

復制css的時候,要註意圖片的路徑是否需要修改

jq部分:

1.定義會用到的變量

       // 當前題目索引
        var currentSubjectIndex = 1;
        // 總題數
        var subjectTotal = subjectArray.length;
        // 上一題按鈕
        var $preBtn = $("#preBtn"); 
        // 下一題按鈕    
        var $nextBtn = $("#nextBtn");
        // 題目容器
        var $subjectBox = $("#subjectBox");
        // 總題數容器
        var $total = $("#total");
        
        // 進度條
        var $scroller = $("#scroller");

        //重新測評按鈕
        var $reset = $("#reset");

2.點擊效果

    // 選中題目點擊
        $subjectBox.find("div.line").on("click", function(){
            if(currentSubjectIndex >= 1){ 
              $preBtn.addClass("blue");
            }
       //get為選中的答案標識 $(
this).find(".check-img").removeClass("uncheck").addClass("get"); $(this).siblings().find(".check-img").addClass("uncheck"); setTimeout(nextPage,300); }); // 上一題按鈕點擊 $preBtn.on("click", function(){ prePage(); }); // 下一題按鈕點擊 $nextBtn.on("click", function(){ nextPage(); });
     //重新測評按鈕點擊 $reset.on(
"click", function(){ resetTest(); });

3.函數

        /**
         * 初始化題目容器
         */
        function initSubjectBox(){
            var subjectHtml = ‘‘;
            for(var i=0; i<subjectArray.length; i++){
                subjectHtml += getSubjectHtml(subjectArray[i], i+1);
            }
            
            $subjectBox.html(subjectHtml);
            $("#index_" + currentSubjectIndex).addClass("active");

            // 改變進度條
            changeScroller();
        }

        /**
         * 獲取題目HTML
         */
        function getSubjectHtml(subject, index){
            var subjectItemHtml = getSubjectItemHtml(subject[‘answers_items‘], index);
            var html = ‘‘
            +‘<li id="index_‘ + index + ‘">‘
                +‘<p class="line">‘
                    +‘<span>‘ + index + ‘.</span>‘
                    +‘<span>‘ + subject.title +‘</span>‘
                +‘</p>‘
                + subjectItemHtml
            +‘</li>‘
            return html;
        }

        /**
         * 獲取題目選項HTML
         */
        function getSubjectItemHtml(subjectItemArray, index){
            var html = ‘‘;
            for(var i=0; i<subjectItemArray.length; i++){
                var subjectItem = subjectItemArray[i];
                html += ‘‘
                +‘<div class="line" value="‘ + subjectItem.point + ‘">‘
                    +‘<span>‘ + subjectItem.result + ‘.</span>‘
                    +‘<span>‘ + subjectItem.content + ‘</span>‘
                    +‘<div class="check-img uncheck">‘+‘</div>‘
                +‘</div>‘;
            }
            return html;
        }

        /**
         * 改變進度條
         */
        function changeScroller(){
            $scroller.width(currentSubjectIndex/subjectTotal * 100 + "%");
        }

        /**
         * 獲取總分數
         */
        function getTotalPoint(){
            var result = 0;
            var selectedOptionArray = $subjectBox.find(".get");
            $(selectedOptionArray).each(function(){
                result += parseInt($(this).parent().attr("value"));
            });
            return result;
        }

        /**
         * 上一題
         */
        function prePage(){
          //console.log(currentSubjectIndex);
            if(currentSubjectIndex <= 1){return;}
            if(currentSubjectIndex == 2){$preBtn.removeClass("blue");}
            currentSubjectIndex--;
            flipPage();
        }

        /**
         * 下一題
         */
        function nextPage(){
          //console.log(currentSubjectIndex);
          if(currentSubjectIndex >= 1){ 
            $preBtn.addClass("blue");
          }
            var nopass = $("#index_" + currentSubjectIndex).find(".get").length == 0 ? true : false;
            if(nopass){
                $("#choice-tip").fadeIn();
                setTimeout("$(‘#choice-tip‘).fadeOut()",1000);
                return;
            }
            if(currentSubjectIndex == subjectTotal){ 
          //得出結果
var result = getTotalPoint(); //console.log("您的得分是:" + result); var imgSrc = $("#result-img"), resultType = $("#result-type"), maxMoney = $("#max-money"), investMoney = $("#invest-money"); if(result >= 0 && result <= 22){ imgSrc.attr("src","img/risk-test/result1.png"); resultType.html("評測結果:保守型") maxMoney.html("10萬元"); investMoney.html("30,000.12元") }else if(result >= 23 && result <= 44){ imgSrc.attr("src","img/risk-test/result2.png"); resultType.html("評測結果:穩健型") maxMoney.html("20萬元"); investMoney.html("30,000.12元") }else if(result >= 45 && result <= 66){ imgSrc.attr("src","img/risk-test/result3.png"); resultType.html("評測結果:平衡型") maxMoney.html("30萬元"); investMoney.html("30,000.12元") }else if(result >= 67 && result <= 88){ imgSrc.attr("src","img/risk-test/result4.png"); resultType.html("評測結果:積極型") maxMoney.html("40萬元"); investMoney.html("30,000.12元") }else{ imgSrc.attr("src","img/risk-test/result5.png"); resultType.html("評測結果:激進型") maxMoney.html("50萬元"); investMoney.html("30,000.12元") } $(".risk").fadeOut(); $(".result-box").fadeIn(); return; } currentSubjectIndex++; flipPage() } /** * 翻頁 */ function flipPage(){ $subjectBox.find("li").removeClass("active"); $("#index_" + currentSubjectIndex).addClass("active"); $("#current").html(currentSubjectIndex); changeScroller(); } /** * 重新測評 */ function resetTest(){ currentSubjectIndex = 1; $(".risk").fadeIn(); $(".result-box").fadeOut(); $preBtn.removeClass("blue"); $(".check-img").removeClass("get").addClass("uncheck"); flipPage(); }

在得出結果那裏,總分的分層範圍中,resultType,maxMoney,investMoney實際為後臺讀取的數據。

json對象:

  
    var object = {
      "question_items" : [ {
        "title" : "您的年齡是:",
        "type" : "TYPE_RADIO",
        "answers_items" : [ {
          "result" : "A",
          "point" : 10,
          "content" : "18-30歲"
        }, {
          "result" : "B",
          "point" : 8,
          "content" : "31-40歲"
        }, {
          "result" : "C",
          "point" : 5,
          "content" : "41-50歲"
        }, {
          "result" : "D",
          "point" : 3,
          "content" : "50歲以上"
        } ]
        }, {
          "title" : "您的家庭年收入為(稅後折合人民幣)?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "10萬以下"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "10-30萬"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "30-100萬"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "100萬以上"
          } ]
        }, {
          "title" : "您期望的投資期限是多久?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 4,
            "content" : "活期"
          }, {
            "result" : "B",
            "point" : 6,
            "content" : "1-3個月"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "4-6個月"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "7-12個月"
          } ]
        }, {
          "title" : "以下金融投資方式,您投資比例最高的在以下哪一類?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "基本沒有金融產品相關知識,除存款、國債外,我幾乎不投資其他金融產品"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "對金融產品有初步認識,除投資於存款、國債外,偶爾投資於股票、基金等產品"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "對金融產品有一定的理解,投資過存款、國債、銀行理財產品、信托產品、股票、基金等產品"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "金融專業人士,長期投資於證券、期貨等產品"
          } ]
        }, {
          "title" : "您有多少年投資風險產品的經驗(如:股票、P2P、基金、外匯、金融衍生產品等)?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "沒有經驗"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "2年以下"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "2-5年"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "5年以上"
          } ]
        }, {
          "title" : "您的家庭收入每年可用於金融投資的比例為?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "10%以內"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "10%-25%"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "25%-50%"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "50%以上"
          } ]
        }, {
          "title" : "您對P2P投資希望達到的年收益率水平?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "7%~10%"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "10%~15%"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "15%~20%"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "20%以上"
          } ]
        }, {
          "title" : "您在過去所有的投資理財經歷中是否有過虧損或被套的經歷?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 10,
            "content" : "從未虧損或被套"
          }, {
            "result" : "B",
            "point" : 8,
            "content" : "虧損或被套在30%以內"
          }, {
            "result" : "C",
            "point" : 5,
            "content" : "虧損或被套在30%—60%"
          }, {
            "result" : "D",
            "point" : 3,
            "content" : "虧損或被套在60%以上"
          } ]
        }, {
          "title" : "在您每年的家庭收入中,可用於金融投資(儲蓄存款除外)的比例為?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "10%以下"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "10%-25%"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "25%-50%"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "50%以上"
          } ]
        }, {
          "title" : "您目前投資了多少家P2P平臺?",
          "type" : "TYPE_RADIO",
          "answers_items" : [ {
            "result" : "A",
            "point" : 3,
            "content" : "0-3家"
          }, {
            "result" : "B",
            "point" : 5,
            "content" : "4-8家"
          }, {
            "result" : "C",
            "point" : 8,
            "content" : "8-12家"
          }, {
            "result" : "D",
            "point" : 10,
            "content" : "12家以上"
          } ]
      } ]      
    }
  var subjectArray = object[‘question_items‘];

jQuery實現調查問卷功能