Как получить выделенный текст из iframe с помощью javascript?
<html>
<body>
<script type="text/javascript">
function smth() {
if (document.getSelection) {
var str = document.getSelection();
if (window.RegExp) {
var regstr = unescape("%20%20%20%20%20");
var regexp = new RegExp(regstr, "g");
str = str.replace(regexp, "");
}
} else if (document.selection && document.selection.createRange) {
var range = document.selection.createRange();
var str = range.text;
}
alert(str);
}
</script>
<iframe id="my" width="300" height="225">
.....some html ....
</iframe>
<a href="#" onclick="smth();">AA</a>
</body>
</html>
с функцией smth
я могу получить выделенный текст из некоторого div, но он не работает с iframe.
любые идеи, как получить выделенный текст из iframe?
Ответы
Ответ 1
document.getSelection
На внешнем документе. Чтобы получить выбор документа в iframe, вам нужно взять внутренний документ:
var iframe= document.getElementById('my');
var idoc= iframe.contentDocument || iframe.contentWindow.document; // ie compatibility
idoc.getSelection()
Обратите внимание, что WebKit не поддерживает document.getSelection()
или document.selection
. Попробуйте заменить его на window.getSelection()
, который работает как в Firefox, так и в WebKit, но возвращает объект выбора (коллекцию/оболочку вокруг диапазонов), которая требует наложения строк:
var idoc= iframe.contentDocument || iframe.contentWindow.document;
var iwin= iframe.contentWindow || iframe.contentDocument.defaultView;
''+iwin.getSelection()
Я не уверен, что это за точка:
if (window.RegExp) {
var regstr = unescape("%20%20%20%20%20");
var regexp = new RegExp(regstr, "g");
str = str.replace(regexp, "");
}
RegExp
- базовый JavaScript, относящийся к самой ранней версии; он всегда будет там, вам не нужно нюхать его. URL-кодирование нескольких пространств совершенно не нужно. Вам даже не нужен RegExp как таковой, заменить строку можно следующим образом:
str= str.split(' ').join('');
Ответ 2
Вы не можете получить доступ к данным внутри iframe
из домена, отличного от вашего.
Это связано с То же правило происхождения.
Ответ 3
Вам нужно получить выделение из документа/окна в iframe.
function getIframeSelectionText(iframe) {
var win = iframe.contentWindow;
var doc = win.document;
if (win.getSelection) {
return win.getSelection().toString();
} else if (doc.selection && doc.selection.createRange) {
return doc.selection.createRange().text;
}
}
var iframe = document.getElementById("my");
alert(getIframeSelectionText(iframe));
Ответ 4
Следующий код вернет выделенный текст.
function getSelectedText(frameId) {
// In ExtJS use:
// var frame = Ext.getDom(frameId);
var frame = document.getElementById(frameId);
var frameWindow = frame && frame.contentWindow;
var frameDocument = frameWindow && frameWindow.document;
if (frameDocument) {
if (frameDocument.getSelection) {
// Most browsers
return String(frameDocument.getSelection());
}
else if (frameDocument.selection) {
// Internet Explorer 8 and below
return frameDocument.selection.createRange().text;
}
else if (frameWindow.getSelection) {
// Safari 3
return String(frameWindow.getSelection());
}
}
/* Fall-through. This could happen if this function is called
on a frame that doesn't exist or that isn't ready yet. */
return '';
}
Надеюсь, это поможет кому-то.
Ответ 5
Этот код работает во всех современных браузерах:
var iframe = document.getElementById('my');
var idoc = iframe.contentDocument || iframe.contentWindow.document; // ie compatibility
var text = idoc.getSelection().toString();