2010-02-06 18 views
10

Javascript'te bir sözdizimi-vurgulayıcı oluşturmak için içerik düzenlenebilir bir iframe kullanıyorum ve en önemli şeylerden biri kodu doğru girintilemektir.Webkit'teki seçme aralıkları (Safari/Chrome)

Aşağıdaki kod Firefox'ta sadece gerektiği gibi çalışır:

// Create one indent character 
var range = window.getSelection().getRangeAt(0); 
var newTextNode = document.createTextNode(Language.tabChar); 
range.insertNode(newTextNode); 
range.setStartAfter(newTextNode); 

Bir sekme kömürü oluşturur ve karakter sağ tarafına imleci hareket ettirir. Chrome ve Safari'de bir karakter eklenir ancak imleç sağa doğru hareket etmez.

Aralık nesnesini hem Chrome hem de Firefox'ta inceledim ve ardından Firefox'un aralık nesnesinin Chrome'dan çok daha zengin olduğunu fark ettim. Web aralığındaki aralık nesnesinin herhangi bir özelliğini bulamadım.

nasıl hem webkit ve Firefox için bu kod çalışması yapabilir?

Teşekkür ederiz!

cevap

23

Hem Firefox hem de WebKit Range nesneleri, DOM Range spec ile tamamen uyumludur. Firefox'un daha fazla özelliği varsa, Mozilla'nın kendi uzantıları olacaktır, ancak genellikle teknik özellik, ihtiyacınız olan her şeyi sağlar.

Neyse, sorun bunu değiştirdikten sonra dizi yeniden seçmek gerekir ki: Bu Safari'nin ilk sürümlerinde çalışmaz

// Create one indent character 
var sel = window.getSelection(); 
var range = sel.getRangeAt(0); 
var newTextNode = document.createTextNode(Language.tabChar); 
range.insertNode(newTextNode); 
range.setStartAfter(newTextNode); 
sel.removeAllRanges(); 
sel.addRange(range); 

Not çünkü onun (önceki sürüm 3'e, sanırım) Seçim nesnesi getRangeAt'u desteklemiyor. İhtiyacınız varsa bunu sağlayabileceğim bir çözüm var.

+0

Fantastik! Hem Firefox'ta hem de Chrome'da çalışıyor :) Teşekkürler! – Christoffer

+1

Dolayısıyla Firefox'ta range.setStartAfter() çağrısı, seçimi güncelleyecektir, selection.addRange() çağrısı gerekli değildir. Ancak krom, addRange() çağrısına ihtiyaç duyar. – maulik13

+1

@ maulik13: Bu doğru. Ancak, Firefox bunu yapan tek tarayıcıdır ve bu özellik hakkında bir şey söylemez, dolayısıyla genellikle 'addRange()' çağrısını bu incelikten bahsetmeden kullanmanızı öneririm. –