独书先生 Menu

All items for 8月, 2020

jquery error Uncaught TypeError: ((x.event.special[i.origType] || (intermediate value)).handle || i.handler).apply is not a function

问题

jquery error:

Uncaught TypeError: ((x.event.special[i.origType] || (intermediate value)).handle || i.handler).apply is not a function

思路

可能的问题来源

按照网上的方法一一排查
1. 事件监听的函数没有具体内容

// Not Working
$('#btnClick').click(function(){   //code })
  1. 调用的方法不存在
var foo = {
bar1: function(){
    alert('working');
}
};


// Not Working because bar2 doesn't exist
$('body').on('click', '.my-button', foo.bar2);

// Working
$('body').on('click', '.my-button', foo.bar1);

  1. 手误绑定了两次
// Not Working
$(document).on('change', '#selectInput').on('change', '#selectInput', function () {});

// Working
$(document).off('change', '#selectInput').on('change', '#selectInput', function () {});

  1. 监听写法错误
// Not Working
$('body').click('click','.delete_item',function(e){})

// Working
$('body').on('click','.delete_item',function(e){}) 

  1. 监听事件handler不是function
// Not Working
$('.foo').click($('.bar').trigger('click'));

// Working
$('.foo').click(function () {
  $('.bar').trigger('click');
});
  1. 监听的元素不存在
// Not Working if '.js-test' didn't exist anymore.
$(document).on('click', '.js-test', App.test);

一般情况下,监听写的不多,或者已知最近改了哪几个地方,是可以查出来的。但是如果元素特别多,一眼看不出来的情况,就需要使用点调试手段。

如何调试出问题点?

步骤:
1. 格式化format jquery
2. 找到报错的地方,在后面打印event的console,参考如下打印方法:

((p.event.special[r.origType] || {}).handle || r.handler).apply(o.elem, l) || console.log(t)
  1. 复现bug,在报错出现后,找到报错之前的console日志,点开event找到handleObj.handler,一般情况下这个handler是一个function,你可以看看其他正常的情况,但是在这里,这可能是一个对象或者字符串,所以在这之后绑定的apply会报错,这时候就能根据这里的信息,去代码里搜索定位了。

比如我的错误是这样的,我在这个位置的handler是

{
    guid: 12
    preventScroll: true
}

是一个对象,随机搜索’preventScroll’发现了一段代码

$("#" + selector).attr("tabindex", 0).focus({
    preventScroll: true 
});

但是focus里面是支持这种写法的,所以删除tabindex即可

$("#" + selector).focus({      
    preventScroll: true 
});

参考

https://stackoverflow.com/questions/32231036/uncaught-typeerror-x-event-speciali-origtype-intermediate-value-handl

python处理excel之excel单元格内容首字符去除

需求

excel首列的单元格内容,首字符去除,如何做?

思路

使用 openpyxl 第三方库,打开excel,首字符去除,使用字符串截取方法取得除了第一个字符外的字符str[1:],再赋值回去,保存excel

代码

演示处理 A2:A5 单元格的内容

from openpyxl import Workbook
from openpyxl import load_workbook

wb = load_workbook(filename = 'workbook1.xlsx')

sheet_ranges = wb['Sheet1']

rangeColumn = range(2,6)
for i in rangeColumn:
    cell = "A" + str(i)
    sheet_ranges[cell] = str(sheet_ranges[cell].value)[1:]

wb.save("workbook2.xlsx")

扩展

根据示例代码,可以自行扩展为更通用的方法,比如循环A列单元格的值,一直取到空值停止,这样就可以处理多个不同的excel了。