Problem mit Google Chrome und Javascript. Guru benötigt!
ich habe ein seltsames problem nur in Chrome mit einem iframe
aber die Arbeit in allen anderen gängigen browser.
das problem: Wenn ich in dem IFRAME und dann drücken Sie die Taste, um zu senden, es funktioniert gut, den Fokus wieder auf das IFRAME und der cursor BLINKT.
Aber wenn ich tippe und dann drücken Sie ENTER zum aufrufen des event-handler-Funktion, die den Fokus Rücken, sondern die cursor verschwinden. Und dann, wenn Sie gehen in ein anderes Fenster und dann zurück den cursor angezeigt. Dies geschieht nur in Chrome. Ich habe die Beispiel-Seite, um zu zeigen, das problem in Aktion. Klicken Sie auf den link unten, um zu sehen.
UPDATE: ich habe den code auch hier unten
var editorFrame = 'myEditor'
function addFrame() {
var newFrame = new Element('iframe', {
width: '520',
height: '100',
id: editorFrame,
name: editorFrame,
src: 'blank.asp',
class: 'myClass'
});
$('myArea').appendChild(newFrame);
window.iframeLoaded = function() {
//this is call-back from the iframe to be sure that is loaded, so can safety attach the event handler
var iframeDoc, UNDEF = "undefined";
if (typeof newFrame.contentDocument != UNDEF) {
iframeDoc = newFrame.contentDocument;
} else if (typeof newFrame.contentWindow != UNDEF) {
iframeDoc = newFrame.contentWindow.document;
}
if (typeof iframeDoc.addEventListener != UNDEF) {
iframeDoc.addEventListener('keydown', keyHandler, false);
} else if (typeof iframeDoc.attachEvent != UNDEF) {
iframeDoc.attachEvent('onkeydown', keyHandler);
}
};
}
function resetContent()
{
var myIFrame = $(editorFrame);
if (myIFrame) myIFrame.contentWindow.document.body.innerHTML='';
}
function setEditFocus()
{
var iFrame = document.frames ? document.frames[editorFrame] : $(editorFrame);
var ifWin = iFrame .contentWindow || iFrame;
ifWin.focus();
}
function send()
{
resetContent();
setEditFocus();
}
function keyHandler (evt) {
var myKey=(evt.which || evt.charCode || evt.keyCode)
if (myKey==13) {
if (!evt) var evt = window.event;
evt.returnValue = false;
if (Prototype.Browser.IE) evt.keyCode = 0;
evt.cancelBubble = true;
if (evt.stopPropagation) evt.stopPropagation();
if (evt.preventDefault) evt.preventDefault();
send();
}
}
In der HTML-Seite
<body onload="addFrame()">
<div id="myArea"></div>
<input id="myButton" type="button" value="click me to send [case 1]" onclick="send()">
Zu machen, mehr einfach zu verstehen, das problem habe ich erstellen Sie eine bestimmten Seite das problem zu reproduzieren mit voller Beispiel und Quelle enthalten.
Können Sie hier einsehen bei der Verwendung von Google Chrome:
Beispiel für das problem
Ich brauche wirklich Eure Hilfe, weil ich versucht dieses problem zu lösen, für viele Tage kein Glück. Und alle Vorschläge, Tipps und Lösung gut akzeptiert.
Vielen Dank im Voraus.
- Bitte erstellen Sie ein minimal-Beispiel, das reproduziert sich Ihrem eigentlichen problem, der ist klein genug, um Sie hier einfügen. Es ist schwer zu sehen, was Sie zu erreichen versuchen und was dein problem ist. 🙂
- Ops, ich war aber besser sehen das problem in der Aktion nicht? Btw ich poste hier den code zu 🙂
- das ist ziemlich hart -- OP gemacht ein sehr gutes Beispiel, das veranschaulicht das problem.
- In diesem Fall, wo ist Ihre Antwort? 🙂 Wenn das Beispiel entfernt wird, ist diese Frage bedeutungslos sein. Auch das Beispiel ist viel zu Komplex, um leicht verständlich zu sein.
- ich habe auch den code hier, aber sicher werden mehr leicht zu finden Sie auf der Seite für das problem reproduzieren. Ich denke, diese Website ist auch voll von Menschen, die helfen können, auch wenn scheinbar kann Komplex sein, wenn Nein, warum poste ich hier ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mir nicht wirklich sicher, was die Ursache des Problems ist, da gibt es Zeiten, wo Chrome wird geben Sie den Fokus auf das element korrekt, obwohl die meisten der Zeit es tut es nicht. Sie sollten nicht brauchen, um Wunsch zu konzentrieren, da der Fokus nicht verloren, wenn Sie die Taste drücken. Wenn Sie weglassen die
setEditFocus()
aufrufen, sollten Sie feststellen, dass es noch korrekt funktioniert alles, aber Chrome, die offenbar wird beleidigt, dass Sie entfernt haben alle Inhalte in den Körper.Wenn Sie
contenteditable
jeder browser legt dieinnerHTML
des iframe-Dokumentbody
element, um etwas anderes zu sein:Wenn Sie nicht erwarten, zu sehen, dass zusätzliche Sachen, wenn Sie analysieren den Inhalt später, möchten Sie vielleicht, um es zu entfernen bereits im Vorfeld
addFrame()
.War ich in der Lage zu "reparieren" das problem, indem Sie Folgendes tun:
Erste, aktualisieren Sie die event-handler so können wir zurück
false
in und vor der Oper von der Generierung der HTML-Code für Spaß, wenn wir rufengetSelection()
später...Edit: Entfernt die ursprüngliche Funktion zugunsten der neuen enthalten unten
Schließlich zurück
false
aus-Taste drücken-handler zu beheben, das Opera-Problem erwähnt.Ursprünglich hatte ich das getan, was syockit vorgeschlagen, aber ich fand es war dabei seltsam, die Dinge mit den Cursor-Größe, die in Chrome, die diese Methode scheint zu vermeiden (obwohl Firefox ist immer noch ein bisschen aus...). Wenn Sie nicht kümmern, dass die Einstellung der
innerHTML
werden nicht-leer ist wahrscheinlich eine einfachere Lösung.Beachten Sie auch, dass Sie sollten mit
className
stattclass
in das Objekt, das Sie passieren zunew Element()
, da der IE scheint zu überlegen, es ein reserviertes Wort und sagt, dass es ein syntax-Fehler.Bearbeiten: Nach dem spielen, um mit es, die folgende Funktion scheint zuverlässig zu funktionieren im IE8/Firefox/Chrome/Safari/Opera für Ihre mehr erweiterte test-Fall. Leider habe ich gehört Prototyp das browser-Erkennung, um Konto für die Oper, da, während alles gleich aussieht, so weit wie JavaScript angeht, das tatsächliche Verhalten verlangt verschiedenen code, der Konflikte mit den anderen Browsern, und ich war nicht in der Lage, einen besseren Weg finden, um Sie zu unterscheiden.
Hier ist die neue Funktion, die sich auf die editierbare Inhalte des iframe, und stellt sicher, dass, wenn es schon Inhalte gibt, ist, daß der Cursor bewegt wird, um das Ende des Inhalts:
Aktualisiert
setEditFocus()
(nun wirklich Nicht nötig, da du aber schon hast):function setEditFocus
. Also ich habe eine Bedingung alsif(Prototype.Browser.Gecko || Prototype.Browser.IE || Prototype.Browser.Opera) {ifWin.focus();} else {... your code}
Opera funktionieren nicht so gut btw 🙁 Vorschläge?http://under.bestqm.com/test/iframe2.asp
und versuchen, drücken Sie die Tasten in der Reihenfolge, die Sie werden sehen, dass der Fokus nicht funktionieren in FF (Taste 2). Btw, wenn drücken Sie die EINGABETASTE (als erstes problem) es funktioniert einwandfrei (sowohl in Chrome und FF), wie ich gewünscht und Dank deinem code. Das problem in diesem Fall ist, dass muss ich zu geben der Fokus in vielen Fällen auf den IFRAME wie das Beispiel mit der Schaltfläche 2.Wissen Sie, wie löste ich diese ein? In
resetContent()
ersetzen''
mit' '
:Wenn es funktioniert, gut. Fragen Sie nicht warum, obwohl, es könnte einer von diesen Webkit-Pannen mit Range-Objekt, einen bug-wenn man so will.
Nur schnell, können Sie versuchen, hinzufügen von Semikolons am Ende der Zeilen in Ihrem send () - Funktion? Und sehen, ob das funktioniert.