我创建了一个示例应用程序,其中包含 hooleyhoop 在 cmets 中提到的另一个 SO 问题中的功能。
这就是我最终的结果:
- (void)webViewDidFinishLoad:(UIWebView *)wv {
// Called when the website has finished loading and triggers the JS code
NSString *javascript = @"function simulate(element, eventName) \
{ \
var options = extend(defaultOptions, arguments[2] || {}); \
var oEvent, eventType = null; \
for (var name in eventMatchers) \
{ \
if (eventMatchers[name].test(eventName)) { \
eventType = name; break; \
} \
} \
if (!eventType) { \
alert('Only HTMLEvents and MouseEvents interfaces are supported'); \
} \
if (document.createEvent) \
{ \
oEvent = document.createEvent(eventType); \
if (eventType == 'HTMLEvents') \
{ \
oEvent.initEvent(eventName, options.bubbles, options.cancelable); \
} \
else \
{ \
oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView, options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY, options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element); \
} \
element.dispatchEvent(oEvent); \
} \
else \
{ \
options.clientX = options.pointerX; \
options.clientY = options.pointerY; \
var evt = document.createEventObject(); \
oEvent = extend(evt, options); \
element.fireEvent('on' + eventName, oEvent); \
} \
return element; \
} \
function extend(destination, source) { \
for (var property in source) \
destination[property] = source[property]; \
\
return destination; \
} \
var eventMatchers = { \
'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/, \
'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/ \
}; \
var defaultOptions = { \
pointerX: 0, \
pointerY: 0, \
button: 0, \
ctrlKey: false, \
altKey: false, \
shiftKey: false, \
metaKey: false, \
bubbles: true, \
cancelable: true \
}; \
window.setTimeout(function() { \
var links = document.getElementsByTagName('a'); \
for(var i in links) { \
if(links[i].innerHTML == 'Test') { \
simulate(links[i], 'click'); \
} \
} \
},1);";
// Execute JS
[webView stringByEvaluatingJavaScriptFromString:javascript];
}
测试 HTML
<html>
<head>
<title>Testpage</title>
</head>
<body>
<a href="http://www.google.com">I'm linking to google.com</a><br />
<a href="http://www.stackoverflow.com">Test</a>
</body>
</html>
- (void)webViewDidFinishLoad:(UIWebView *)wv
这是 UIWebView 的委托函数,它会在 Web 视图完成加载网站后立即调用。
NSString *javascript = @"..."
这就是我构建 JS 代码的地方,一开始,触发点击的另一个 SO 问题的函数。最后,我设置了一个超时,执行查找所有“a”标签的部分,循环遍历它们,检查它的 innerHTML 文本是否为“Test”,如果是这种情况,它使用 a 元素调用 simulate 函数作为第一个参数,事件类型作为第二个参数。砰,链接被点击了。
我使用了超时,因为它导致直接执行 JS 出现问题,似乎 UIWebView 需要一些时间才能模拟功能可用。
干杯,
比约恩