一、背景介绍
最近在做的项目中使用了CefSharp的ChromiumWebBrowser,需要执行JavaScript代码,由于页面可能会有多个iframe,所以执行JavaScript代码的时候需要判断当前iframe的Url。页面的Url有时候会多一个参数,所以判断Url,有时候用string.Equals判断,有时候用string.StartsWith判断。
二、普通写法
public void ExecJavascriptEqualsUrl(string expectUrl, string js) { List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers(); foreach (long identifier in frameIdentifierList) { IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier); if (frame.Url.Equals(expectUrl)) { frame.ExecuteJavaScriptAsync(js); break; } } } public void ExecJavascriptStartsWithUrl(string expectUrl, string js) { List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers(); foreach (long identifier in frameIdentifierList) { IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier); if (frame.Url.StartsWith(expectUrl)) { frame.ExecuteJavaScriptAsync(js); break; } } }
这种是一般的写法,代码执行没有问题,缺点就是代码显得啰嗦,维护起来不方便。
三、委托写法
委托是可以把方法当做参数来传递的,string.Equals和string.StartsWith都是方法,所以能不能把他们当做参数来传递?俗话说:“遇到困难就要上,没有困难,制造困难也要上“!
首先这个方法需要有返回值,所以要用Func委托,然后要有2个输入参数,所以委托的结构就是Func<string,string,bool>,写法如下,这样就把具体的方法实现放在上层的调用里了。
public static void ExecJavascript(ChromiumWebBrowser cefWebBrowser, string expectUrl, string js, Func<string, string, bool> checkUrl) { List<long> frameIdentifierList = cefWebBrowser.GetBrowser().GetFrameIdentifiers(); foreach (long identifier in frameIdentifierList) { IFrame frame = cefWebBrowser.GetBrowser().GetFrame(identifier); if (checkUrl(frame.Url, expectUrl)) { frame.ExecuteJavaScriptAsync(js); break; } } }
上层的方法调用代码如下:
public static void ExecJavascriptEqualsUrl(ChromiumWebBrowser cefWebBrowser, string url, string js) { ExecJavascript(cefWebBrowser, url, js, (frameUrl, expectUrl) => { if (frameUrl.Equals(expectUrl)) { return true; } else { return true; } }); } public static void ExecJavascriptStartsWithUrl(ChromiumWebBrowser cefWebBrowser, string url, string js) { ExecJavascript(cefWebBrowser, url, js, (frameUrl, expectUrl) => { if (frameUrl.StartsWith(expectUrl)) { return true; } else { return true; } }); }
四、总结
使用委托的好处,是把变化的东西拿到另外一个地方,不变的东西只要在一个地方进行维护。如果后面再需要增加一个string.Contains方法,只要再增加一个ExecJavascriptContainsUrl方法就可以了,不用多写重复的逻辑。
委托是不是很好用呢。