对于我正在处理的项目,我需要在任何网页文档处理开始之前注入javascript.这可以通过WebBrowser组件轻松实现,但我在使用CefSharp时遇到了困难.
这是问题的简化,网页需要"InjectedObject"才能运行.在文档的最顶部调用未注入的网页,或者在处理文档之前进行评估/执行将导致:
===== html示例输出失败=====
isObjectPresent?
假
=====
我需要在哪里显示网页:
===== html示例输出成功=====
isObjectPresent?
真正
=====
<html>
<head>
<script>
isObjectPresent = typeof InjectedObject == "object";
</script>
</head>
<body>
<p>isObjectPresent?</p>
<div id="result"></div>
<script>
document.getElementById("result").innerHTML = isObjectPresent;
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
查看所有可用的建议将表明我应该使用LoadingStateChanged()或FrameLoadEnd()来注入脚本,即:
public void OnFrameLoadEnd(object sender, FrameLoadEndEventArgs args) {
if (args.Frame.IsMain) {
args.Frame.ExecuteJavascriptAsync("window.InjectedObject = {};");
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我尝试过的所有迭代,甚至使用FrameLoadStart,都导致在文档开始处理后出现插入的javascript.是否有任何真正的javascript注入示例确保它在文档处理开始之前发生.(确保避免竞争条件/时间问题).
作为我想模仿的WebBrowser组件行为的一个例子是:
private void uiWebBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
var browser = (WebBrowser)sender;
var document = browser.Document as HTMLDocument;
var head = document.getElementsByTagName("head").Cast<HTMLHeadElement>().First();
if (head != null)
{
var …Run Code Online (Sandbox Code Playgroud) 我们遇到了间歇性崩溃(有时会在某些设备上发生),我们很难确定该崩溃,并且无法按需重现。这与 Swift 3 和 WKWebView 组件有关,特别是当尝试通过 switch 语句获取错误代码时,其回调协议崩溃。见下文:
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
if let err = error as? URLError {
switch(err.code) { // Exception occurs on this line
case .cancelled:
Hint(hide: true)
case .cannotFindHost:
Hint(hide: false, hint:.CannotFindHost)
case .notConnectedToInternet:
Hint(hide: false, hint: .NoInternet)
case .resourceUnavailable:
Hint(hide: false)
case .timedOut:
Hint(hide: false)
default:
Hint(hide: false)
print("error code: " + String(describing: err.code) + " does not fall under known failures")
}
}
}
func Hint(hide: …Run Code Online (Sandbox Code Playgroud) 我正在生成我的第一组 npm 包来支持 react-native 环境。我希望以这样一种方式配置包,即内容在本质上是有组织的,并且可以通过客户端上的导入语句轻松区分。
给定在我的 npm 包中定义的 4 个函数定义(包名称:super-cool-animals):
蛇.ts
export function Boa() {}
export function Anaconda() {}
Run Code Online (Sandbox Code Playgroud)
鸟.ts
export function Pigeon() {}
export function Hawk() {}
Run Code Online (Sandbox Code Playgroud)
我希望库的使用者能够安装库:
npm install --save super-cool-animals
Run Code Online (Sandbox Code Playgroud)
然后像这样导入它们:
npm install --save super-cool-animals
Run Code Online (Sandbox Code Playgroud)
我很难确定实现这一点的正确机制,我相信我已经在某些环境中看到了这种机制(即角)
我看到了一些建议,允许您使用index.ts文件将它们组合成单个变量:
蛇/ index.ts
import { Boa, Anaconda } from 'super-cool-animals/snakes'
import { Pigeon, Hawk } from 'super-cool-animals/birds'
Pigeon(); // direct access to the function!
Run Code Online (Sandbox Code Playgroud)
鸟类/索引.ts
export * from './snakes.ts'
Run Code Online (Sandbox Code Playgroud)
./index.ts
export * from './birds.ts
Run Code Online (Sandbox Code Playgroud)
但这有一个丑陋的最终结果,你现在必须引用容器来获取函数:
图书馆消费者:
import * as …Run Code Online (Sandbox Code Playgroud)