注入的 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

ITMS-90809:不推荐使用的 API 使用 (UIWeb) - Xcode

如何将 UIWeb 视图控制器的内容分享到社交网站?

如何绕过Javascript中的sql注入错误

React JavaScript 中的代码注入