Предотвратить Safari от потери выделенного текста в теле при нажатии кнопки - PullRequest
3 голосов
/ 07 июля 2010

У меня есть приложение, которое передает любой выбранный основной текст на сервер text-2-voice (через ajax) при нажатии кнопки «Скажи это» в родительском окне;выделенный текст находится в фрейме.

Выбор работает на Firefox 3.6 и IE 8, но не на Safari 5 (не пробовал никаких других; это наш список поддерживаемых браузеров).В Safari всякий раз, когда нажимается кнопка для выполнения функции, любой выбранный текст теряется.

Я пытался добавить это в mouseup для iframe презентации, найденного как решение для потери выбранного текста в элементе управления, но это не работает для выделенного текста в теле документа:

$("#the_presentation").mouseup(function(e){

  e.preventDefault();

});

Функция, которая ловит выделенный текст, такова:

function getSelectedText(){
//Grab selected text
var _txt = '';
var _selection = null;

if(window.getSelection){
  _txt = window.getSelection().toString();
}
else if(document.getSelection){ //deprecated in ff
  _txt = document.getSelection()+'';
}
else if(document.selection){
  _selection = document.selection.createRange();
  if(_selection != null && _selection.text )
  {
    _txt = _selection.text;
  }
}

  return _txt;
}

Спасибо за пониманиемогу предоставить!

* редактировать: я забыл упомянуть, что происходит только на Mac Safari - Windows Safari не имеет проблемы.

Ответы [ 2 ]

1 голос
/ 08 июля 2010

Почему бы не позвонить getSelectedText() при любых изменениях в выделении текста и сохранить его до нажатия кнопки.

В jQuery это будет выглядеть примерно так:

$(function(){
    var currentSelectedText = '';

    $(document.body).bind('keyup mouseup mousedown', function(){
        currentSelectedText = getSelectedText(); //your function from above
    });

    $('#the_form').submit(function(){
        makeAjaxCallForSpeech(currentSelectedText);
    });
});

(Примечание. Из вашего вопроса я не был уверен, что происходит с iFrames. Поэтому это решение не включает в себя настройку iFrame, о которой вы упомянули. Вам придется использовать ее для своих конкретных потребностей.)

0 голосов
/ 08 июля 2010

Если вы используете элемент <input> типа button, попробуйте сделать его невыбираемым, чтобы предотвратить его выбор при нажатии.Вы можете сделать это, используя CSS в большинстве браузеров и используя атрибут unselectable в IE.Я не знаю, сработает ли следующее, потому что у меня нет Safari на Mac.

<style type="text/css">
*.unselectable {
   -moz-user-select: none;
   -khtml-user-select: none;
   -webkit-user-select: none;
   user-select: none;
}
</style>

<input type="button" class="unselectable" unselectable="on" 
    onclick="alert(getSelectedText())">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...