Как мне заставить window.getselection работать для поля ввода type = text - PullRequest
13 голосов
/ 22 февраля 2011

У меня есть спорный div, вот так:

<div id="test" contentEditable="true" style="width: 600px; height:300px;">Lorem ipsum dolor sit amet</div>

, для которого я использую следующий код:

<input type="button" value="Click me" onclick="alert(window.getSelection().focusOffset.toString());"></button>

Нажатие на кнопку, когда я перемещаю каретку в блоке, возвращает мне фактическое положение (смещение) каретки в блоке.

Проблема в том, что когда я заменяю contenteditable div на тип ввода = text или password, сохраняю свойство contenteditable = true и нажимаю на кнопку, я всегда получаю ноль. Почему это?

Спасибо за внимание.

Ответы [ 3 ]

13 голосов
/ 22 февраля 2011

В большинстве браузеров window.getSelection() работает только с выделенными элементами в текстовых узлах и элементами в документе.Он не применяется к тексту в элементах <input> и <textarea> (хотя в WebKit window.getSelection().toString() вернет выделенный текст в фокусированном текстовом вводе или текстовой области. См. http://jsfiddle.net/PUdaS/). Чтобы получить выделение во вводеиспользуйте входные свойства selectionStart и selectionEnd:

<input type="text" id="test" value="Some text">

<input type="button" value="Click me"
    onclick="alert(document.getElementById('test').selectionEnd);">

Обратите внимание, что IE вплоть до версии 8 включительно не поддерживает свойства selectionStart и selectionEnd требуется другое, более сложное решение * 1017. * IE также не поддерживает window.getSelection(), поэтому этот код будет работать во всех браузерах, которые поддерживает исходный код.

1 голос
/ 22 февраля 2011

Это будет в значительной степени зависеть от используемого вами браузера, так как это особенность дизайна браузера, а не JavaScript.

В вашем случае происходит, когда вы нажимаете <input type="button">, имея <div> выделено, <div> остается выделенным.Однако, когда вы нажимаете <input type="button">, когда подсвечены <input type="text"> или <textarea>, они теряют фокус, и выделение удаляется (таким образом, ваш код не работает).

Я бы поближе посмотрел натого, чего вы пытаетесь достичь, и подумайте над тем, чтобы переосмыслить то, как вы подходите к этой проблеме.

0 голосов
/ 22 февраля 2011

2 примечания:

<input... > тег не является тегом и должен быть соответственно закрыт как <input ... /> в противном случае вы должны использовать <button> тег (но не в целях соблюдения X-браузера)

Если вы не хотите вступать в неконечный сюжет, вы можете пересмотреть способ обработки своей точки зрения следующим образом: сохраните <div> как есть и запустите на нем событие DOM (вместо использования события onclick для тега).Если вы можете читать по-французски, я привел множество примеров здесь .Этот способ значительно тяжелее вашего первого, но гораздо более мощный впоследствии, так как вы можете запускать события, как вы хотите, в DOM, использовать функции обратного вызова и т. Д. *

Принцип заключается в следующем:
HTML-страница с одной стороны

<div id="test"...>Lorem..</div>  
<script src="..."/>  

Ненавязчивый код JavaScript с другой стороны

// your event handler here
function Dothisorthat(e) {
 // pop up the dom content or edit it or start an ajax request or whatever you need here
 return false;
}

// This is read in the third place  
function attacherAction() {
// Attach the action "Dothisorthat" on the event "onclick" occuring on your div "test"
id ='test'; // your div id
if (document.getElementById(id)) {
       zLink = document.getElementById(id);
       zLink.onclick = function() {
           Dothisorthat(this); // in your case, you can write a small function to pop up or edit the div content
       }
   }
}  
// This is read second
function addLoadEvent(func) {  
  var oldonload = window.onload;  
  if (typeof window.onload != 'function') {  
    window.onload = func;  
  } else {  
    window.onload = function() {  
      if (oldonload) {  
        oldonload();  
      }  
      func();
    }
  }
}  
    // This is read first
addLoadEvent(attacherAction);  

Надеюсь, что это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...