2013-03-01 21 views
9

nezaketsiz div benim entegrasyonu gibi Facebook'u uygulamak üzereyim nerede '$' ve 'a' gibi bir karakter pop-up olması gereken bir otomatik öneriye ihtiyacım varsa karnaval pozisyonumun yakınında.javascript içinde caret konumundan önceki son karakteri al

Son konum karakterini, IE ve Diğer tarayıcılar için JavaScript konumundayken, düzeltme yapmadan önce nasıl öğreneceğimi bilmem gerekiyor. JQuery kütüphanesine erişimim var.

(function($) { 
    $.fn.getCursorPosition = function() { 
     var input = this.get(0); 
     if (!input) return; // No (input) element found 
     if ('selectionStart' in input) { 
      // Standard-compliant browsers 
      return input.selectionStart; 
     } else if (document.selection) { 
      // IE 
      input.focus(); 
      var sel = document.selection.createRange(); 
      var selLen = document.selection.createRange().text.length; 
      sel.moveStart('character', -input.value.length); 
      return sel.text.length - selLen; 
     } 
    } 
})(jQuery); 

eg. 
var caretPosition = $("#contenteditablediv").getCursorPosition(); 
var lastchar = getchar(caretposition -1);??? 
+1

Bu işlev dışı IE tarayıcılarda contenteditable elemanlar için çalışmaz. girişler ve textareas için. –

+0

evet, bunun sadece bir örnek olduğunu biliyorum .. caret pozisyonundan önceki son karakteri bulmak için başka bir yol önerebilir misin? – Anoop

cevap

20

İşte bunun nasıl yapılacağına dair bir örnek. Düzenlenebilir öğenin başında başlayan ve düzeltme yapmadan hemen önce sona eren bir aralık oluşturur, aralığın metnini alır ve bu aralığın son karakterini döndürür.

Demo: http://jsfiddle.net/MH5xX/

Kodu:

function getCharacterPrecedingCaret(containerEl) { 
    var precedingChar = "", sel, range, precedingRange; 
    if (window.getSelection) { 
     sel = window.getSelection(); 
     if (sel.rangeCount > 0) { 
      range = sel.getRangeAt(0).cloneRange(); 
      range.collapse(true); 
      range.setStart(containerEl, 0); 
      precedingChar = range.toString().slice(-1); 
     } 
    } else if ((sel = document.selection) && sel.type != "Control") { 
     range = sel.createRange(); 
     precedingRange = range.duplicate(); 
     precedingRange.moveToElementText(containerEl); 
     precedingRange.setEndPoint("EndToStart", range); 
     precedingChar = precedingRange.text.slice(-1); 
    } 
    return precedingChar; 
} 
+1

Merhaba, bir çekicilik gibi çalışır. Teşekkürler. Bir sorun daha var. Infragistics içerik editörü kullanıyorum. Yani IE'de bir div olacak ama Chrome'da iframe olacak. Iframe ile çalıştım ve çalışmıyor ... iframe'de nasıl bulacağımı söyler misin? Teşekkürler – Anoop

+0

@Anoop: "document" ve "window" referanslarını, belge ve pencere iframe. Çok zor olmamalı. –

+0

Teşekkürler. Benim için çalıştı. Iframe ile Chrome için window.getSelection yerine document.getElementById ('iframe_id'). ContentDocument.getSelection() kullandı. Ve range.setStart kullandım (containerEl.contentDocument.body, 0); range.setStart (containerEl, 0) insead; bir kez daha teşekkürler. bana bu bağlantı için herhangi bir çözüm önerebilirim [içerik önerilebilir bir divda caret konumunun yakınında bir otomatik öneri div gösterme] (http://stackoverflow.com/questions/15159692/how-to-show-an-auto -suggestion-div-near-the-caret-in-a-içerik-düzenlenebilir) – Anoop