input 输入框对中文输入法的优化

参考

  1. 实时监控用户输入—中文输入解决方案
  2. input事件中文触发多次问题研究
  1. $('input').on({
  2. keyup : function(e){
  3. var flag = e.target.isNeedPrevent;
  4. if(flag) return;
  5. response() ;
  6. e.target.keyEvent = false ;
  7. },
  8. keydown : function(e){
  9. e.target.keyEvent = true ;
  10. },
  11. input : function(e){
  12. if(!e.target.keyEvent){
  13. response()
  14. }
  15. },
  16. compositionstart : function(e){
  17. e.target.isNeedPrevent = true ;
  18. },
  19. compositionend : function(e){
  20. e.target.isNeedPrevent = false;
  21. }
  22. })
  23. function response(){
  24. $('div').append('<p>事 件触发</p>')
  25. }

通用表格 CheckBox 插件

  1. /**
  2. * @file 通用checkbox
  3. * @author
  4. */
  5. $(function () {
  6. var selectedItemNum = 0;
  7. $(document).on('click', '.jq_checkbox', function () {
  8. var $this = $(this);
  9. $this.toggleClass('icon-checkbox-false icon-checkbox-true');
  10. if ($this.hasClass('jq_all_checkbox')) {
  11. var className = $this.hasClass('icon-checkbox-true') ? 'icon-checkbox-true' : 'icon-checkbox-false';
  12. if (className === 'icon-checkbox-true') {
  13. selectedItemNum = 0;
  14. }
  15. $('.jq_checkbox.jq_sub_checkbox').each(function () {
  16. if (className === 'icon-checkbox-true') {
  17. $(this).removeClass('icon-checkbox-true icon-checkbox-false');
  18. selectedItemNum++;
  19. } else {
  20. $(this).removeClass('icon-checkbox-true icon-checkbox-false');
  21. selectedItemNum--;
  22. }
  23. $(this).addClass(className);
  24. });
  25. } else {
  26. if ($this.hasClass('icon-checkbox-false')) {
  27. selectedItemNum--;
  28. } else {
  29. selectedItemNum++;
  30. }
  31. var $allCheckbox = $('.jq_all_checkbox');
  32. if (selectedItemNum === parseInt($allCheckbox.data('pageSize'), 10)) {
  33. $allCheckbox.toggleClass('icon-checkbox-false icon-checkbox-true');
  34. } else {
  35. if ($allCheckbox.hasClass('icon-checkbox-true')) {
  36. $allCheckbox.toggleClass('icon-checkbox-false icon-checkbox-true');
  37. }
  38. }
  39. }
  40. if (selectedItemNum !== 0) {
  41. $('.jq_multi_status_btn').each(function () {
  42. $(this).addClass('active');
  43. });
  44. } else {
  45. $('.jq_multi_status_btn').each(function () {
  46. $(this).removeClass('active');
  47. });
  48. }
  49. });
  50. });
  51. function getSelectedItemVals(valueKey) {
  52. var arr = [];
  53. $('.jq_checkbox').each(function () {
  54. if ($(this).hasClass('icon-checkbox-false')) {
  55. return;
  56. }
  57. var id = $(this).data(valueKey);
  58. if (id !== undefined) {
  59. id = id.toString();
  60. arr.push(id);
  61. }
  62. });
  63. return arr;
  64. }

select 默认值以及 placeholder

设置第一个 option 为默认值,如果不需要看到直接隐藏即可,相当于 placeholder 的效果。

  1. <select name="levelSelect" id="levelSelect" class="jq_config_level level-select">
  2. <option value="" style='display:none' selected>请选择</option>
  3. <option value="1"></option>
  4. <option value="2"></option>
  5. <option value="3"></option>
  6. </select>
  7. <i class="caret"></i>

但是设置的默认值,只会在其值不存在时生效,即使设置为 undefined 也不起作用,此时可以把默认值设置为:

  1. <option value="null" style='display:none' selected>请选择</option>

