Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Почему скрипт работает в IE6 и не работает в opera и IE8? (https://javascript.ru/forum/css-html/5130-pochemu-skript-rabotaet-v-ie6-i-ne-rabotaet-v-opera-i-ie8.html)

msufx 18.09.2009 12:54

Почему скрипт работает в IE6 и не работает в opera и IE8?
 
function createLink() {
  if (!validateMode()) return;
 
  var isA = getEl("A",document.getElementById('Composition')[].contentWindow.selection.createRange().parentElement());
  var str=prompt("Введите адрес:", isA ? isA.href : "http:\/\/");
 
  if ((str!=null) && (str!="http://")) {
    if (document.getElementById('Composition')[].contentWindow.selection.type=="None") {
      Composition.focus();
      var sel=document.getElementById('Composition')[].contentWindow.selection.createRange();
      sel.pasteHTML("<A HREF=\""+str+"\">"+str+"</A> ");
      sel.select();
    }
    else formatC("CreateLink",str);
  }
  else document.getElementById('Composition')[].focus();
}
 
function createBR() {
  if (!validateMode()) return;
  var sel=document.getElementById('Composition').selection.createRange();
      sel.pasteHTML("<br>");
      sel.select();
 Composition.focus();
}


<table border="1" cellpadding="0" cellspacing="0" width="100%" bordercolor='#C0C0C0' bordercolordark='#FFFFFF'><tr><td>
<IFRAME class=Composition id=Composition width="100%" height=400 frameborder=0 name="Composition">
</IFRAME>
</td></tr></table>

Пробовал менять
Composition.document.selection.createRange();
на
document.getElementById('Composition').selection.c reateRange();

Результата ни какого.

Octane 18.09.2009 16:19

Геттер selection есть у объекта document, а не window.
По событию focus IE сбрасывает выделение.
Для других браузеров лучше использовать w3c-методы, подробнее здесь: http://fastcoder.org/articles/?aid=609

И не дублируйте темы.

msufx 18.09.2009 17:44

Спасибо за ответ и ссылочку.
Извиняюсь за дублёж, не знал как перепостить тему в другой раздел.
По сути вопроса:
изначально было так
Composition.document.selection.createRange()

Теперь попробую реализовать рекомендованными методами.

Octane 18.09.2009 17:55

var iframe = document.getElementById("Composition");
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

var sel = iframeDocument.selection;

…

msufx 18.09.2009 18:18

Для простоты пробую на функции createBR()
Мне кажется, что не происходит вставки HTML кода
sel.pasteHTML("<br>");

Результат работы функции в Опере нулевой.
function createBR() {
  if (!validateMode()) return;
var iframe = document.getElementById("Composition");
var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;
 
var sel = iframeDocument.selection;
      sel.pasteHTML("<br>");
      sel.select();
 iframe.focus();
}


Например пример, приведённый ниже, работает.
function formatC(what,opt) {
  if (!validateMode()) return;
  
  if (opt=="removeFormat") {
    what=opt;
    opt=null;
  }
   Composition.focus();
  if (opt==null) Composition.document.execCommand(what);
  else Composition.document.execCommand(what,"",opt);
  
  pureText = false;
  Composition.focus();
}

<DIV language=javascript class=cout title=Жирный onclick="formatC('bold');"><IMG class=Ico src="images/bold.gif"> </DIV>

Octane 18.09.2009 18:24

pasteHTML — метод объекта TextRange, а не selection

function createBR() {
	if(!validateMode()) return;

	var iframe = document.getElementById("Composition");
	var iframeDocument = iframe.contentDocument || iframe.contentWindow.document;

	var sel, range;

	if(браузер Internet Explorer) {
		sel = iframeDocument.selection;
		range = selection.createRange();
		range.pasteHTML("<br>");
		…
	} else {
		// для остальных браузеров
	}
}

msufx 18.09.2009 18:44

Читаю Вставка кода в текстовые поля для прочих браузеров, кроме ИЕ.
Только код слишком здоровый,вместо строчки в ИЕ.


Часовой пояс GMT +3, время: 07:28.