又是一年一度的春運搶票季,無論你是北上、南下或者東進,在外漂泊了一年,有錢沒錢老是要回家過年的。css
【圖片來源於網絡】html
聽說12306改版了,新版本里面除了UI這些面兒上的改動,還加入了自動刷票、自動提交訂單等實用的功能,而且推出了手機購票軟件,當真是下了一番真功夫!這裏對12306訂票系統的工程師們表示感謝!jquery
可是,等你真的去訂票的時候,你遇到的錯誤多是這樣的:程序員
也多是這樣的:ajax
或者是這樣的:chrome
運氣好點的能見到購票失敗的提示:瀏覽器
這裏真心的恭喜那些搶票成功的同窗們!恭喜發財!紅包拿來!服務器
先聽我講一下今天搶票的親身經歷:打開12306購票頁面,滿心歡喜的登錄(我對本身的網速仍是有信心的,迅雷下載2MB以上,日常看視頻都只看高清),結果今天在登錄的時候就出了岔子,先是驗證碼沒有顯示,等到驗證碼顯示出來之後我趕忙去輸入,輸完四個字符之後就卡死了,真的是卡死了……網絡
直覺告訴我,12306的驗證碼校驗確定是同步請求,因而打開開發者工具,想來一窺究竟。異步
真正的調用在這裏:
首先看一下common.js,點看之後發現是壓縮過的,從註釋上面能夠看到裏面包含了jquery 1.九、Sizzle CSS Selector Engine(這個沒有用過)、jqPagination、jQuery Form Plugin、jQuery Validation Plugin 1.11.1以及一些ajax的封裝,而真正執行請求的地方是在login.js裏面。
我把login.js下載了下來,而後格式化了輸出,找到了checkRandCode的定義:
checkRandCode: function() { var d; var c = $("#randCode").val(); $.ajax({ url: ctx + "passcodeNew/checkRandCodeAnsyn", type: "post", data: { randCode: c, rand: "sjrand" }, async: false, success: function(e) { if (e.data == "N") { d = false; $("#i-ok").css("display", "none") } else { d = true; $("#i-ok").css("display", "block") } } }); return d }
看到了吧,async:false,果真是走的同步請求,在12306超負載的時候,這個請求會一直掛起,因而就出現了瀏覽器卡死、瀏覽器崩潰等問題,這個跟瀏覽器真不要緊。
怎麼破?一行代碼搞定:
jQuery.extend({ checkRandCode: function () { return true; } });
把這句代碼放在console裏面執行:
直接覆蓋12306的checkRandCode方法,不去服務器走一遭,立刻返回true。
若是你以爲同步請求還可以忍受,那麼看看下面的經歷:我一個不當心我輸錯了字母,驗證碼校驗告訴我錯誤了,我也知道看到了錯誤的地方,而後我去挪動光標,奇葩的事情再次發生,它竟然又執行了上面那個同步的驗證!!!感情12306監聽的是鍵盤事件啊(後來看代碼發現是keyup):
$("#randCode").on("keyup", function (c) { c = c || window.event; $("#error_msg").hide(); if ($("#randCode").val() != "" && $("#randCode").val().length == 4) { if (!$.checkRandCode()) { $("#error_msg").html(login_messages.randCodeError).attr("class", "error").css("margin-left", "70px"); $("#error_msg").show(); return false } else { $("#i-ok").css("display", "block"); if (c.keyCode == 13) { $("#loginSub").click() } } } else { $("#i-ok").css("display", "none") } b = $("#randCode").val() })
看到了吧,人家是監聽的keyup,只要裏面夠四位,你放開鍵盤就去驗證,放開鍵盤就去驗證……網速好很差咱先不說,每次都去服務器同步走一遭就夠你受的……
這個怎麼破呢?其實只要把驗證的破了之後,這個天然就沒有什麼影響了。若是你執意要破,那我也給你一句代碼:
$("#randCode").unbind("keyup")
這句話稍微有點jquery功底的人就能看懂,直接移除keyup事件,不去監聽就一了百了了。
固然,移除了keyup事件之後,你再去按enter鍵是不可以登錄的,須要你去點擊登錄按鈕,這是一個反作用。
只是一個簡單的登錄頁面,就已經讓我忍不住開始吐槽了(這多是由於我今天沒有買到車票吧)。下面是給12306開發人員的幾個建議:
第一,不要去服務器校驗驗證碼,不論是異步仍是同步
第二,若是非要去校驗,請不要使用keyup事件去驗證,可使用onchange來代替
第三,若是非要去檢驗,請將用戶名和密碼一併傳給服務器,數據量不會大多少,可是請求數量最少可以減小一倍,還減去了點擊登錄按鈕的麻煩
去年搶票的時候有一個搶票的插件,很方便咱們程序員購票,今年不同了,12306集成了,雖然依然很方便,可是不少細節卻不如去年。那麼怎樣才能保證買到回家的車票呢?
第一步,模擬購票流程。爲了今天的購票,我作了充足的準備:前一天下午走了一遍購票流程,一直到付款環節(拿着票源充足的臨客測試)。
第二步,提早登錄。最起碼要在搶票開始前十分鐘登錄的到系統,而後設置好本身要訂的車次、乘車人和席別。若是你信得過自動提交訂單功能,就讓系統一直刷着,有票了只須要輸入一個驗證碼就能夠了。
第三步,多開瀏覽器,使用不一樣的瀏覽器登錄搶票。個人機器上面自己已經裝了IE、chrome和firefox,買票前將三個都打開,分別登錄,即便你只有一個帳號也能夠同時在三個瀏覽器裏面登錄。
第四步,使用插件。雖然今年插件不像去年那樣火熱,可是想獵豹瀏覽器仍是除了搶票專版,今天下午我已經測試了一下,能夠買到票。不知道明天早上還可不能夠(12306有夜裏發佈系統的習慣)。
第五步,使用手機客戶端。12306官方有一個購票的客戶端,雖然已到搶票的時候就卡的要死,老提示網絡異常,但也算是一種途徑吧。
最後,祝全部朋友都能順利的買到回家的車票……
歡迎分享購票經驗……
搶到票的朋友快來分享大家的購票經驗吧,幫助更多的人買到回家的車票。