2010-02-09 14 views
5

Contenteditable kullanarak javascript'te gerçek zamanlı sözdizimi vurgulayıcı üzerinde çalışıyorum. İçeriği ayrıştırırken div metnini ayıkladım ve düzgün şekilde stil oluşturmak için regex desenlerini kullanıyorum. Sonra div'in innerHtml'sini ayrıştırılmış içeriğe ayarlıyorum. Ancak, bu imlecin ekrandan kaybolmasını sağlar.Seçme nesnesi, Chrome içeriğindeki garip davranıyor Olabilir öğe

İmleci sıfırlamak için bu işlevi oluşturdum ve Firefox'ta düzgün çalışıyor. Ancak Chrome'da imleç, yarı öngörülebilir bir şekilde hareket ediyor. Genellikle ayrıştırmadan önce doğru yer yerine belgede ilk boşlukta ayarlanır.

cc değişkeninde saklanan caret char, olması gereken yerde. Bu işlevleri çağıran yaklaşık

/** 
* Put cursor back to its original position after every parsing, and 
* insert whitespace to match indentation level of the line above this one. 
*/ 
findString : function() 
{ 
    cc = '\u2009'; // carret char 

    if (self.find(cc)) 
    { 
     var selection = window.getSelection(); 
     var range = selection.getRangeAt(0); 

     if (this.do_indent && this.indent_level.length > 0) 
     { 
      var newTextNode = document.createTextNode(this.indent_level); 
      range.insertNode(newTextNode); 
      range.setStartAfter(newTextNode); 

      this.do_indent = false; 
     } 

     selection.removeAllRanges(); 
     selection.addRange(range); 
    } 
} 

Bazı gerçekler: Ben imleci genellikle yerine belgenin sonuna gider innerHTML içeriğini anahtarları kodu yorumsuz

  • .
  • Eğer findString() çağrıcısından rahatsızlık duyarsam, ayrıştırma tamamlanır, ancak imleç div'a tekrar odaklanana kadar imleç kaybolur.
  • Her iki satırdan da rahatsızlık duyarsam, div ayrıştırma dışında, beklendiği gibi davranır.

Firefox'ta çalışırken Chrome'da bu yanlış davranışa neden olan nedir?

DÜZENLEME: window.getSelection bazı günlüğü yapıyordu

fazla bilgi() ve Chrome ve Firefox karşılaştırırken farklı bilgiler içerdiğini fark ettim. Komutun yapması gerektiği gibi davrandı, ama yanlış olan bir argümanla.

gerçekten garip şey keyhandler senaryonun ilk eylem olarak() window.getSelection oturum açtığınızda böyle davranır ki: herhangi bir değişiklik olmadan

  • ben "yanlış" nesne olsun.
  • Console.log() yönergesinin hemen altında bulunan bir kesme noktasıyla, komut dosyası duraklar ve günlüğe, yalnızca istediğim şekilde "doğru" bir nesne gösterilir.

logger:

console.log(window.getSelection()); 
// Do keyhandling stuff... 
+0

Bu soruya kafam karıştı. Metinde bu "\ u2009" karakterini bulmaya çalışmak amacı nedir? 'FindString' tam olarak ne yapması gerekiyordu ve bunu yapmak nasıl başarısız oluyor? Sorunu yeniden oluşturmak için burada yeterli bilgi olduğunu sanmıyorum. –

+0

Uygulama, buraya gönderebileceğimden çok daha fazla koddur, ancak temel olarak akış şu şekildedir: Kullanıcı bir şeyi yazdığında, tuşa bağlı olarak ne yapacağını belirleyen keyHandler() tarafından yakalanır. Bir "vurgulama tuşu" ise, sözdizimiHighlight() çağrılır.Bu işlev, geçerli konumda "\ u2009" ekler ve 8000 karakterden fazla olmayan bir kod uzunluğu elde etmek için "\ u2009" karakterini orta konum olarak kullanan bölme içeriğini() böler. uzun. Daha sonra içerik ayrıştırılır ve değiştirilir. Daha sonra findString() imleci sıfırlar. – Christoffer

+0

İlk: 'setTimeout (func, 0) 'ı denediniz mi? Asla bilemezsiniz ... İkinci olarak, sorununuzu yeniden üreten kodunuzu azaltmanız gerekebilir. – Hemlock

cevap

1

deneyin orijinal aralığının bir kopyasını yapmak ve aralık dinamik sınırları olabilir, çünkü seçim ziyade işlevi sonunda orijinal aralık eklemek için ve "yanlış" olanı geri alacaksınız.