Javascript 如何以编程方式设置WebKit密码文本字段的值?

Javascript 如何以编程方式设置WebKit密码文本字段的值?,javascript,objective-c,cocoa,macos,webkit,Javascript,Objective C,Cocoa,Macos,Webkit,更新:这个问题是废话。往前走,这里没什么可看的。您可以从JS或ObjC设置密码文本字段的值。我错了。 我有一个基于WebKit的Cocoa应用程序,它在WebView中加载包含HTML表单的HTML文档。HTML表单包含密码文本字段,如: <form name="foo"> <input type="password" name="bar"> </form> 这没有效果。如何尝试将该字段设置为普通文本字段,然后在字段显示为:无时以编程方式将其更改为密

更新:这个问题是废话。往前走,这里没什么可看的。您可以从JS或ObjC设置密码文本字段的值。我错了。

我有一个基于WebKit的Cocoa应用程序,它在
WebView
中加载包含HTML表单的HTML文档。HTML表单包含密码文本字段,如:

<form name="foo">
    <input type="password" name="bar">
</form>

这没有效果。

如何尝试将该字段设置为普通文本字段,然后在字段显示为:无时以编程方式将其更改为密码字段,然后将其更改回可见。

我将使用-stringByEvaluatingJavaScriptFromString:

以下是我使用的内容(我在字段中添加了一个'id'属性,以便于抓取):


这种限制可能是因为DOM桥与javascript运行时直接挂钩到相同的代码中,因此需要绕过任何javascript/DOM桥

也许您可以将焦点设置在字段上(如果网桥允许的话),并将键盘事件发送到WebView或Document视图

或者,由于这些字段是本机OSX组件,因此您可以直接与它们进行对话(WebKit源代码应该可以帮助您找到如何访问它们)


抱歉,这两种解决方案都有点复杂,我不知道这是否有效!也许webkitdev邮件列表会有答案,或者您可以尝试询问1Password开发者;-)

这肯定会起作用,而无需通过任何障碍。我刚刚编写了一个快速测试应用程序,在SnowLeopard和Leopard上加载并登录,代码如下:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
    if (![[sender mainFrame] isEqual:frame])
        return;

    DOMHTMLFormElement *form = (DOMHTMLFormElement *)[[frame DOMDocument] getElementById:@"gaia_loginform"];
    DOMHTMLInputElement *username = (DOMHTMLInputElement *)[[form elements] namedItem:@"Email"];
    [username setValue:@"myemailacct"];

    DOMHTMLInputElement *password = (DOMHTMLInputElement *)[[form elements] namedItem:@"Passwd"];
    [password setValue:@"omghi"];

    [form submit];
}
我也有非常类似的代码在工作中,其唯一的工作是登录到网站,它一直在老虎上工作了一年。在这种情况下,我会做所有事情,包括通过代码创建WebView。如果Safari的autofill没有使用与此非常类似的代码,我也会非常惊讶

也就是说,我会确保你的应用程序不会对网络视图造成任何疯狂的影响。您是否在其他地方对DOM进行了任何其他修改?试着像我一样在一个示例应用程序中这样做,看看它是否在那里工作

您正在加载的HTML是您自己的还是在远程服务器上?一些网站包含Javascript,可以在加载时或加载后一两秒钟清除表单字段,以防止自动填充。也许你碰到了

如果所有其他操作都失败,请确保没有任何内容记录到WebView的控制台。通过打开web检查器或临时实现私有WebUIDelegate方法,您可以看到:

- (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message;

我不认为这会有什么帮助,因为您无法从JavaScript设置密码字段的值。我可能遗漏了一些内容,但我刚才添加到答案中的代码对我很有用。不,我完全错了。道歉。直接从ObjC和JavaScript设置该值。我的全部问题都是废话:(.不知道我以前做错了什么,但我想我已经解决了:|谢谢Charles,我认为这些都是好主意,我会研究它们的。更新:整个问题都是废话。你可以从JavaScript或Objective-C设置值。我在最初测试时一定是设置有问题。不知道什么:(对不起,谢谢,马特,是的,你是对的。我的初始测试肯定有其他问题。对不起。
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
    if (![[sender mainFrame] isEqual:frame])
        return;

    DOMHTMLFormElement *form = (DOMHTMLFormElement *)[[frame DOMDocument] getElementById:@"gaia_loginform"];
    DOMHTMLInputElement *username = (DOMHTMLInputElement *)[[form elements] namedItem:@"Email"];
    [username setValue:@"myemailacct"];

    DOMHTMLInputElement *password = (DOMHTMLInputElement *)[[form elements] namedItem:@"Passwd"];
    [password setValue:@"omghi"];

    [form submit];
}
- (void)webView:(WebView *)webView addMessageToConsole:(NSDictionary *)message;