目录
待整理
一、在原生端实现H5页面长按下载图片的功能
js注入实现:
注入一段js代码,这段代码监控长按事件
检测到长按的元素是IMG时,通过jsbridge调用原生回调将url传回原生
原生回调内下载图片并保存到本地
- (void)addLongPressSaveImgForXiaoC:(WKWebViewConfiguration*)configuration {
// NSString *scriptSource = @"\
// var timeout; \
// document.body.addEventListener('touchstart', function(event) { \
// console.log('Body touchstart');\
// event.preventDefault(); \
// if(event.target.tagName === 'IMG') { \
// timeout = setTimeout(function() { \
// window.webkit.messageHandlers.imageHandler.postMessage(event.target.src); \
// }, 1000); \
// } \
// }, false); \
// document.body.addEventListener('touchend', function(event) { \
// console.log('Body touchend');\
// clearTimeout(timeout); \
// }, false);";
// NSString *scriptSource = @"\
// var timeout; \
// var touchStartTime; \
// var touchStartX; \
// var touchStartY; \
// var touchStartDist; \
// \
// function getDistance(touches) { \
// if (touches.length < 2) return 0; \
// var dx = touches[0].pageX - touches[1].pageX; \
// var dy = touches[0].pageY - touches[1].pageY; \
// return Math.sqrt(dx * dx + dy * dy); \
// } \
// \
// document.body.addEventListener('touchstart', function(event) { \
// console.log('Body touchstart'); \
// touchStartTime = Date.now(); \
// if (event.touches.length === 1) { \
// touchStartX = event.touches[0].pageX; \
// touchStartY = event.touches[0].pageY; \
// } else if (event.touches.length === 2) { \
// touchStartDist = getDistance(event.touches); \
// } \
// \
// if (event.target.tagName === 'IMG') { \
// timeout = setTimeout(function() { \
// window.webkit.messageHandlers.imageHandler.postMessage(event.target.src); \
// }, 1000); \
// } \
// }, false); \
// \
// document.body.addEventListener('touchmove', function(event) { \
// console.log('Body touchmove'); \
// if (event.touches.length === 1) { \
// var moveX = event.touches[0].pageX - touchStartX; \
// var moveY = event.touches[0].pageY - touchStartY; \
// if (Math.abs(moveX) > 10 || Math.abs(moveY) > 10) { \
// clearTimeout(timeout); \
// } \
// } else if (event.touches.length === 2) { \
// var moveDist = getDistance(event.touches); \
// if (Math.abs(moveDist - touchStartDist) > 10) { \
// clearTimeout(timeout); \
// } \
// } \
// }, false); \
// \
// document.body.addEventListener('touchend', function(event) { \
// console.log('Body touchend'); \
// clearTimeout(timeout); \
// }, false); \
// ";
//
NSString *scriptSource = @"\
var touchStartTime; \
var touchStartX; \
var touchStartY; \
\
document.body.addEventListener('touchstart', function(event) { \
console.log('Body touchstart'); \
touchStartTime = Date.now(); \
touchStartX = event.pageX; \
touchStartY = event.pageY; \
}, false); \
\
document.body.addEventListener('touchend', function(event) { \
console.log('Body touchend',event); \
if (event.target.tagName === 'IMG') { \
console.log('IMG touchend'); \
var touchTime = Date.now() - touchStartTime; \
var moveX = Math.abs(event.pageX - touchStartX); \
var moveY = Math.abs(event.pageY - touchStartY); \
console.log('touchTime:',touchTime, 'moveX:',moveX,'moveY:',moveY); \
if (touchTime > 1000 && moveX < 10 && moveY < 10) { \
window.webkit.messageHandlers.imageHandler.postMessage(event.target.src); \
} \
} \
}, false); \
";
// NSString *scriptSource = @"\
// function traverseAndAddEventListener(node) { \
// console.log('traverseAndAddEventListener 调用'); \
// // 检查节点是否为img标签 \
// if (node.tagName === 'IMG') { \
// node.addEventListener('touchmove', function(event) { \
// // 处理触摸移动事件的代码 \
// console.log('Image touchmove'); \
// // 添加您想要执行的逻辑 \
// }, false); \
// \
// node.addEventListener('touchstart', function(event) { \
// // 处理触摸移动事件的代码 \
// console.log('Image touchstart'); \
// // 添加您想要执行的逻辑 \
// }, false); \
// } \
// \
// // 递归遍历子节点 \
// var children = node.childNodes; \
// for (var i = 0; i < children.length; i++) { \
// traverseAndAddEventListener(children[i]); \
// } \
// } \
// \
// // 从document.body开始遍历 \
// traverseAndAddEventListener(document.body); \
//";
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:scriptSource injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[configuration.userContentController addUserScript:userScript];
[configuration.userContentController addScriptMessageHandler:self name:@"imageHandler"];
}
二、完善pod库私有化的流程
三、flutter 引擎 梳理
四、flutter的页面是如何加载的
两个重要的参数:entrypoint 和 route 并且route可以携带query参数
route在flutter处需要有对应的注册
[flutterEngine runWithEntrypoint:@"main" initialRoute:[NSString stringWithFormat:@"/%@", routeString]];
五、网络代理检测提示
待整理2
硬件 驱动 kernel
FW
Git 是如何管理文件夹的
为什么同事删除了文件夹我拉取后文件夹还在?
flutter attach 的原理
studio 解决冲突
先处理冲突,冲突解决完后然后左右全进
Kernel
DSL flutter 热更新的原理
鸿蒙数据库
待整理3
玄关 宽120 高2米1
阳台宽1米3,长2米2 晾衣架:吊顶25公分
电钻
防火用品
戴森吸尘器
餐边柜
厨房架子
行者常至,为者常成!