富文本ZSSRichTextEditor是iOS原生與網頁交互的集大成者,各種交互。自然問題也是多多,這篇文文章陸續更新遇到的奇葩問題。
1.問題1:從頭條這種文章里頭復制粘貼的文章,里邊有圖片,我們需求並不需要,如何過濾?
干了客戶端,一開始額思路,總想從客戶端的webview里頭找出路,忙活半天,並未發現可以下手的地方,最后只能從網頁這邊想辦法。
#####最后確定如下思路:
找到html中zss_editor_content這個div容器的粘貼動作(onpaste)-- 在這個方法中遍歷html內容(刪除非我們上傳的圖片)
下面就是為html中的zss_editor_content容器 添加粘貼事件,由於不延時的話,執行zss_editor.deleteOutAppImg方法,即遍歷圖片內容的時候,粘貼還沒完成,所以延時500ms
<body > <!-- ZSSRichTextEditor Editable Content --> <!-- 給這個容器添加了一個粘貼事件,延時500毫秒,不然執行事件的時候,web還沒有內容,沒法刪除 --> <div id="zss_editor_content" onpaste="setTimeout('zss_editor.deleteOutAppImg()', 500);" class="zs_editor_content" contenteditable="true" placeholder="請輸入正文"></div> </body>
問題來了,如何知道html的圖片不是我們上傳的圖片??
- 從圖片本身並無好的方法,只能是正則匹配,不符合我們服務器圖片的刪去,但是這太牽強了,比如某個外來圖片剛好符合,那不是gg了
- 剛好我們的圖片有刪除功能,自然每個圖片標簽在插入的時候,點擊事件就攜帶了一個我們定義的屬性,所以通過判斷html內容中img是否攜帶這樣的因子,不帶的就不是我們手動插入的,刪除(當然下面也會總結下,刪除圖片的方法)
下面是插入圖片,就是圖片攜帶因子的瞬間
//插入圖片讓換行 zss_editor.insertImage = function(url, alt) { zss_editor.restorerange(); var html = '<img src="'+url+'" alt="'+alt+'" onclick="zss_editor.deleteImg(0,this)"/><div><br/></div>'; zss_editor.insertHTML(html); zss_editor.focusEditor(); zss_editor.enabledEditingItems(); }
接下來看看刪除的具體方法,使用還是jquery,高端了
//使用jquery刪除不是自己上傳的圖片--感謝金哥的鼎力相助
/*自己的圖片有zss_editor.deleteImg(0,this)事件,外頭的圖片沒有*/
zss_editor.deleteOutAppImg = function() {
$('img').each(function(index, obj){
if($(this).attr('onclick') != 'zss_editor.deleteImg(0,this)'){
$(this).remove();
}
});
}
到這里這個外邊圖片的問題就解決了
2.問題2:如何刪除編輯器中已經上傳的圖片
嘗試過,網頁直接彈出一個alertview,但是有坑,網頁控制彈出的alertview,他的title是無法自定義的,一直寫個null之類的東西,直接棄用
所以最后只能采用,js調用原生,原生再次調用js,處理這個問題
代碼如下;
zss_editor.deleteImg = function(type,obj) {
if(type == 0){
object = obj;
deleteNowImg();//調用原生方法
}else {
$(object).remove();
}
}
//在該方法里定義了如下方法,原生調用js
- (void)webViewDidFinishLoad:(UIWebView *)webView {
MJWeakSelf;
ctx[@"deleteNowImg"] = ^() {//刪除圖片
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf deleteImg];
});
};
}
//原生方法,調用alertview
- (void)deleteImg {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"確認刪除圖片?"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"確定",nil];
[alert show];
}
//再次交互,原生調用js,刪除圖片
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex == 1) {
NSString *trigger = [NSString stringWithFormat:@"zss_editor.deleteImg(\"%@\", \"%@\");", @"1", @""];
[self.editorView stringByEvaluatingJavaScriptFromString:trigger];//原生通過js調用刪除方法
}
}
兩端交互,實現圖片的刪除功能
codeBy-Zqk 2018-03-21 08:45:08