2008-12-15 12 views
34

Ich habe eine Seite mit einem document.onkeydown Event-Handler, und ich lade es in einem Iframe auf einer anderen Seite. Ich muss in den iframe klicken, damit die Inhaltsseite "zuhören" beginnt.Fokus auf Iframe-Inhalt setzen

Gibt es eine Möglichkeit, JavaScript auf der äußeren Seite zu verwenden, um den Fokus auf die innere Seite festzulegen, damit ich nicht in den Iframe klicken muss?

EDIT: Antwort auf Kommentar:

Der Kontext ist das Hauptfenster ist ein Licht-Box-ähnliches System, außer anstelle von Bildern, zeigt es iframes und jede iframe ist eine interaktive Seite mit keydown/mousemove- Handler . Diese Handler feuern nicht, bis ich nach dem Anzeigen der Light-Box-Sache in den iFrame klicke.

Ich bin eigentlich nicht so viel wie „enable Event-Handler auf dem iframe contentdocument“

+0

Können Sie mehr Kontext wurde angepasst geladen wird? Schreiben Sie im Hauptfenster und erwarten Sie, dass der Text (in der einen oder anderen Form) in Ihrem iframe erscheint? Dies ist relevant, da das Festlegen des Fokus in Ihrem Iframe die Benutzer beeinträchtigen würde, die im Hauptfenster tippen. – cLFlaVA

Antwort

45

Ich hatte ein ähnliches Problem mit der jQuery Thickbox (ein Lightbox-Stil-Dialog-Widget). Die Art, wie ich mein Problem behoben ist wie folgt:

function setFocusThickboxIframe() { 
    var iframe = $("#TB_iframeContent")[0]; 
    iframe.contentWindow.focus(); 
} 

$(document).ready(function(){ 
    $("#id_cmd_open").click(function(){ 
     /* 
     run thickbox code here to open lightbox, 
     like tb_show("google this!", "http://www.google.com"); 
     */ 
     setTimeout(setFocusThickboxIframe, 100); 
     return false; 
    }); 
}); 

Der Code scheint nicht ohne die setTimeout() zu arbeiten. Basierend auf meinen Tests funktioniert es in Firefox 3.5, Safari4, Chrome4, IE7 und IE6.

+0

bizarr aber wahr - es funktioniert wirklich nur mit dem setTimeout! go figure ... – artur

+0

Ich vermute, es ist, weil A: der iframe muss geladen werden und B: safari hat (hatte?) einen Fehler diesbezüglich und erfordert einen setTimeout von mindestens 1 – Quickredfox

+0

Danke für die Freigabe. Funktioniert super. –

6
document.getElementsByName("iframe_name")[0].contentWindow.document.body.focus(); 
+0

scheint nicht für mich zu arbeiten – Jimmy

+0

Eine kleine Variation dieser Lösung funktionierte in meinem Projekt. Meine Version war: 'this.iframe [0] .contentWindow.document.body.focus();' Aber ich musste es so ändern, um innerhalb des Plugins zu arbeiten, das ich verwende. –

4

auf „setFocus“ im traditionellen Sinn suchen Versuch Ereignisse im übergeordneten Dokument zu hören und das Bestehen der Veranstaltung ein Handler im iframe-Dokument.

0

Dies ist etwas, das für mich gearbeitet, obwohl es ein bisschen falsch riecht:

var iframe = ... 
var doc = iframe.contentDocument; 

var i = doc.createElement('input'); 
i.style.display = 'none'; 
doc.body.appendChild(i); 
i.focus(); 
doc.body.removeChild(i); 

hmmm. Es scrollt auch zum Ende des Inhalts. Ich denke, ich sollte die Dummy-Textbox oben einfügen.

15

Bei Verwendung der Methode contentWindow.focus() muss der Timeout wahrscheinlich darauf warten, dass der Iframe vollständig geladen wird.

Für mich auch Attribut onload="this.contentWindow.focus()" Arbeiten mit firefox, in das iframe-Tag

+0

Die Verwendung dieser Lösung in Kombination mit Jaimes Vorschlag unten hat mein Problem in mindestens Mozilla- und Webkit-Browsern gelöst. Prüfe immer noch IE ... –

1

Ich entdeckte, dass FF den Fokus Ereignis für iframe.contentWindow löst aber nicht für iframe.contentWindow.document. Chrome zum Beispiel kann beide Fälle behandeln. Also musste ich nur meine Event-Handler an iframe.contentWindow binden, damit die Dinge funktionieren. Vielleicht hilft das jemand ...

3

Ich hatte ein ähnliches Problem, wo ich versuchte, auf einen Txt-Bereich in einem iframe von einer anderen Seite geladen zu konzentrieren. In den meisten Fällen funktioniert es. Es gab ein Problem, bei dem in FF ausgelöst wurde, wenn der iFrame geladen wurde, aber bevor er sichtbar war. Der Fokus schien also nie richtig eingestellt zu sein.

ich arbeitete, um diesen mit einer simular Lösung Antwort des cheeming oben

var iframeID = document.getElementById("modalIFrame"); 
//focus the IFRAME element 
$(iframeID).focus(); 
//use JQuery to find the control in the IFRAME and set focus 
$(iframeID).contents().find("#emailTxt").focus(); 
1

Hier ist der Code ein iframe mit jQuery zu erstellen, fügen Sie es zu dem Dokument, abzufragen, bis es geladen ist, dann konzentrieren. Dies ist besser als ein willkürliches Timeout zu setzen, das funktioniert oder nicht, abhängig davon, wie lange der Iframe zum Laden benötigt.

var jqueryIframe = $('<iframe>', { 
    src: "http://example.com" 
}), 
focusWhenReady = function(){ 
    var iframe = jqueryIframe[0], 
    doc = iframe.contentDocument || iframe.contentWindow.document; 
    if (doc.readyState == "complete") { 
     iframe.contentWindow.focus(); 
    } else { 
     setTimeout(focusWhenReady, 100) 
    } 
} 
$(document).append(jqueryIframe); 
setTimeout(focusWhenReady, 10); 

Der Code zum Erfassen, wenn der iframe von Biranchi ‚s Antwort auf How to check if iframe is loaded or it has a content?