注入的 Javascript 不会覆盖 UiWebView 中的 URL
Posted
技术标签:
【中文标题】注入的 Javascript 不会覆盖 UiWebView 中的 URL【英文标题】:Injected Javascript not overriding URL in UiWebView 【发布时间】:2014-07-06 14:40:11 【问题描述】:在将本地 .js 文件注入到 UIWebView 中另一台服务器托管的外部页面的过程中。
虽然我是新手,但我觉得下面的代码应该渲染一个远程 html 页面并用本地 js 覆盖它。文件。实际上它只是加载没有js的页面。
我的ViewController.m:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//load url into webview
NSString *strURL = @"http://localhost:9080/test/";
NSURL *url = [NSURL URLWithString:strURL];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[self.viewWeb loadRequest:urlRequest];
NSString *js = [[NSBundle mainBundle] pathForResource:@"script" ofType:@"js" inDirectory:@"www" ];
[self.viewWeb stringByEvaluatingjavascriptFromString:js];
.js 文件 (script.js) 正在将 .css 文件 (style.css) 注入到外部 html 页面的标题中:
var link = document.createElement("link");
link.href = "style.css";
link.type = "text/css";
link.rel = "stylesheet";
document.getElementsByTagName("head")[0].appendChild(link);
外部页面的 HTML (index.html) 是:
<html>
<head>
<meta name="viewport" content="initial-scale=1">
</head>
<body>
<div class="big">TEXT</div>
</body>
</html>
这些文件位于www
目录中,该文件夹作为“使用创建文件夹引用复制”导入Xcode。
在 Xcode 项目之外,如果我将 .js、.html、.css 放在一个文件夹中,一切都会正常工作。但是一旦我启动模拟器,它就不行了。有谁知道我做错了什么?
【问题讨论】:
你做了什么来确保javascript正确加载到变量js
中?你有 NSLogged 或设置断点吗?您当然没有使用错误变量并检查它以确保一切正常......
在外部,如果所有三个文件都在同一个文件夹中,它们就可以工作。但不确定您对 NSLogged 或断点的含义。 Xcode 编译后不显示任何错误。
这一行:NSString *js = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:NULL];
该方法采用NSError **
类型的参数。你不打扰它。你没有在这一行之后设置断点并检查js
,你也没有在做NSLog(@"%@",js);
那么你怎么知道Javascript文件被成功读取了?
嗨,我明白你在说什么,我删除了那组代码。因为我没看懂那部分代码。
...你在开玩笑吗?你的代码看起来大部分是正确的,现在它看起来完全错误。请发布您实际使用的代码。在此处进行编辑之前,请在 IDE 中进行编辑并尝试编译并运行它,看看有什么不同...
【参考方案1】:
我不是 Javascript 专业人士,但正如所写:
NSString *js = [[NSBundle mainBundle] pathForResource:@"script" ofType:@"js" inDirectory:@"www" ];
[self.viewWeb stringByEvaluatingJavaScriptFromString:js];
我不认为这可能会奏效。
pathForResource:ofType:inDirectory:
返回文件的路径。再说一次,我对 Javascript 几乎一无所知,但我非常怀疑文件路径会不会看起来像任何 Javascript。
NSString *js = [[NSBundle mainBundle] pathForResource:@"script" ofType:@"js" inDirectory:@"www" ];
NSLog(@"%@",js);
试试 sn-p 看看打印的内容。它会打印两件事之一。如果找到该文件,它将打印该文件的文件路径。如果未找到填充,它将打印“(null)”(或类似的内容,因为如果未找到文件,pathForResource:ofType:inDirectory:
方法将返回 nil
)。
为了获取该路径下的文件内容,需要使用stringWithContentsOfFile:encoding:error:
,一个NSString
类方法。
【讨论】:
以上是关于注入的 Javascript 不会覆盖 UiWebView 中的 URL的主要内容,如果未能解决你的问题,请参考以下文章
浏览器扩展:如何将 javascript 代码注入页面而不会发生冲突?
使用 JavaScript 将 CSS 注入 UIWebView