2013-12-13 5 views
2

Знаете ли вы самый эффективный способ выделить слово и добавить событие onmouseover?Выделите слова мышью над

У меня есть текст, и я хочу сделать somekind из поля объяснения слов, поэтому, когда пользователь наводил курсор на слово, я вызываю AJAX в словарь и показываю ему смысл.

У меня есть две идеи: 1) Прежде чем показывать текст, поместите каждое слово в <span onmouseon="my_foo("word");"> обертку. Например:

<span onmouseon="my_foo("Hello");">Hello</span>
<span onmouseon="my_foo("world");">world</span>

Но я думаю, что это будет серьезно перегрузить страницу.

2) Когда пользователь удерживает курсор более 0,5 секунды в одной области, я получаю координаты указателя, вычисляю, какое слово отображается (я не знаю, если это возможно) и выполняйте вызов AJAX.

Как вы думаете, лучше ли, проще код?

+0

Я не думаю, что 2 возможно из-за различий между рендеринга шрифтов в разных браузерах. вы никогда не узнаете, какое именно слово оно было. Я бы обернул все либо на стороне сервера. или onLoad обернуть все в промежутках. При наведении любого диапазона с этим классом возможен аякс-вызов –

+1

2. Но вы столкнетесь с проблемами для разных браузеров. Я реализовал такую ​​же функцию аннотации. Это было тяжело. для 1 есть лучший способ определения функции события, вы можете получить внутренний текст диапазона, поэтому вам не нужно помещать строку внутри каждого вызова. –

+0

Как насчет производительности в случае 1? Было ли это хорошо? Например, текст из 5000 слов. – Tigran

ответ

2

Первый выделить слово под курсором, то показать значение этого, проверьте мою скрипку: http://jsfiddle.net/shahe_masoyan/z7nkU/1/

HTML

<div> 
     <span>This text is a test text</span> 
    </div> 

код JavaScript

$('div').each(function() { 
    var $this = $(this); 
    $this.html($this.text().replace(/\b(\w+)\b/g, "<span>$1</span>")); 
}); 

$('div span').hover(
    function() { 
     $(this).css('background-color','#ffff66'); 
     alert(getTheMeaningOfTheWord($(this).html())); 
    }, 
    function() { 
     $(this).css('background-color',''); 
    } 
); 

function getTheMeaningOfTheWord(word){ 

    return word+' = theMeaning'; 
} 
+0

Нужно ли обновлять DOM или что-то еще. Я делал это как пробное: some И работа onmouseover, но не зависает. – Tigran

+0

вам не нужно ничего обновлять, вы запустили скрипку? – Shahe

+0

@Tigran вижу мой код в скрипке, у меня нет функции onmouseover на моем пролете – Shahe

1

Я думаю, что 1 является простым и может быть сделано таким образом:

Fiddle: http://jsfiddle.net/9d227/

HTML

<div id="yourDiv" style="Display: none;">your Text Here</div> 
<div id="yourActualDiv"></div> 

JQuery

var wordArray = $('#yourDiv').html().split(' '); 
var totalString = ""; 
for(var i=0;i<wordArray.length;i++) 
    totalString += "<span>" + wordArray[i] + " </span>"; 
$('#yourActualDiv').html(totalString); 
var ConcurrenyFlag = 0; 
$('#yourActualDiv span').mouseover(
    function() 
    { 
     if(ConcurrenyFlag == 0) 
     { 
      ConcurrenyFlag = 1; 
      // Your code here. 
      ConcurrenyFlag = 0; 
     } 
    } 
) 

Таким образом, вам нужно разместить текст только в yourDiv. Код javascript будет обрабатывать остальное для вас.
Надеюсь, это вам поможет.

ConcurrenyFlag поможет снизить нагрузку на клиента, так как будет выполняться только одна часть кода.

1

Что-то вроде этого должно делать что-то близкое к тому, что вы ищете.

$('.addWordDictionary').html('<span>'+$('.addWordDictionary').html().replace(/ {1,}/g, '</span> <span>')+'</span>'); 

Но, как вы сказали, это может быть интенсивным клиентом, особенно если текста много.

1

Я сделал этот материал : http://jsfiddle.net/wared/eAq9k/. Требуется текстовое поле и работает, кликнув вместо зависания. Более подробная информация о getCaret() здесь: https://stackoverflow.com/a/263796/1636522.

<textarea readonly>Lorem ipsum</textarea> 
textarea { 
    display: block; 
    width: 100%; 
    border: none; 
    resize: none; 
    outline: none; 
    margin: .5em 0; 
} 
$(function() { 
    var el = $('textarea'), 
     text = el.text(); 
    el.click(function() { 
     var i = getCaret(this), 
      w = getWord(text, i); 
     $('p').text(i + ' : "' + w + '"'); 
    }); 

    // https://stackoverflow.com/a/995374/1636522 

    el[0].style.height = '1px'; 
    el[0].style.height = 25 + el[0].scrollHeight + 'px'; 
}); 

function getWord(s, i) { 
    var r = /\s/g; 
    while (i && !r.test(s[--i])) {} 
    r.lastIndex = i && ++i; 
    return s.slice(i, (
     r.exec(s) || { index: s.length } 
    ).index); 
} 
Смежные вопросы