Kakao/WebKit, mit “ - Fenster.open()" JavaScript-links öffnen die in einer Instanz von Safari
Baue ich eine ganz einfache Cocoa-Anwendung mit WebKit zum anzeigen einer Flash - /Silverlight-Anwendung in es. Sehr basic, keine Absichten, denn es ist ein browser selbst.
So weit ich in der Lage gewesen, um es zu öffnen, grundlegende html-links (<a href="..." />
) in einer neuen Instanz von Safari mit
[[NSWorkspace sharedWorkspace] openURL:[request URL]];
Nun mein Problem ist das öffnen eines Links in einer neuen Instanz von Safari, wenn window.open()
ist in JavaScript verwendet. Ich "glaube" (und durch dieses,, ich habe die hacken den code und ich bin nicht sicher, ob ich das tatsächlich gemacht habe oder nicht) habe ich diese Art von Arbeit durch die Einstellung des WebView ist policyDelegate
und Umsetzung Ihrer
-webView:decidePolicyForNavigationAction:request:frame:decisionListener:
delegate-Methode. Doch dies führte zu etwas unberechenbar Verhalten.
Also die einfache Frage, was brauche ich zu tun, so dass, wenn window.open()
aufgerufen wird, wird der link geöffnet wird in einer neuen Instanz von Safari.
Dank
Großer Punkt ist, ich bin normalerweise eine .NET-Entwickler, und haben nur gearbeitet, mit Kakao/WebKit für ein paar Tage.
- Ich habe genau das gleiche problem. Es scheint ein Fehler zu sein, dass
webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener
ist nicht genannt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich aus Fortschritte der letzten Nacht und niedergerungen Teil meines Problems.
Ich bin schon mit
webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:
und ich habe es auf Arbeit mit Anker-tags, aber die Methode scheint nie bekommen wird aufgerufen, wenn das JavaScript aufgerufen wird.Jedoch, wenn
window.open()
heißtwebView:createWebViewWithRequest:request
heißt, ich habe versucht zu zwingen, die Fenster zu öffnen in Safari hier, jedoch fordern immer null ist. So kann ich nie Lesen Sie die URL aus.Ich habe getan, einige suchen um, und dies scheint ein bekanntes "misfeature" aber ich habe nicht in der Lage gewesen, einen Weg zu finden, das zu umgehen.
Was ich verstehen
createWebViewWithRequest
gibt Ihnen die Möglichkeit der Erstellung der neuen webview, die die angeforderte url wird dann an die neue webView geladen werden. Dies ist die beste Erklärung, die ich finden konnte, haben so weit.So, während viele Menschen haben darauf hingewiesen, dass dieses problem, ich habe noch zu sehen, jede Lösung, die passt zu meinen Bedürfnissen. Ich werde versuchen, etwas tiefer in die
decidePolicyForNewWindowAction
wieder.Dank!
Gut, ich bin Umgang, indem Sie einen dummy-webView-Einstellung ist es frameLoad delegieren, um eine benutzerdefinierte Klasse, die Griffe
und öffnet ein neues Fenster, dort.
code :
und NewWindowHandler :
Dort scheint ein Fehler zu sein mit
webView:decidePolicyForNewWindowAction:request:newFrameName:decisionListener:
dass die Anfrage immernil
, aber es ist eine robuste Lösung, die funktioniert sowohl mit normalentarget="_blank"
auch links, javascript diejenigen.Im Grunde nutze ich eine andere, Ephemere WebView Umgang mit dem neuen laden der Seite. Ähnlich wie Yoni-Shalom-aber mit ein wenig mehr syntaktischer Zucker.
Es zu verwenden, legen Sie zunächst eine delegate-Objekt für die WebView, in diesem Fall bin ich mir als Delegierten:
Dann einfach implementieren, die
webView:createWebViewWithRequest:
delegate-Methode, und verwenden Sie mein block-basierte API, um etwas zu tun, wenn eine neue Seite geladen wird, in diesem Fall bin ich das öffnen der Seite in einem externen browser:Das ist ziemlich viel es. Hier ist der code für meine Klasse. Header:
Implemetation:
Lizenz Apache 2.
Du nicht erwähnt, welche Art von Fehlverhalten, die Sie sehen. Eine schnelle Möglichkeit besteht darin, dass bei der Implementierung der delegate-Methode, die Sie vergessen zu sagen, das webview Sie ignorieren den Klick aufrufen der ignorieren-Methode der WebPolicyDecisionListener, die übergeben wurde, um Ihre Delegierten, die haben kann, die Dinge in einem seltsamen Zustand.
Wenn das nicht der Problem, dann, wie viel Kontrolle haben Sie über die Inhalte, die Sie anzeigen? Die Politik delegieren, haben Sie einfachen Mechanismen zum filtern aller Ressourcen -, Lasten (wie Sie entdeckt), und alle neuen Fenster öffnet sich über webView:decidePolicyForNewWindowAction:Anfrage:newFrameName:decisionListener:. Alle Fenster.offene Ausschreibungen sollten Trichter, durch, die, ebenso wie alles andere, das löst ein neues Fenster.
Wenn es andere Fenster öffnet, die Sie behalten möchten, innerhalb Ihrer app, werden Sie ein wenig mehr Arbeit. Eines der übergebenen Argumente in der Delegat ist ein Wörterbuch mit Informationen über das Ereignis. Insie Wörterbuch der WebActionElementKey wird ein Wörterbuch mit einer Anzahl von details, einschließlich der ursprünglichen dom-Inhalt der Verknüpfung. Wenn Sie möchten, zu stöbern, dort kannst du dir die aktuelle DOM-element, und prüfen Sie den text der href zu sehen, wenn es beginnt, mit Fenster.öffnen. Das ist ein bisschen schwer von Gewicht, aber wenn Sie möchten, Feinabstimmung, es wird es dir geben.
Durch das Lesen aller Beiträge, ich habe mit meiner einfachen Lösung, die alle funcs sind in derselben Klasse,hier ist es öffnet sich ein link mit dem browser.
Erklärung:
Windows erstellt von JavaScript über window.offen gehen Sie durch createWebViewWithRequest.
Alle Fenster.öffnen Sie fordert im Ergebnis eine createWebViewWithRequest: mit einem null-Anfrage, später dann eine Lage Veränderung auf die WebView.
Weitere Informationen siehe diesen alten post auf der WebKit-mailing-Liste.
Alternative zum zurückgeben eines neuen WebView und warten auf seine
loadRequest:
- Methode aufgerufen werden, landete ich überschreiben derwindow.open
Funktion in der WebView ist JSContext:Ersten, ich meine controller werden die WebFrameLoadDelegate der WebView:
Dann, in der delegate-Methode, ich überschrieb die
window.open
Funktion, und ich kann die URL verarbeitet dort statt.Diese lass mich die Anfrage, aber ich brauchte, um ohne die peinliche Notwendigkeit zur Schaffung zusätzlicher WebViews.