gpt4 book ai didi

objective-c - 从 Cocoa/Objective-C 添加新元素到 WebFrame 的 DOM

转载 作者:搜寻专家 更新时间:2023-10-30 20:23:09 25 4
gpt4 key购买 nike

我正在开发一个使用 WebView 来显示其大部分内容的项目。内容是从我没有编写且无法控制的磁盘上的 HTML 文件加载的。我希望能够将自定义 CSS 样式应用于加载到 View 中的每个页面。为此,我在 -(void)webView:didFinishLoadForFrame:

中实现了以下代码片段
DOMDocument *doc = [frame DOMDocument];
DOMElement *link = [doc createElement:@"link"];
[link setAttribute:@"rel" value:@"stylesheet"];
[link setAttribute:@"type" value:@"text/css"];
[link setAttribute:@"href" value:[cssPath path]];
DOMNodeList *heads = [doc getElementsByName:@"head"];
[[heads item:0] appendChild:link];

我已经在 J​​avaScript 文件中尝试了相同的语句序列(在 JavaScript 中,当然不是 Objective-C)并且它成功了。但是,上面的代码不起作用。我已经使用 Xcode 调试器逐步完成它,看起来一切正常(变量已使用有效数据正确初始化等),但我没有看到框架发生变化。我究竟做错了什么?有没有更好的方法来完成我想要完成的事情?有什么理由可以在 JavaScript 而不是 Objective-C 中运行?

编辑:过去几天我一直在研究这个问题。我仍然无法使用 DOM* 对象,但这样做我得到了一些结果:

NSString *js = @"var link = document.createElement('link');";
js = [js stringByAppendingString:@"link.setAttribute('rel', 'stylesheet');"];
js = [js stringByAppendingString:@"link.setAttribute('type', 'text/css');"];
js = [js stringByAppendingFormat:@"link.setAttribute('href', '%@');",
[defaultCSSURL path]];
js = [js stringByAppendingString:
@"document.getElementsByTagName('head')[0].appendChild(link);"];
[[view windowScriptObject] evaluateWebScript:js];

我对这个解决方案不是特别满意,但这是我能够让它发挥作用的唯一方法。请注意,defaultCSSURL 是指向项目中 CSS 文件的静态 NSURL。

最佳答案

我不确定为什么这个特定示例会失败,但我已经通过使用脚本对象在页面上执行 javascript(和 jquery,因为它非常方便)来完成此操作:

    [scriptobj evaluateWebScript:@"$('#my_div').append('my text');"];

脚本对象可以通过设置对象为webview delegate(webView:windowScriptObjectAvailable)

但这只是一种方法。我知道我在处理 DOMDocument 对象本身时遇到了很多麻烦。

关于objective-c - 从 Cocoa/Objective-C 添加新元素到 WebFrame 的 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4402859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com