2013-02-25 4 views
2

Есть ли событие для завершения выбора текста на iOS?Конец события выбора текста?

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

document.addEventListener("selectionchange", function(event) { 
     var text = window.getSelection().toString(); 
     $(".output").append("<div>" + text + "</div>"); 
}, false); 

<div class="output"></div> 

Это обновит .output с выделенным текстом, но работает каждый раз, когда изменения выбора. То, что я хотел бы, - это только захват текста после завершения выбора.

Есть ли такое событие? Можно ли сделать что-то подобное?

ответ

1

Как насчет привязки события mouseup?

JAVASCRIPT:

document.addEventListener("mouseup", function(event) { 
     var text = window.getSelection().toString(); 
    $(".output").append("<div>" + text + "</div>"); 
}, false); 

DEMO: http://jsfiddle.net/dirtyd77/yTMwu/66/

+0

Нет, 'mouseup' не срабатывает, когда палец покидает экран на iOS. – Charlie

+0

Как насчет 'touchhend'? – Dom

+1

Я желаю: \ Если бы вы выбрали текст, то отпустите палец, 'touchhend' не вызывается. Если, однако, вы затем нажмите где-то в пределах выбора, он вызывает 'touchhend'. – Charlie

4

Подобно вам я не нашел хорошее решение для этой проблемы, поэтому я решил создать обходной путь. это не самый красивый, но он работает.

Я создал функцию тайм-аута и привязал ее к событию onselectionchange. Каждый раз, когда событие запускается, я проверяю, работает ли мой тайм-аут, и если это так, я удаляю его и создаю новый.

Когда тайм-аут завершен, пользовательское событие «selectionEnd» уволено.

// bind selection change event to my function 
document.onselectionchange = userSelectionChanged; 

function userSelectionChanged() { 

    // wait 500 ms after the last selection change event 
    if (selectionEndTimeout) { 
     clearTimeout(selectionEndTimeout); 
    } 

    selectionEndTimeout = setTimeout(function() { 
     $(window).trigger('selectionEnd'); 
    }, 500); 
} 

$(window).bind('selectionEnd', function() { 

    // reset selection timeout 
    selectionEndTimeout = null; 

    // TODO: Do your cool stuff here........ 

    // get user selection 
    var selectedText = getSelectionText(); 

    // if the selection is not empty show it :) 
    if(selectedText != ''){ 
     // TODO: Do something with the text 
    } 
}); 

DEMO: http://jsfiddle.net/dimshik/z8Jge/

Я написал небольшой пост об этом в своем блоге: http://www.dimshik.com/end-of-text-selection-event-on-ios-workaround/

+2

Интересно ... Интересно, будет ли в любом случае регистрироваться только один раз, когда палец будет выпущен с экрана. На данный момент это будет работать, когда выбор перестанет меняться, но не тогда, когда палец полностью завершил выбор. – Charlie

1

Я также сталкиваются с этой проблемой, так как я не нашел хорошее решение это моя обходной путь.
Он запустит событие selectionEnd, когда пользователь подтвердит свой выбор, нажав кнопку подтверждения/возврата в мобильном браузере Буфер обмена.

var longpress = false; 
var longpressTimer = null; 
var loop = null; 
var latestSelection = null; 

window.ontouchstart = function(){ 
    longpressTimer = setTimeout(function(){ 
     longpress = true; 
     loop = setInterval(getSelection, 200); 
    }, 500) 
}; 

window.ontouchend = function(){ 
    if(longpressTimer){ 
     clearTimeout(longpressTimer); 
    } 
    longpress = false; 
} 

var getSelection = function(){ 
    var s = window.getSelection(); 
    if(s.rangeCount > 0){ 
     latestSelection = s.getRangeAt(0); 
    }else{ 
     clearInterval(loop); 
     var selEndEvent = new CustomEvent("selectionEnd", {"detail": latestSelection}); 
     window.dispatchEvent(selEndEvent); 
    } 
} 

Когда выполняется длительное нажатие, он начинает интервал, чтобы контролировать выбор. Затем пользователь подтверждает свой выбор, и буфер обмена автоматически удаляет его; который прерывает контур монитора и отправляет событие selectionEnd.
Вы можете получить доступ к последнему выбранному тексту в подробном свойстве.

Надеюсь получить некоторые новости об этой проблеме и получить лучшее решение.