后面只需要把这个控件的值设置为 null 即可。

原因是,表单的值都是字符串,当设置为 null 时,其会被转化为字符串 ‘null’,也就匹配上了默认值 ‘null’。

文件上传

文件的上传依赖于 Form 表单的直接提交,后台需要的是 Form data。而我们不再像是以往的通过表单提交来与后台交互,而是通过 Ajax 请求来完成。那么我们就应该自行制作表单数据。

原生 JS 提供了 FormData 类,可以创建我们所需的 Form data 数据。

使用方法很简单:

  1. // 创建实例
  2. let formdata = new FormData();
  3. // 加入数据
  4. formdata.append(key, value);
  5. // 可以直接在创建实例时,传入表单,这样就会把表单中的字段都添加进去
  6. new FormData($('#userForm')[0]);

那么文件的上传应该怎么去做呢?

我们使用原生的 input 控件:

  1. <form enctype="multipart/form-data"> // 这个类型必须要加上,尝试过在 JQ 的 ajax 中添加为 content-type,后台接收不到,原生也许可以
  2. <input type="file" id="filename"> // 加上 multiple 为多选
  3. </form>

当上传文件之后,这个元素对象中存储了文件信息。

  1. let file = document.getElementById('filename');
  2. formdata.append('file', file.files[0]);

file 类型控件中通过 files 存储文件信息。files 是一个数组,保存着多个信息。

之后,我们只需要把其他需要的信息放入 formdata 即可,然后把 formdata 传给后台。需要注意的是,要修改 content-type 为 false,processData 为 false。

原生 JS 实现参考:

  1. function UpladFile() {
  2. var fileObj = document.getElementById("file").files[0]; // js 获取文件对象
  3. var url = "http://localhost:8080" + "/api/attachment/upload"; // 接收上传文件的后台地址
  4. var form = new FormData(); // FormData 对象
  5. form.append("file", fileObj); // 文件对象
  6. xhr = new XMLHttpRequest(); // XMLHttpRequest 对象
  7. xhr.open("post", url, true); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。
  8. xhr.onload = uploadComplete; //请求完成
  9. xhr.onerror = uploadFailed; //请求失败
  10. xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】
  11. xhr.upload.onloadstart = function(){//上传开始执行方法
  12. ot = new Date().getTime(); //设置上传开始时间
  13. oloaded = 0;//设置上传开始时,以上传的文件大小为0
  14. };
  15. xhr.send(form); //开始上传,发送form数据
  16. }

JQ 参考:

  1. $("#btn").click(function(){
  2. var formData = new FormData();
  3. formData.append("pic",document.getElementById("upfile").files[0]);
  4. $.ajax({
  5. type: "POST", // 数据提交类型
  6. url: "upfile.php", // 发送地址
  7. data: formData, //发送数据
  8. processData: false, // processData 必须设置为 false,不处理数据
  9. contentType: false
  10. });
  11. });

阻止 input 输入框回车自动提交表单

输入框回车自动提交表单的情况有下面两种:

  • form 元素中,存在 button,且其 type = ‘submit’(注意,没有 type 时,默认值为 submit),存在一个或多个输入框回车,自动提交表单
  • form 元素中,只存在单个输入框,包含类型:text/email/password/number/url/search 等,无论 button 类型是什么,均为自动提交表单

解决方案:

  • 使用 button 一定要写上类型为 button
  • 在 form 表单或 input 中加入:onkeydown=”if(event.keyCode==13){return false;}” 事件阻止默认行为
  • 增加一个隐藏的输入框 input=”text” display=’none’,注意不是类型为 hidden 的 input。

判断 checkbox radio 是否选中

使用原生 checked 属性:

  1. Dom.checked; // 选中为 true, 否则为 false。非 checkbox 或 radio 为 false

使用 JQ 的 is(‘:checked’) 判断。